萌新求助P1884
查看原帖
萌新求助P1884
383667
zhaotianle123楼主2020/10/22 00:01

RT

#include <cstdio>
#include <algorithm>
using namespace std;
const int N=2E5+5;
int n,xl,yl,xr,yr,tot,y[N];
struct Line{
	int yl,yr,x,in;
}line[N];
bool cmp(const Line& a,const Line& b)
{
	return a.x<b.x;
}
struct Node{
	int l,r,cnt,len;
}t[N*4];
void build(int root,int l,int r)
{
	t[root].l=l,t[root].r=r;
	if(l==r)return;
	int mid=(l+r)>>1;
	build(root*2,l,mid);
	build(root*2+1,mid+1,r);
}
inline void pushup(int root)
{
	if(t[root].cnt)t[root].len=y[t[root].r+1]-y[t[root].l];
	else if(t[root].l==t[root].r)t[root].len=0;
	else t[root].len=t[root*2].len+t[root*2+1].len;
}
void modify(int root,int l,int r,int v)
{
	if(t[root].l>=l&&t[root].r<=r)
	{
		t[root].cnt+=v;
		pushup(root);
		return;
	}
	int mid=(t[root].l+t[root].r)>>1;
	if(l<=mid)modify(root*2,l,r,v);
	if(r>mid)modify(root*2+1,l,r,v);
	pushup(root);
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d %d %d %d",&xl,&yl,&xr,&yr);
		y[++tot]=yl;
		line[tot].yl=yl,line[tot].yr=yr,line[tot].x=xl,line[tot].in=1;
		y[++tot]=yr;
		line[tot].yl=yl,line[tot].yr=yr,line[tot].x=xr,line[tot].in=-1;
	}
	n=tot;
	sort(line+1,line+1+n,cmp);
	sort(y+1,y+1+tot);
	tot=unique(y+1,y+1+tot)-(y+1);
	long long ans=0;
	build(1,1,tot-1);
	for(int i=1;i<n;i++)
	{
		int l=lower_bound(y+1,y+1+tot,line[i].yl)-y;
		int r=lower_bound(y+1,y+1+tot,line[i].yr)-y;
		modify(1,l,r-1,line[i].in);
		ans+=(long long)t[1].len*(line[i+1].x-line[i].x);
	}
	printf("%lld",ans);
}

w7q7

2020/10/22 00:01
加载中...