社区讨论
树套树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 条回复,欢迎继续交流。
正在加载回复...