有两种方法,第一种就是用两条扫描线扫出来然后求和,对于会wa的数据就是对扫描线排序的时候要注意,
第二中方法就扫一次然后求出连续区间的个事因为高就是连续区间的个数*2
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
const int MAXN=10000;
int sum[MAXN<<2],lazy[MAXN<<2];
struct Line{
int l,r,h;
int s;
Line(int _l,int _r,int _h,int _s)
{
l=_l;
r=_r;
h=_h;
s=_s;
}
bool operator <(struct Line &b)const{
if(h==b.h)
return s>b.s;
return h<b.h;
}
};
vector<int> vt1,vt1_1;
vector<Line> vt2,vt2_2;
void pushup(int cont,int l,int r,int rt)
{
if(lazy[rt]&&!cont) sum[rt]=vt1[r+1]-vt1[l];
else if(lazy[rt]&&cont) sum[rt]=vt1_1[r+1]-vt1_1[l];
else if(l==r) sum[rt]=0;
else sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void update(int cont,int L,int R,int c,int l,int r,int rt)
{
if(L<=l&&r<=R)
{
lazy[rt]+=c;
pushup(cont,l,r,rt);
return ;
}
int mid=(l+r)>>1;
if(L<=mid) update(cont,L,R,c,lson);
if(R>mid) update(cont,L,R,c,rson);
pushup(cont,l,r,rt);
}
int main()
{
int n;
while(cin>>n)
{
vt1.clear();
vt2.clear();
vt1_1.clear();
vt2_2.clear();
for(int i=0;i<n;i++)
{
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
vt1.push_back(a);
vt1.push_back(c);
vt2.push_back(Line(a,c,b,1));
vt2.push_back(Line(a,c,d,-1));
vt1_1.push_back(b);
vt1_1.push_back(d);
vt2_2.push_back(Line(b,d,a,1));
vt2_2.push_back(Line(b,d,c,-1));
}
sort(vt1.begin(),vt1.end());
sort(vt2.begin(),vt2.end());
vt1.erase(unique(vt1.begin(),vt1.end()),vt1.end());
int ans=0;
memset(sum,0,sizeof(sum));
memset(lazy,0,sizeof(lazy));
int now=0;
for(int i=0;i<vt2.size();i++)
{
int l=lower_bound(vt1.begin(),vt1.end(),vt2[i].l)-vt1.begin();
int r=lower_bound(vt1.begin(),vt1.end(),vt2[i].r)-vt1.begin()-1;
if(l<=r) update(0,l,r,vt2[i].s,0,vt1.size(),1);
ans+=abs(sum[1]-now);
now=sum[1];
}
sort(vt1_1.begin(),vt1_1.end());
sort(vt2_2.begin(),vt2_2.end());
vt1_1.erase(unique(vt1_1.begin(),vt1_1.end()),vt1_1.end());
memset(sum,0,sizeof(sum));
memset(lazy,0,sizeof(lazy));
now=0;
for(int i=0;i<vt2_2.size();i++)
{
int l=lower_bound(vt1_1.begin(),vt1_1.end(),vt2_2[i].l)-vt1_1.begin();
int r=lower_bound(vt1_1.begin(),vt1_1.end(),vt2_2[i].r)-vt1_1.begin()-1;
if(l<=r) update(1,l,r,vt2_2[i].s,0,vt1_1.size(),1);
ans+=abs(sum[1]-now);
now=sum[1];
}
printf("%d\n",ans);
}
return 0;
}
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
const int MAXN=22222;
int sum[MAXN<<2],lazy[MAXN<<2];
bool lbd[MAXN<<2],rbd[MAXN<<2];
int numseg[MAXN<<2];
struct Line{
int l,r,h;
int s;
Line(int _l,int _r,int _h,int _s)
{
l=_l;
r=_r;
h=_h;
s=_s;
}
bool operator <(struct Line &b)const{
if(h==b.h)
return s>b.s;
return h<b.h;
}
};
vector<Line> vt2;
void pushup(int l,int r,int rt)
{
if(lazy[rt])
{
sum[rt]=r+1-l;
lbd[rt]=1;
rbd[rt]=1;
numseg[rt]=2;
}
else if(l==r)
sum[rt]=lbd[rt]=rbd[rt]=numseg[rt]=0;
else
{
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
lbd[rt]=lbd[rt<<1];
rbd[rt]=rbd[rt<<1|1];
numseg[rt]=numseg[rt<<1]+numseg[rt<<1|1];
if(rbd[rt<<1]&&lbd[rt<<1|1]) numseg[rt]-=2;
}
}
void update(int L,int R,int c,int l,int r,int rt)
{
if(L<=l&&r<=R)
{
lazy[rt]+=c;
pushup(l,r,rt);
return;
}
int mid=(l+r)>>1;
if(L<=mid) update(L,R,c,lson);
if(R>mid) update(L,R,c,rson);
pushup(l,r,rt);
}
int main()
{
int n;
while(cin>>n)
{
vt2.clear();
int lbd1=100000;
int rbd1=-100000;
for(int i=0;i<n;i++)
{
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
lbd1=min(lbd1,a);
rbd1=max(rbd1,c);
vt2.push_back(Line(a,c,b,1));
vt2.push_back(Line(a,c,d,-1));
}
sort(vt2.begin(),vt2.end());
memset(sum,0,sizeof(sum));
memset(lazy,0,sizeof(lazy));
int ans=0;
int cur=0;
for(int i=0;i<vt2.size();i++)
{
update(vt2[i].l,vt2[i].r-1,vt2[i].s,lbd1,rbd1,1);
if(i!=vt2.size()-1) ans+=numseg[1]*(vt2[i+1].h-vt2[i].h);
ans+=abs(sum[1]-cur);
cur=sum[1];
}
printf("%d\n",ans);
}
return 0;
}