为啥这里的线段树修改后要马上pushup
查看原帖
为啥这里的线段树修改后要马上pushup
196899
lndjy楼主2020/11/21 20:53

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;
}
2020/11/21 20:53
加载中...