调了好久,全wa!
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
const int N=1e5+20;
inline void swap(int &a,int &b){a^=b^=a^=b;}
inline int read(){
register int d=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){d=(d<<1)+(d<<3)+(ch^48);ch=getchar();}
return d*f;
}
inline int qpow(int a,int b,int p){
int res=1;b%=p-1;
while(b){
if(b&1) res=1ll*res*a%p;
a=1ll*a*a%p;
b>>=1;
}
return res;
}
int n;
int lazy[N<<4];
double s[N<<4];
struct Node{
double l,r,sum;
}tree[N<<4];
struct Point{
double x,y1,y2;
int flag;
}point[N<<4];
inline bool cmp(Point a,Point b){return a.x<b.x;}
inline void pushup(int rt){
if(lazy[rt]>0) tree[rt].sum=tree[rt].r-tree[rt].l;
else tree[rt].sum=tree[rt<<1].sum+tree[rt<<1|1].sum;
}
void build(int rt,int l,int r){
if(r-l<=1){
tree[rt].l=s[l];tree[rt].r=s[r];
tree[rt].sum=0;
return ;
}
int mid=(l+r)>>1;
tree[rt].l=s[l];tree[rt].r=s[r];
build(rt<<1,l,mid);
build(rt<<1|1,mid,r);
pushup(rt);
}
void update(int rt,double y1,double y2,int flag){
if(tree[rt].l==y1&&tree[rt].r==y2){
lazy[rt]+=flag;
pushup(rt);return ;
}
else{
if(tree[rt<<1].r>y1) update(rt<<1,y1,min(tree[rt<<1].r,y2),flag);
if(tree[rt<<1|1].l<y2) update(rt<<1|1,max(tree[rt<<1|1].l,y1),y2,flag);
pushup(rt);
}
}
signed main(){
n=read();
double x1,x2,y1,y2,ans=0;
for(int i=0;i<n;i++){
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
point[i].x=x1;point[i].y1=y1;point[i].y2=y2;point[i].flag=1;
point[i+n].x=x2;point[i+n].y1=y1;point[i+n].y2=y2;point[i+n].flag=-1;
s[i+1]=y1;s[i+n+1]=y2;
}
sort(s+1,s+(n<<1)+1);
sort(point,point+(n<<1),cmp);
build(1,1,(n<<1));
memset(lazy,0,sizeof(lazy));
update(1,point[0].y1,point[0].y2,point[0].flag);
for(int i=1;i<(n<<1);i++){
ans+=(point[i].x-point[i-1].x)*tree[1].sum;
update(1,point[i].y1,point[i].y2,point[i].flag);
}
printf("%.0f\n",ans);
return 0;
}
样例跑过去了