noip前最后一题 WA+RE
查看原帖
noip前最后一题 WA+RE
239832
sipu6174楼主2020/12/4 21:34
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define int long long
#define mid ((l+r)>>1)
#define ls k<<1
#define rs k<<1|1
using namespace std;
const int N=1e5+10;
int read(){
   int s=0,f=1;char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
   while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getchar();}
   return s*f;
}
int n,m,r,mod,v[N];
int head[N],to[N<<1],nxt[N<<1],e[N<<1],cnt=1;
void add(int u,int v){
   to[cnt]=v;
   nxt[cnt]=head[u];
   head[u]=cnt++;
}
int siz[N],f[N],d[N],son[N],seg[N],rev[N],top[N];
int tot;
void dfs1(int x,int fa,int dep){
   siz[x]=1; f[x]=fa; d[x]=dep;
   int maxn=-1,id=0;
   for(int i=head[x];i;i=nxt[i]){
      int y=to[i];
      if(y==fa) continue;
      dfs1(y,x,dep+1);
      siz[x]+=siz[y];
      if(siz[y]>maxn) maxn=siz[y],id=y;
   }son[x]=id;
}void dfs2(int x,int topf){
   seg[x]=++tot; rev[tot]=v[x]; top[x]=topf;
   if(!son[x]) return;
   dfs2(son[x],topf);
   for(int i=head[x];i;i=nxt[i]){
      int y=to[i];
      if(y==f[x]||y==son[x]) continue;
      dfs2(y,y);
   }
}
int c[N<<2],lz[N<<2];
void pushup(int k){c[k]=(c[ls]+c[rs])%mod;}
void Add(int k,int l,int r,int v){
   lz[k]+=v;
   c[k]+=(r-l+1)*v;
}void pushdown(int k,int l,int r){
   if(!lz[k]) return;
   Add(ls,l,mid,lz[k]);
   Add(rs,mid+1,r,lz[k]);
   lz[k]=0;
}void build(int k,int l,int r){
   if(l==r) {c[k]=rev[l];return;}
   build(ls,l,mid);
   build(rs,mid+1,r);
   pushup(k);
}void update(int k,int l,int r,int x,int y,int v){
   if(x<=l&&r<=y) return Add(k,l,r,v);
   pushdown(k,l,r);
   if(x<=mid) update(ls,l,mid,x,y,v);
   if(mid<y) update(rs,mid+1,r,x,y,v);
   pushup(k);
}int query(int k,int l,int r,int x,int y){
   if(x<=l&&r<=y) return c[k];
   pushdown(k,l,r); int sum=0;
   if(x<=mid) sum+=query(ls,l,mid,x,y);
   if(mid<y) sum+=query(rs,mid+1,r,x,y);
   return sum%mod;
}void updrange(int x,int y,int v){
   while(top[x]!=top[y]){
      if(d[top[x]]<d[top[y]]) swap(x,y);
      update(1,1,n,seg[top[x]],seg[x],v);
      x=f[top[x]];
   }
   if(d[x]>d[y]) swap(x,y);
   update(1,1,n,seg[x],seg[y],v);
}int qrange(int x,int y){
   int ans=0;
   while(top[x]!=top[y]){
      if(d[top[x]]<d[top[y]]) swap(x,y);
      ans+=query(1,1,n,seg[top[x]],seg[x]); ans%=mod;
      x=f[top[x]];
   }
   if(d[x]>d[y]) swap(x,y);
   ans=(ans+query(1,1,n,seg[x],seg[y]))%mod;
   return ans;
}void updson(int x,int v){update(1,1,n,seg[x],seg[x]+siz[x]-1,v);}
int qson(int x){return query(1,1,n,seg[x],seg[x]+siz[x]-1);}
signed main(){
   n=read(),m=read(),r=read(),mod=read();
   for(int i=1;i<=n;i++) v[i]=read();
   for(int i=1;i<n;i++) {
      int x=read(),y=read();
      add(x,y),add(y,x);
   }
   dfs1(r,0,1); dfs2(r,r);
   build(1,1,n);
   for(int i=1;i<=m;i++){
      int op=read();
      if(op==1) updrange(read(),read(),read());
      if(op==2) printf("%lld\n",qrange(read(),read()));
      if(op==3) updson(read(),read());
      if(op==4) printf("%lld\n",qson(read()));
   }
   return 0;
}
2020/12/4 21:34
加载中...