結果
問題 | No.2342 Triple Tree Query (Hard) |
ユーザー | vjudge1 |
提出日時 | 2024-10-16 09:56:13 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 4,988 bytes |
コンパイル時間 | 3,303 ms |
コンパイル使用メモリ | 218,044 KB |
実行使用メモリ | 64,512 KB |
最終ジャッジ日時 | 2024-10-16 09:56:38 |
合計ジャッジ時間 | 23,327 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | WA | - |
testcase_01 | WA | - |
testcase_02 | RE | - |
testcase_03 | RE | - |
testcase_04 | RE | - |
testcase_05 | RE | - |
testcase_06 | RE | - |
testcase_07 | RE | - |
testcase_08 | RE | - |
testcase_09 | RE | - |
testcase_10 | RE | - |
testcase_11 | RE | - |
testcase_12 | RE | - |
testcase_13 | RE | - |
testcase_14 | RE | - |
testcase_15 | RE | - |
testcase_16 | RE | - |
testcase_17 | RE | - |
testcase_18 | RE | - |
testcase_19 | RE | - |
testcase_20 | RE | - |
testcase_21 | RE | - |
testcase_22 | RE | - |
testcase_23 | RE | - |
testcase_24 | RE | - |
testcase_25 | RE | - |
testcase_26 | RE | - |
testcase_27 | RE | - |
testcase_28 | RE | - |
testcase_29 | RE | - |
testcase_30 | RE | - |
testcase_31 | RE | - |
testcase_32 | RE | - |
testcase_33 | RE | - |
testcase_34 | RE | - |
testcase_35 | RE | - |
testcase_36 | RE | - |
testcase_37 | RE | - |
ソースコード
#include<bits/stdc++.h> #define mkp(x,y) make_pair(x,y) #define Add(x,y) (x+y>=mod)?(x+y-mod):(x+y) #define lowbit(x) x&(-x) #define pi pair<ll,ll> #define pii pair<ll,pair<ll,ll>> #define iip pair<pair<ll,ll>,ll> #define ppii pair<pair<ll,ll>,pair<ll,ll>> #define fi first #define se second #define full(l,r,x) for(auto it=l;it!=r;it++) (*it)=x #define Full(a) memset(a,0,sizeof(a)) #define open(s1,s2) freopen(s1,"r",stdin),freopen(s2,"w",stdout); #define For(i,l,r) for(int i=l;i<=r;i++) #define _For(i,l,r) for(int i=r;i>=l;i--) using namespace std; typedef double db; typedef unsigned long long ull; typedef long long ll; const ll N=1e5+10,M=12,mod=998244353; 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<<1)+(x<<3)+(c^48); c=getchar(); } return x*f; } inline void write(ll x){ if(x<0){ putchar('-'); x=-x; } if(x>9) write(x/10); putchar(x%10+'0'); } struct Fun{ int k,b; Fun(ll _k=1,ll _b=0){ k=_k; b=_b; } inline void operator=(pi rhs){ k=rhs.fi; b=rhs.se; } inline bool operator==(const pi&rhs)const{ return k==rhs.fi&&b==rhs.se; } inline bool operator!=(const pi rhs)const{ return !(*this==rhs); } inline friend Fun operator+(Fun A,Fun B){ Fun ans; ans.k=1ll*A.k*B.k%mod; ans.b=(1ll*B.k*A.b%mod+B.b)%mod; return ans; } inline friend Fun operator+=(Fun &a,const Fun &b){ return a=a+b; } }; int c,n,q,op,x,y,k,b,r,cnt; int a[N],z[N],t[N],fa[N],id[N],dep[N],siz[N],dfn[N]; vector<int> E[N]; class Tree{ public: struct Node{ int l,r; int Min; Fun tag[M]; }X[N<<2]; inline void build(int k,int l,int r){ X[k].l=l,X[k].r=r; if(l==r){ X[k].Min=dep[id[l]]; X[k].tag[0]=mkp(0,a[id[l]]); return ; } int mid=(l+r)>>1; build(k<<1,l,mid); build(k<<1|1,mid+1,r); X[k].Min=min(X[k<<1].Min,X[k<<1|1].Min); } inline void add(int k,int d,Fun v){ if(d<X[k].Min) return ; X[k].tag[d-X[k].Min]+=v; } inline void push_down(int k){ For(i,0,10){ if(X[k].tag[i]!=mkp(1,0)){ add(k<<1,X[k].Min+i,X[k].tag[i]); add(k<<1|1,X[k].Min+i,X[k].tag[i]); X[k].tag[i]=Fun(); } } if(X[k].tag[11]!=mkp(1,0)){ ll x=max(0,X[k].Min+11-X[k<<1].Min); For(i,x,M-1) X[k<<1].tag[i]+=X[k].tag[11]; x=max(0,X[k].Min+11-X[k<<1|1].Min); For(i,x,M-1) X[k<<1|1].tag[i]+=X[k].tag[11]; X[k].tag[11]=Fun(); } } inline void update(int k,int l,int r,int d,Fun v){ if(X[k].l==l&&r==X[k].r){ if(d==-1){ For(i,0,M-1) X[k].tag[i]=X[k].tag[i]+v; } else add(k,d,v); return ; } push_down(k); int mid=(X[k].l+X[k].r)>>1; if(r<=mid) update(k<<1,l,r,d,v); else if(l>mid) update(k<<1|1,l,r,d,v); else{ update(k<<1,l,mid,d,v); update(k<<1|1,mid+1,r,d,v); } } inline int query(int k,int i){ if(X[k].l==i&&i==X[k].r) return X[k].tag[0].b; push_down(k); ll mid=(X[k].l+X[k].r)>>1; if(i<=mid) return query(k<<1,i); else return query(k<<1|1,i); } }T; inline void add(int u,int v){ E[u].push_back(v); E[v].push_back(u); } inline void dfs1(int u,int f){ siz[u]=1; for(auto v:E[u]){ if(v==f) continue; fa[v]=u; dep[v]=dep[u]+1; dfs1(v,u); siz[u]+=siz[v]; if(siz[v]>siz[z[u]]) z[u]=v; } } inline void dfs2(int u,int k){ dfn[u]=++cnt; id[cnt]=u; t[u]=k; if(!z[u]) return ; dfs2(z[u],k); for(auto v:E[u]){ if(v==fa[u]||v==z[u]) continue; dfs2(v,v); } } inline void update(int x,int y,Fun v){ while(t[x]!=t[y]){ if(dep[t[x]]<dep[t[y]]) swap(x,y); //cerr<<x<<' '<<y<<'\n'; T.update(1,dfn[t[x]],dfn[x],-1,v); x=fa[t[x]]; } if(dep[x]>dep[y]) swap(x,y); T.update(1,dfn[x],dfn[y],-1,v); } //inline void dfs(ll u,ll fa,ll r,Fun t){ // T.update(1,dfn[u],dfn[u],t); // if(!r) // return ; // for(auto v:E[u]){ // if(v==fa) // continue; // dfs(v,u,r-1,t); // } //} void get(int x,int y,int k,int b){ while(x&&y>=0){ if(fa[x]&&y>1){ T.update(1,dfn[x],dfn[x]+siz[x]-1,dep[x]+y,{k,b}); T.update(1,dfn[x],dfn[x]+siz[x]-1,dep[x]+y-1,{k,b}); // tag[k][x]=(tag[k][x]+b)%mod; // tag[k-1][x]=(tag[k-1][x]+b)%mod; } else{ For(i,0,y) T.update(1,dfn[x],dfn[x]+siz[x]-1,dep[x]+i,{k,b}); // tag[i][x]=(tag[i][x]+b)%mod; } x=fa[x]; y--; } } int main(){ // open("A.in","A.out"); n=read(),q=read(); For(i,1,n-1) add(read(),read()); For(i,1,n) a[i]=read(); dfs1(1,1); dfs2(1,1); T.build(1,1,n); // For(i,1,n){ // //cerr<<i<<"->"<<dfn[i]<<'\n'; // } while(q--){ op=read(),x=read(); //cerr<<"Yes"<<' '<<op<<'\n';; if(op==1){ write(T.query(1,dfn[x])); putchar('\n'); } else if(op==2){ y=read(),k=read(),b=read(); update(x,y,{k,b}); } else if(op==3){ k=read(),b=read(); T.update(1,dfn[x],dfn[x]+siz[x]-1,-1,{k,b}); } else{ r=read(),k=read(),b=read(); // if(c==6) get(x,r,k,b); // else // dfs(x,0,r,{k,b}); } } return 0; }