sgu-319-Kalevich Strikes Back-线段树

来源:互联网 发布:淘宝客高佣金申请工具 编辑:程序博客网 时间:2024/05/18 03:28

线段树记录当前区间是哪一个长方形在覆盖。

然后根据每一条线更新线段树。

如果是左边的边,那么把区间更新成当前长方形。

否则,把区间更新成当前长方形的前驱。

#include<stdio.h>#include<iostream>#include<stdlib.h>#include<string.h>#include<algorithm>#include<vector>#include<math.h>#include<map>#pragma comment(linker, "/STACK:1024000000,1024000000")using namespace std;#define maxn 130000#define mem(a,b) (memset(a),b,sizeof(a))#define lmin 1#define rmax len#define lson l,(l+r)/2,rt<<1#define rson (l+r)/2+1,r,rt<<1|1#define root lmin,rmax,1#define now l,r,rt#define int_now int l,int r,int rt#define INF 99999999#define LL __int64#define mod 10007#define eps 1e-6#define zero(x) (fabs(x)<eps?0:x)struct list{    int x;    int y,yy;    int id;    friend bool operator <(const list &a,const list &b)    {       return a.x<b.x;    }}line[maxn];int cover[maxn*4];int pre[maxn];LL all[maxn];vector<int>vec[maxn];map<int,int>mp;int du[maxn];int len;void creat(){    memset(cover,0,sizeof(cover));}void push_down(int_now){    if(cover[rt]!=-1)    {        cover[rt<<1]=cover[rt<<1|1]=cover[rt];        cover[rt]=-1;    }}void updata(int ll,int rr,int x,int_now){    if(ll>r||rr<l)return;    if(ll<=l&&rr>=r)    {        if(x<0) cover[rt]=pre[-x];        else cover[rt]=x;        return;    }    push_down(now);    updata(ll,rr,x,lson);    updata(ll,rr,x,rson);}int query(int ll,int rr,int_now){    if(ll>r||rr<l)return -1;    if(cover[rt]!=-1)return cover[rt];    push_down(now);    int x=-1;    x=query(ll,rr,lson);    if(x==-1)x=query(ll,rr,rson);    return x;}void dfs(int x){    for(int i=0;i<vec[x].size();i++)    {        all[x]-=all[vec[x][i]];        dfs(vec[x][i]);    }}int main(){    int n;    LL W,H,x,xx,y,yy;    while(~scanf("%d",&n))    {        mp.clear();        scanf("%I64d%I64d",&W,&H);        int ls=0;        len=0;        du[0]=-1;        vec[0].clear();        all[0]=(LL)W*H;        for(int i=1;i<=n;i++)        {            vec[i].clear();            scanf("%I64d%I64d%I64d%I64d",&x,&y,&xx,&yy);            if(x>xx)swap(x,xx);            if(y>yy)swap(y,yy);            all[i]=(LL)(xx-x)*(yy-y);            line[i*2-1].x=x;line[i*2-1].id=i;            line[i*2-1].y=y;line[i*2-1].yy=yy;            line[i*2].x=xx;line[i*2].id=-i;            line[i*2].y=y;line[i*2].yy=yy;            du[++ls]=y;            du[++ls]=yy;        }        sort(du+1,du+ls+1);        sort(line+1,line+n*2+1);        for(int i=1;i<=ls;i++)        {            if(du[i]!=du[i-1])            {                mp[du[i]]=++len;                du[len]=du[i];            }        }        len--;        creat();        for(int i=1;i<=n*2;i++)        {            int l=mp[line[i].y];            int r=mp[line[i].yy];            if(line[i].id>0)            {                int x=query(l,r-1,root);                pre[line[i].id]=x;                vec[x].push_back(line[i].id);            }            updata(l,r-1,line[i].id,root);        }        dfs(0);        sort(all,all+n+1);        for(int i=0;i<=n;i++)        {            printf("%I64d",all[i]);            if(i!=n)printf(" ");            else printf("\n");        }    }    return 0;}


























0 0
原创粉丝点击