题目大意:
求矩形并周长;
解题思路:
没啥思路,看着网上大牛写的,顺便练了下代码;
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define maxn 100010
#define L(a) (a)<<1
#define R(a) (a)<<1|1
struct Line{
int l,r,h,s;
Line(){}
Line(int a,int b,int c,int d):l(a),r(b),h(c),s(d){}
bool operator <(const Line &t)const{
if(h==t.h)
return s>t.s;
else
return h<t.h;
}
}line[maxn];
struct Node{
int lc,rc;
int l,r;
int cnt;
int len;
int num;
int mid()
{
return (lc+rc)>>1;
}
}node[maxn];
void pushup(int k)
{
if(node[k].cnt)
{
node[k].l=node[k].r=1;
node[k].len=node[k].rc-node[k].lc+1;
node[k].num=2;
}
else if(node[k].lc==node[k].rc)
node[k].len=node[k].num=node[k].l=node[k].r=0;
else
{
node[k].l=node[L(k)].l;
node[k].r=node[R(k)].r;
node[k].len=node[L(k)].len+node[R(k)].len;
node[k].num=node[L(k)].num+node[R(k)].num;
if(node[L(k)].r&&node[R(k)].l)
node[k].num-=2;
}
}
void create(int k,int l,int r)
{
node[k].lc=l;
node[k].rc=r;
node[k].l=node[k].r=node[k].cnt=node[k].len=node[k].num=0;
if(l==r)
return ;
int mid=node[k].mid();
create(L(k),l,mid);
create(R(k),mid+1,r);
}
void updata(int k,int l,int r,int op)
{
if(node[k].lc>=l&&node[k].rc<=r)
{
node[k].cnt+=op;
pushup(k);
return ;
}
int mid=node[k].mid();
if(l<=mid)
updata(L(k),l,r,op);
if(mid<r)
updata(R(k),l,r,op);
pushup(k);
}
int main()
{
int n;
while(~scanf("%d",&n))
{
int m=0;
int lc=10000,rc=-10000;
for(int i=0;i<n;i++)
{
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
lc=min(lc,a);
rc=max(rc,c);
line[m++]=Line(a,c,b,1);
line[m++]=Line(a,c,d,-1);
}
create(1,lc,rc);
sort(line,line+m);
int ret=0,last=0;
for(int i=0;i<m;i++)
{
if(line[i].l<line[i].r)
updata(1,line[i].l,line[i].r-1,line[i].s);
ret+=node[1].num*(line[i+1].h-line[i].h);
ret+=abs(node[1].len-last);
last=node[1].len;
}
printf("%d\n",ret);
}
}