样例过了,但一提交上去就惨不忍睹……
代码:
#include<bits/stdc++.h>
using namespace std;
int n,lx[1000001],ly[1000001],lxs,lys;
long long ans;
struct tree{
int l,r,m;
int cnt,len;
#define l(x) seg[x].l
#define r(x) seg[x].r
#define m(x) seg[x].m
#define cnt(x) seg[x].cnt
#define len(x) seg[x].len
}seg[1000001];
struct q{int x1,x2,y,num;}raw[1000001];
bool o(q x,q y){return x.y<y.y;}
void build(int x,int l,int r)
{
//cout<<x<<' '<<l<<' '<<r<<endl;
if(r-l==1)return;
l(x)=x*2;r(x)=x*2+1;m(x)=(l+r)/2;
build(l(x),l,m(x));
build(r(x),m(x),r);
}
void insert(int x,int l,int r,int L,int R,int num)
{
//cout<<x<<' '<<l<<' '<<r<<' '<<L<<' '<<R<<' '<<num<<endl;
if(l==L&&R==r) cnt(x)+=num;
else if(R<=m(x)&&l(x)) insert(l(x),l,m(x),L,R,num);
else if(L>=m(x)&&r(x)) insert(r(x),m(x),r,L,R,num);
else if(r-l!=1)
{
insert(l(x),l,m(x),L,m(x),num);
insert(r(x),m(x),r,m(x),R,num);
}
if(cnt(x)>0)len(x)=lx[r]-lx[l];
else len(x)=len(l(x))+len(r(x));
}
int main()
{
int x1,x2,y1,y2,x=1;
cin>>n;
for(int i=1;i<=n;i++)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
lx[i*2-1]=x1;lx[i*2]=x2;
ly[i*2-1]=y1;ly[i*2]=y2;
raw[i*2-1]={x1,x2,y1,1};
raw[i*2]={x1,x2,y2,-1};
}
sort(lx+1,lx+n*2+1);
lxs=unique(lx+1,lx+n*2+1)-lx-1;
sort(ly+1,ly+n*2+1);
lys=unique(ly+1,ly+n*2+1)-ly-1;
for(int i=1;i<=2*n;i++)
{
raw[i].x1=lower_bound(lx+1,lx+lxs+1,raw[i].x1)-lx;
raw[i].x2=lower_bound(lx+1,lx+lxs+1,raw[i].x2)-lx;
raw[i].y=lower_bound(ly+1,ly+lys+1,raw[i].y)-ly;
}
sort(raw+1,raw+2*n+1,o);
//for(int i=1;i<=lxs;i++)cout<<lx[i]<<' ';
//cout<<endl;
//for(int i=1;i<=lys;i++)cout<<ly[i]<<' ';
//cout<<endl;
//for(int i=1;i<=2*n;i++)
//cout<<raw[i].x1<<' '<<raw[i].x2<<' '<<raw[i].y<<' '<<raw[i].num<<endl;
build(1,1,2*n);
while(x<2*n)
{
do
{
//cout<<x<<endl;
insert(1,1,n*2,raw[x].x1,raw[x].x2,raw[x].num);
x++;
}while(raw[x].y==raw[x+1].y&&x<2*n);
//cout<<len(1)*(ly[raw[x].y]-ly[raw[x-1].y])<<' '<<len(1)<<' '<<(ly[raw[x].y]-ly[raw[x-1].y])<<endl;
ans+=len(1)*(ly[raw[x].y]-ly[raw[x-1].y]);
}
cout<<ans;
}
感觉自己的线段树写得比较玄学……
看记录输出十分玄学,甚至还有负数QAQ