【1056】圖形面積

#include<cstdio>
#include<algorithm>
#define LL long long 
#define MAXN 150
using namespace std;

//use of main
int n;
struct line
{
  LL lx,rx,y;
  int flag;
  line(){};
  line(LL _lx,LL _rx,LL _y,int _flag)
  {
    lx=_lx,rx=_rx,y=_y,flag=_flag;
  } 
  bool operator < (const line &tmp)const
  {
    return y<tmp.y;
  }  
}len[MAXN*2];  


//use of LCH
LL X[MAXN*2]={0};

//use of tree
struct tree
{
  LL sum;
  int flag;
  tree(){sum=flag=0;}
}use[MAXN*4];


inline int lc(int x){return x<<1;}
inline int rc(int x){return x<<1|1;}

void up(int x,int l,int r)
{
  if(use[x].flag>0)use[x].sum=X[r+1]-X[l];
  else if(l==r)use[x].sum=0;
  else use[x].sum=use[lc(x)].sum+use[rc(x)].sum;
}

void updata(int x,int l,int r,int op,int ed,int add)
{
  if(op<=l&&r<=ed)
  {
    use[x].flag+=add;
    up(x,l,r);        
    return ;                
  }     
  int mid=(l+r)>>1;
  if(op<=mid)updata(lc(x),l,mid,op,ed,add);
  if(ed>mid)updata(rc(x),mid+1,r,op,ed,add);
  up(x,l,r);
}

int find(LL x)
{
  int l=1,r=X[0];
  int mid=0;
  while(l<=r)
  {
    mid=(l+r)>>1;
    if(X[mid]==x)return mid;
    if(X[mid]<x)l=mid+1;
    else if(X[mid]>x)r=mid-1;   
  }
}

int main()
{
  int N;
  n=0;
  scanf("%d",&N);
  LL x1,x2,y1,y2;
  for(int i=1;i<=N;i++)
  {
    scanf("%I64d%I64d%I64d%I64d",&x1,&y1,&x2,&y2);
    if(x1<x2&&y1<y2)
    {
      len[++n]=line(x1,x2,y1,1);
      X[n]=x1;
      len[++n]=line(x1,x2,y2,-1);
      X[n]=x2;
    }
  }
  
  sort(X+1,X+n+1);
  sort(len+1,len+n+1);
  X[0]=1;
  for(int i=2;i<=n;i++)
    if(X[i]!=X[i-1])
      X[++X[0]]=X[i];
  
  LL ans=0;
  for(int i=1;i<n;i++)
  {
    LL l=find(len[i].lx);
    LL r=find(len[i].rx)-1;        
    updata(1,1,X[0],l,r,len[i].flag);
    ans+=use[1].sum*(len[i+1].y-len[i].y);
  }
  
  printf("%I64d\n",ans);
    
  //while(1);
  return 0;    
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章