社区讨论

19分求调教❤,刚复健便遇滑铁卢之不应该在睡前打代码的😭😭😭

P3384【模板】重链剖分 / 树链剖分参与者 18已保存回复 25

讨论操作

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

当前回复
25 条
当前快照
1 份
快照标识符
@mhjgzdkw
此快照首次捕获于
2025/11/04 02:24
4 个月前
此快照最后确认于
2025/11/04 06:17
4 个月前
查看原帖
本来想随便复建一下,但是打完不知道错哪了,于是与题解核对,也没对出来。
另外不要想在睡前切个题(不然睡不着了)
1919 昏求调
C
#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){
   int f(1),x(0);
   char ch=getchar();
   for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1;
   for(;isdigit(ch);ch=getchar()) x=(x<<1)+(x<<3)+ch-48;
   return f*x;
}
inline void write(int x){
   if(x<0) putchar('-'),x=-x;
   if(x>9) write(x/10);
   putchar(x%10+'0');
}
const int N=1e5+5;
int n,m,r,p;
int head[N],nxt[N<<1],to[N<<1],tot;
inline void add(int x,int y){
   to[++tot]=y,nxt[tot]=head[x],head[x]=tot;
}
int Val[N];
int dep[N],siz[N],son[N],F[N];
inline void dfs1(int now,int fa){
   dep[now]=dep[fa]+1;
   siz[now]=1;
   F[now]=fa;
   for(register int i=head[now];i;i=nxt[i]){
       int y=to[i];
       if(y==fa) continue;
       dfs1(y,now);
       siz[now]+=siz[y];
       if(!son[now]||siz[y]>=siz[son[now]]){
           son[now]=y;
       }
   }
}
int top[N],in[N],cnt,P[N];
inline void dfs2(int now,int TOP){
   in[now]=++cnt;
   P[cnt]=now;
   top[now]=TOP;
   if(son[now]){
       dfs2(son[now],TOP);
   }
   for(register int i=head[now];i;i=nxt[i]){
       int y=to[i];
       if(y==F[now]||y==son[now]) continue;
       dfs2(y,y);
   }
}
int Sum[N<<2];
#define lid root<<1
#define rid root<<1|1
inline void pushup(int root){
   Sum[root]=(Sum[lid]+Sum[rid])%p;
   return;
}
inline void build(int root,int l,int r){
   if(l==r){
       Sum[root]=Val[P[l]];
       return ;
   }
   int mid=(l+r)>>1;
   build(lid,l,mid);
   build(rid,mid+1,r);
   pushup(root);
}
int lazy[N<<2];
inline void pushdown(int root){
   if(!lazy[root]) return;
   Sum[lid]+=siz[lid]*lazy[root];
   Sum[lid]%=p;
   Sum[rid]+=siz[rid]*lazy[root];
   Sum[rid]%=p;
   lazy[lid]+=lazy[root];
   lazy[rid]+=lazy[root];
   lazy[root]=0;
   return;
}
inline void change(int root,int l,int r,int L,int R,int V){
   if(L>R) swap(L,R);
   if(l>=L&&r<=R){
       Sum[root]=(Sum[root]+((V*siz[root])%p))%p;
       lazy[root]=(lazy[root]+V)%p;
       return;
   }
   pushdown(root);
   int mid=(l+r)>>1;
   if(L<=mid) change(lid,l,mid,L,R,V);
   if(R>mid) change(rid,mid+1,r,L,R,V);
   pushup(root);
}
inline int query(int root,int l,int r,int L,int R){
   if(L>R){swap(L,R);}
   if(l>=L&&r<=R){
       return Sum[root]%p;
   }
   pushdown(root);
   int mid=(l+r)>>1;
   int ss=0;
   if(L<=mid) ss=(ss+query(lid,l,mid,L,R))%p;
   if(R>mid) ss=(ss+query(rid,mid+1,r,L,R))%p;
   return ss%p;
}
inline void opt1(int x,int y,int V){
   while(top[x]!=top[y]){
       if(dep[top[x]]<dep[top[y]]) swap(x,y);
       // change(1,1,n,in[x],in[top[x]],V);
       change(1,1,n,in[top[x]],in[x],V);
       x=F[top[x]];
   }
   if(dep[x]>dep[y]) swap(x,y);
   change(1,1,n,in[x],in[y],V);
}
inline int opt2(int x,int y){
   int SB=0;
   while(top[x]!=top[y]){
       if(dep[top[x]]<dep[top[y]]) swap(x,y);
       // change(1,1,n,in[x],in[top[x]],V);
       SB=(SB+query(1,1,n,in[top[x]],in[x]))%p;
       x=F[top[x]];
   }
   if(dep[x]>dep[y]) swap(x,y);
   SB=(SB+query(1,1,n,in[x],in[y]))%p;
   return SB;
}
main(void){
   n=read(),m=read(),r=read(),p=read();
   for(register int i=1;i<=n;i++){
       Val[i]=read()%p;
   }
   for(register int i=1;i<=n-1;i++){
       int a=read(),b=read();
       add(a,b),add(b,a);
   }
   dfs1(r,0);
   dfs2(r,r);
   build(1,1,n);
   // for(register int i=1;i<=n;i++){
   //     cerr<<i<<"  :  "<<in[i]<<endl;
   // }
   while(m--){
       int opt=read();
       if(opt==1){
           int x=read(),y=read(),z=read();
           opt1(x,y,z);
       }
       else if(opt==2){
           int x=read(),y=read();
           write(opt2(x,y)),puts("");
       }
       else if(opt==3){
           int x=read(),z=read();
           change(1,1,n,in[x],in[x]+siz[x]-1,z);
       }
       else if(opt==4){
           int x=read();
           write(query(1,1,n,in[x],in[x]+siz[x]-1)%p),puts("");
       }
   }
   return 0;
}

回复

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

正在加载回复...