제출 #1319965

#제출 시각아이디문제언어결과실행 시간메모리
1319965user736482Sumtree (INOI20_sumtree)C++20
100 / 100
417 ms115200 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define pii pair<ll,ll> #define vi vector<ll> #define vii vector<pii> #define ff first #define ss second #define al(x) x.begin(),x.end() #define rev(x) reverse(al(x)) #define MOD 1000000007 #define POT (1LL<<20) #define INF 1000000099LL #define INFL INF*INF ll fct[1000007],ifct[1000007],inv[1000007]; vi g[200007],d[200007]; ll anab(ll a,ll b){//cout<<a<<" "<<b<<"\n"; if(a<0)return 0; return ((fct[a+b-1]*ifct[a])%MOD*ifct[b-1])%MOD; } ll ianab(ll a,ll b){//cout<<a<<" "<<b<<"i\n"; if(a<0)return 0; return ((ifct[a+b-1]*fct[a])%MOD*fct[b-1])%MOD; } ll n,r,q,a,b,c,rs,ilz=0; void pmnz(ll x){ if(x==0)ilz++;else rs=(rs*x)%MOD; } void pdz(ll x){ if(x==0)ilz--;else rs=(rs*x)%MOD; } ll gt(){//cout<<ilz<<" "; if(ilz)return 0;return rs; } ll pre[200007],mxpre[200007],sz[200007],mj[200007],pop[200007],co[200007],ak=0; ll sg[POT][2]; ll val[200007]; void dod(ll v,ll x,ll id){ v+=POT/2-1; while(v){ sg[v][id]+=x;v/=2; } } ll sm(ll v,ll l,ll r,ll pocz,ll kon,ll id){ if(l>kon || r<pocz)return 0; if(l>=pocz && r<=kon)return sg[v][id]; return sm(v*2,l,(l+r)/2,pocz,kon,id)+sm(v*2+1,(l+r)/2+1,r,pocz,kon,id); } void dpre(ll v,ll p){ sz[v]=1; for(ll i:g[v])if(i^p){dpre(i,v);sz[v]+=sz[i];d[v].pb(i);} for(ll i=0;i<(ll)d[v].size()-1;i++){ if(sz[d[v][i]]>sz[d[v].back()])swap(d[v][i],d[v].back()); } } void dfs(ll v,ll p){ pre[v]=++ak;co[ak]=v;for(ll i:d[v])dfs(i,v); mxpre[v]=ak; } void df2(ll v,ll x){ mj[v]=x;reverse(al(d[v])); if(d[v].size())df2(d[v][0],x); for(ll i=1;i<d[v].size();i++)df2(d[v][i],d[v][i]),pop[d[v][i]]=x; } set<ll>s[200007];ll mn[200007]; void upd(ll v){ ll x=mj[v],y=pre[v]; if(s[x].find(y)==s[x].end()){ s[x].insert(y); } else s[x].erase(y); mn[x]=*s[x].begin(); } ll mjpar(ll v){ ll sp=mj[v]; while(mn[sp]>pre[v])sp=pop[sp]; ll x=*--s[sp].lower_bound(pre[v]+1); return co[x]; } int main(){ios_base::sync_with_stdio(0);cin.tie(0); inv[1]=fct[1]=ifct[1]=fct[0]=ifct[0]=1; for(ll i=2;i<1000007;i++){ inv[i]=MOD-(MOD/i*inv[MOD%i])%MOD; fct[i]=(fct[i-1]*i)%MOD; ifct[i]=(ifct[i-1]*inv[i])%MOD; } cin>>n>>r; rs=anab(r,n); val[1]=r; cout<<rs<<"\n"; for(ll i=1;i<n;i++){ cin>>a>>b; g[a].pb(b);g[b].pb(a); } dpre(1,1); dfs(1,1); for(ll i=1;i<=n;i++){s[i].insert(INFL);mn[i]=INFL;} df2(1,1); upd(1); //cout<<pre[4]<<"\n"; cin>>q; for(ll i=0;i<q;i++){ cin>>a; if(a==1){ cin>>b>>c; ll pr=mjpar(b); ll jg=sz[pr]-sm(1,1,POT/2,pre[pr]+1,mxpre[pr],0),jgs=val[pr]-sm(1,1,POT/2,pre[pr]+1,mxpre[pr],1); ll moje=sz[b]-sm(1,1,POT/2,pre[b]+1,mxpre[b],0),mojes=c-sm(1,1,POT/2,pre[b]+1,mxpre[b],1); //cout<<pr<<" "<<jg<< " "<<moje<<" "<<jgs<<" "<<mojes<<"\n"; pdz(ianab(jgs,jg)); pmnz(anab(jgs-mojes,jg-moje)); pmnz(anab(mojes,moje)); val[b]=c; dod(pre[b],moje,0); dod(pre[pr],-moje,0); dod(pre[b],mojes,1); dod(pre[pr],-mojes,1); upd(b); } else{ cin>>b; upd(b); ll pr=mjpar(b); ll jg=sz[pr]-sm(1,1,POT/2,pre[pr]+1,mxpre[pr],0),jgs=val[pr]-sm(1,1,POT/2,pre[pr]+1,mxpre[pr],1); ll moje=sz[b]-sm(1,1,POT/2,pre[b]+1,mxpre[b],0),mojes=val[b]-sm(1,1,POT/2,pre[b]+1,mxpre[b],1); jg+=moje;jgs+=mojes; dod(pre[pr],mojes,1); dod(pre[b],-mojes,1); dod(pre[pr],moje,0); dod(pre[b],-moje,0); val[b]=0; pmnz(anab(jgs,jg)); pdz(ianab(jgs-mojes,jg-moje)); pdz(ianab(mojes,moje)); } cout<<gt()<<"\n"; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...