HDU 1828 Picture (线段树扫描线求周长并 区间合并)

扫描线求每次的上下已有边长,同时区间合并记录边长的分布情况乘以高度差求出高度的变长


#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//#pragma comment(linker, "/STACK:1024000000,1024000000");

using namespace std;

#define INF 0x3f3f3f3f
#define maxn 400005

vectorv;
int cnt;
struct edge
{
    int l,r;
    int h;
    int tag;
    friend bool operator < (edge a,edge b)
    {
        return a.h>1;
    init(l,mid,2*k);
    init(mid,r,2*k+1);
}

inline void pushup(int k)
{
    if(T[k].add) T[k].sum=v[T[k].r]-v[T[k].l],T[k].lt=T[k].rt=1;
    else T[k].sum=T[2*k].sum+T[2*k+1].sum,T[k].lt=T[k].rt=0;
    if(T[k].add) T[k].num=1;
    else if(T[k].l+1==T[k].r) T[k].num=0;
    else
    {
        if(T[2*k].rt&&T[2*k+1].lt) T[k].num=T[2*k].num+T[2*k+1].num-1;
        else T[k].num=T[2*k].num+T[2*k+1].num;
        T[k].lt=T[2*k].lt;
        T[k].rt=T[2*k+1].rt;
    }
}

void Insert(int d,int l,int r,int k)
{
    if(T[k].l==l&&T[k].r==r)
    {
        T[k].add+=d;
        pushup(k);
        return ;
    }
    int mid=(T[k].l+T[k].r)>>1;
    if(r<=mid) Insert(d,l,r,2*k);
    else if(l>=mid) Insert(d,l,r,2*k+1);
    else
    {
        Insert(d,l,mid,2*k);
        Insert(d,mid,r,2*k+1);
    }
    pushup(k);
}

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF&&n)
    {
        v.clear();
        cnt=0;
        for(int i=0; i


你可能感兴趣的:(===数据结构===,线段树,区间合并)