Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
30854 LYLAKIOIAKIOI 【S】T4 C++ 运行超时 10 2000 MS 46936 KB 2966 2024-07-31 08:38:35

Tests(1/10):


#include<bits/stdc++.h> #define jp8 push_back using namespace std; const int N=2e5+10,B=800; int head[N*2],to[N*2],val[N*2],nxt[N*2]; int tot=0;int n,m; void add(int u,int v,int w){ ++tot; to[tot]=v;nxt[tot]=head[u];val[tot]=w; head[u]=tot; }bool vis[N]; int f[N]; int bel[N];vector<int> pf[B+10]; int lp[B+10],rp[B+10]; int tag[N]; int dfn[N],siz[N],rk[N],dfncnt=0,dc[N],fa[N][22]; void dfs(int u,int cnt){ vis[u]=1;f[u]=cnt;dfn[u]=++dfncnt;siz[u]=1; for(int v=head[u];v!=0;v=nxt[v]){ if(vis[to[v]]) continue; dfs(to[v],cnt+val[v]); fa[to[v]][0]=u;siz[u]+=siz[to[v]]; for(int i=19;i>=1;i--) fa[to[v]][i]=fa[fa[to[v]][i-1]][i-1]; } }int getf(int id){ return f[id]+tag[bel[id]]; }void brute(int bid,int l,int r,int vl){ for(int i=l;i<=r;i++) f[i]+=vl; pf[bid].clear(); for(int i=lp[bid];i<=rp[bid];i++) pf[bid].jp8(f[i]); sort(pf[bid].begin(),pf[bid].end()); }void upd1(int l,int r,int vl){ if(bel[l]==bel[r]){ brute(bel[l],l,r,vl);return ; }brute(bel[l],l,rp[bel[l]],vl); brute(bel[r],lp[bel[r]],r,vl); for(int i=bel[l]+1;i<=bel[r]-1;i++) tag[i]+=vl; }void upd(int x){ int pu=to[2*x],pv=to[2*x-1];int vl=1-val[2*x];val[2*x]^=1; if(fa[pu][0]==pv) x=pu;else x=pv; vl=vl*2-1; upd1(dfn[x],dfn[x]+siz[x]-1,vl); } int brute1(int l,int r,int vl){ int ans=0; for(int i=l;i<=r;i++) if(getf(i)<=vl) ans++; return ans; } int qry1(int l,int r,int q){ int ans=0; if(bel[l]==bel[r])return brute1(l,r,q); ans+=brute1(l,rp[bel[l]],q); ans+=brute1(lp[bel[r]],r,q); for(int i=bel[l]+1;i<=bel[r]-1;i++){ if(tag[i]>q) continue; ans+=upper_bound(pf[i].begin(),pf[i].end(),q-tag[i])-pf[i].begin(); }return ans; }int qry(int s){ int ans=0;int ns=s; for(int i=18;i>=0;i--) if(getf(dfn[s])==getf(dfn[fa[s][i]])) s=fa[s][i]; ans+=qry1(dfn[s],dfn[s]+siz[s]-1,getf(dfn[ns])+1);//cout<<siz[s]<<' '; if(s==1) return ans;//cout<<s<<' '; s=fa[s][0];//cout<<ans<<endl; for(int i=18;i>=0;i--) if(getf(dfn[s])==getf(dfn[fa[s][i]])) s=fa[s][i]; //out<<s<<' '<<dfn[s]<<' '<<getf(dfn[ns])<<' '<<dfn[ns]<<' '; ans+=qry1(dfn[s],dfn[s]+siz[s]-1,getf(dfn[ns])-1); return ans; }int tmp[N]; void slv(){ cin>>n>>m; for(int i=1;i<n;i++){ int u,v,w;cin>>u>>v>>w; add(u,v,w),add(v,u,w); }fa[1][0]=1;for(int i=18;i>=1;i--) fa[1][i]=1; dfs(1,0);for(int i=1;i<=n;i++) bel[i]=(i+B-1)/B; for(int i=1;i<=n;i++) tmp[i]=f[i];for(int i=1;i<=n;i++) f[dfn[i]]=tmp[i]; for(int i=1;i<=bel[n];i++) lp[i]=(i-1)*B+1,rp[i]=min(n,i*B); for(int i=1;i<=n;i++) pf[bel[i]].jp8(f[i]); for(int i=1;i<=bel[n];i++) sort(pf[i].begin(),pf[i].end()); //for(int i=1;i<=n;i++) cout<<f[i]<<' ';cout<<endl; for(int i=1;i<=m;i++){ int op,k;cin>>op>>k; if(op==1) upd(k); if(op==2) cout<<qry(k)<<endl; //for(int i=1;i<=n;i++) cout<<f[i]<<' ';cout<<endl; } } int main(){ slv(); return 0; }


测评信息: