rt
复习板子时发现看不懂之前代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#define int long long
using namespace std;
int inline read()
{
int ans=0,f=1;
char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(isdigit(ch))
{
ans=ans*10+ch-'0';
ch=getchar();
}
return ans*f;
}
const int N=200005;
int n;
struct line
{
int l,r,h;
int val;
bool operator <(const line &p)
const{
return h<p.h;
}
}s[4*N];
struct tree
{
int l,r;
int sum;
int len;
}t[8*N];
int X[4*N];
int ans;
void build(int k,int l,int r)
{
t[k].l=l;t[k].r=r;
if(l==r) return;
int mid=(l+r)>>1;
build(k*2,l,mid);
build(k*2+1,mid+1,r);
}
void pushup(int k)
{
if(t[k].sum) t[k].len=X[t[k].r+1]-X[t[k].l];
else t[k].len=t[k*2].len+t[k*2+1].len;
}
void change(int k,int l,int r,int val)
{
if(X[t[k].r+1]<=l||X[t[k].l]>=r) return;
if(l<=X[t[k].l]&&X[t[k].r+1]<=r)
{
t[k].sum+=val;
pushup(k);
return;
}
change(k*2,l,r,val);
change(k*2+1,l,r,val);
pushup(k);
}
signed main()
{
n=read();
for(int i=1;i<=n;i++)
{
int a=read(),b=read(),c=read(),d=read();
X[2*i-1]=a;X[2*i]=c;
s[2*i-1]=(line){a,c,b,1};
s[2*i]=(line){a,c,d,-1};
}
n*=2;
sort(s+1,s+n+1);
sort(X+1,X+n+1);
int cnt=unique(X+1,X+n+1)-X-1;
build(1,1,cnt-1);
for(int i=1;i<n;i++)
{
change(1,s[i].l,s[i].r,s[i].val);
ans+=t[1].len*(s[i+1].h-s[i].h);
}
cout<<ans;
return 0;
}