社区讨论

树套树10pts又WA又T求条

P3759[TJOI2017] 不勤劳的图书管理员参与者 3已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@m5cb8tid
此快照首次捕获于
2024/12/31 18:13
去年
此快照最后确认于
2025/11/04 12:08
4 个月前
查看原帖
条崩溃了
CPP
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define MAXN 300010
#define mod 1000000007
// By flyfreemrn
inline ll read(){
	ll x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=x*10+c-'0';
		c=getchar();
	}
	return x*f;
}
inline void write(ll x){
	if(x>9)write(x/10);
	putchar(x%10+'0');
}
struct node_sgt1{
	ll sum[MAXN*20],siz[MAXN*20],s[MAXN*20][2];
	ll idx;
	ll st[MAXN*20],tp;
	ll newnode(){
		ll now;
		if(tp)now=st[tp--];
		else now=++idx;
		s[now][0]=s[now][1]=sum[now]=siz[now]=0;
		return now;
	}
	void add(ll l,ll r,ll pos,ll &now,ll val){
		if(!now)now=newnode();
		sum[now]=(val+mod+sum[now])%mod;
		if(val>0)siz[now]++;
		else siz[now]--;
//		if(siz[now]<0){
//			cout<<now<<" "<<l<<" "<<r<<" "<<pos<<" "<<siz[now]<<endl;
//		}
		if(l==r){	
			if(!siz[now]){
				st[++tp]=now,now=0;
				s[now][0]=s[now][1]=sum[now]=siz[now]=0;
			}
			return;
		}
		ll mid=(l+r)/2;
		if(pos<=mid)add(l,mid,pos,s[now][0],val);
		else add(mid+1,r,pos,s[now][1],val);
		if(!siz[now]){
			st[++tp]=now,now=0;
			s[now][0]=s[now][1]=sum[now]=siz[now]=0;
		}
	}
	ll find(ll qsl,ll qsr,ll l,ll r,ll now){
		if(!now)return 0;
		if(l>=qsl&&r<=qsr)return sum[now];
		ll mid=(l+r)/2,ans=0;
		if(qsl<=mid)ans=(ans+find(qsl,qsr,l,mid,s[now][0]))%mod;
		if(qsr>mid)ans=(ans+find(qsl,qsr,mid+1,r,s[now][1]))%mod;
		return ans;
	}
	ll get(ll qsl,ll qsr,ll l,ll r,ll now){
		if(!now)return 0;
		if(l>=qsl&&r<=qsr)return siz[now];
		ll mid=(l+r)/2,ans=0;
		if(qsl<=mid)ans=(ans+get(qsl,qsr,l,mid,s[now][0]))%mod;
		if(qsr>mid)ans=(ans+get(qsl,qsr,mid+1,r,s[now][1]))%mod;
//		if(ans<0)cout<<qsl<<" "<<qsr<<" "<<ans<<endl;
		return ans;
	}
}sgt1;
struct node_sgt2{
	ll siz,l[MAXN*4],r[MAXN*4],rot[MAXN*4];
	void build(ll lz,ll rz,ll now){
		l[now]=lz,r[now]=rz;
		if(lz==rz)return;
		ll mid=(lz+rz)/2;
		build(lz,mid,now*2);
		build(mid+1,rz,now*2+1);
	}
	void add(ll pos,ll w,ll now,ll val){
		sgt1.add(1,siz,w,rot[now],val);
		if(l[now]==r[now])return;
		ll mid=(l[now]+r[now])/2;
		if(pos<=mid)add(pos,w,now*2,val);
		else add(pos,w,now*2+1,val);
	}
	ll find(ll qsl,ll qsr,ll x,ll y,ll now,ll p){
		if(l[now]>=qsl&&r[now]<=qsr){
//			cout<<sgt1.get(x,y,1,siz,rot[now])<<endl;
			return (sgt1.find(x,y,1,siz,rot[now])+sgt1.get(x,y,1,siz,rot[now])*p%mod)%mod;
		}
		ll mid=(l[now]+r[now])/2,ans=0;
		if(qsl<=mid)ans=(ans+find(qsl,qsr,x,y,now*2,p)+mod)%mod;
		if(qsr>mid)ans=(ans+find(qsl,qsr,x,y,now*2+1,p)+mod)%mod;
		return ans;
	}
}sgt2;
ll n,m,sum;
ll pos[MAXN],c[MAXN];
int main(){
	n=read(),m=read();
	sgt2.build(1,sgt2.siz=n,1);
	for(int i=1;i<=n;i++){
		pos[i]=read(),c[i]=read();
//		if(i>1)sum=(sum+sgt2.find(1,i-))
		sum=(sum+sgt2.find(1,i,pos[i],n,1,c[i]))%mod;
		sgt2.add(i,pos[i],1,c[i]);
	}
//	cout<<sum<<endl;
	for(int i=1;i<=n;i++){
		ll x=read(),y=read();
		sgt2.add(x,pos[x],1,-c[x]);
		sum=(ll)(sum+(ll)mod*2-(ll)sgt2.find(1,x,pos[x],n,1,c[x])-(ll)sgt2.find(x,n,1,pos[x],1,c[x]))%mod;
		sgt2.add(y,pos[y],1,-c[y]);
		sum=(ll)(sum+(ll)mod*2-(ll)sgt2.find(1,y,pos[y],n,1,c[y])-(ll)sgt2.find(y,n,1,pos[y],1,c[y]))%mod;
//		cout<<sum<<" ";

		swap(pos[x],pos[y]),swap(c[x],c[y]);

		sum=(ll)(sum+(ll)sgt2.find(1,x,pos[x],n,1,c[x])+(ll)sgt2.find(x,n,1,pos[x],1,c[x]))%mod;
//		cout<<sum<<" ";
		sgt2.add(x,pos[x],1,c[x]);
//		cout<<sgt2.find(1,y,pos[y],n,1,c[y])<<" ";
		sum=(ll)(sum+(ll)sgt2.find(1,y,pos[y],n,1,c[y])+(ll)sgt2.find(y,n,1,pos[y],1,c[y]))%mod;
		sgt2.add(y,pos[y],1,c[y]);
		cout<<sum<<endl;
	}
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...