平时PS 平时PS
关注数: 5 粉丝数: 20 发帖数: 135 关注贴吧数: 24
树的统计(ZJOI2008)各种WA,跪求数据与改正。。。 RTRT。贴代码:#include <cstdio> #include <cstring> struct edge {int adv,next;}; const int N=30005,inf=1<<28; edge es[2*N]; int n,e,g[N],Key[N],Sum[N],Max[N],child[2][N],P[N],*L=child[0],*R=child[1]; bool root[N]; inline void addedge(int a,int b) { es[++e].adv=b; es[e].next=g[a]; g[a]=e; es[++e].adv=a; es[e].next=g[b]; g[b]=e; } int q[N]; void bfs(int u) { P[u]=0; q[1]=u; int h=0,r=1,v,j; while (h<r) { u=q[++h]; for (j=g[u];j;j=es[j].next) if ((v=es[j].adv)!=P[u]) { q[++r]=v; P[v]=u; } } } void init() { scanf("%d",&n); int i,a,b; e=0; memset(g,0,sizeof(g)); for (i=1;i<n;++i) { scanf("%d%d",&a,&b); addedge(a,b); } for (i=1;i<=n;++i) { scanf("%d",Key+i); Max[i]=Sum[i]=Key[i]; } Max[0]=-inf; Sum[0]=0; memset(root,1,sizeof(root)); memset(child,0,sizeof(child)); bfs(1); } inline int max(int a,int b,int c) { int ans=a; if (b>a) ans=b; if (c>a) ans=c; return ans; } inline void update(int p) { Sum[p]=Sum[L[p]]+Sum[R[p]]+Key[p]; Max[p]=max(Key[p],Max[L[p]],Max[R[p]]); } inline int type(int p) {return p==L[P[p]]?0:1;} inline void rotate(int p,int c) { int q=P[p],*L=child[c],*R=child[1-c]; P[p]=P[q]; if (root[q]) { root[q]=0; root[p]=1; } else child[type(q)][P[q]]=p; L[q]=R[p]; P[R[p]]=q; R[p]=q; P[q]=p; update(q); } void splay(int p) { int q,c1,c2; while (!root[p]) { c1=type(p); q=P[p]; if (root[q]) c2=2;else c2=type(q); if (c1==c2) rotate(q,c2);else rotate(p,c1); if (root[p]) break; rotate(p,c2); } update(p); } void access(int u) { int v=0; while (u) { splay(u); root[R[u]]=1; R[u]=v; update(u); root[v]=0; v=u; u=P[u]; } } void access2(int u) { int v=0; while (u) { splay(u); if (!P[u]) printf("%d\n",max(Max[R[u]],Max[v],Key[u])); root[R[u]]=1; R[u]=v; update(u); root[v]=0; v=u; u=P[u]; } } void access3(int u) { int v=0; while (u) { splay(u); if (!P[u]) printf("%d\n",Sum[R[u]]+Sum[v]+Key[u]); root[R[u]]=1; R[u]=v; update(u); root[v]=0; v=u; u=P[u]; } } void slove() { int q; scanf("%d",&q); char task[7]; int a,b; while (q--) { scanf("%s%d%d",task,&a,&b); if (!strcmp(task,"QMAX")) { access(a); access2(b); } else if (!strcmp(task,"QSUM")) { access(a); access3(b); } else { access(a); splay(a); Key[a]=b; update(a); } } } int main() { init(); slove(); return 0; }
1 下一页