此题代码量较大。。但是打起来很爽
原本不用lca做一直wa不知道为什么。。
后来改lca重打了一遍= =结果一遍就AC了orz
题目比较裸,也挺容易打,主要是因为思路可以比较清晰
另:加读入优化比没加快了1.3s。。
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; ; struct node{ int l,r,lc,rc,sum,lz; }t[maxn*]; struct edge{ int to,next; }e[maxn*]; ; ],size[maxn],col[maxn]; inline void read(int &x){ ; ; ; cc=getchar();} +cc-',cc=getchar(); x*=f; } inline void insert(int u, int v){ e[++tot].to=v; e[tot].next=head[u]; head[u]=tot; } inline void dfs1(int u, int f, int d){ size[u]=; fa[u][]=f; dep[u]=d; ; i<=logn; i++) fa[u][i]=fa[fa[u][i-]][i-]; ; i=e[i].next){ int v=e[i].to; if (v==f) continue; dfs1(v,u,d+); size[u]+=size[v]; if (!son[u] || size[v]>size[son[u]]) son[u]=v; } } inline void dfs2(int u, int num){ top[u]=num; tree[u]=++cnt; pre[cnt]=u; if (!son[u]) return; dfs2(son[u],num); ; i=e[i].next) ] && e[i].to!=son[u]) dfs2(e[i].to,e[i].to); } inline int lca(int u, int v){ if (dep[u]>dep[v]) swap(u,v); while (dep[u]<dep[v]){ ; i--) if (dep[u]<dep[fa[v][i]]) v=fa[v][i]; v=fa[v][]; } if (u==v) return u; ; i--) if (fa[u][i]!=fa[v][i]){ u=fa[u][i]; v=fa[v][i]; } u=fa[u][]; return u; } inline void pushdown(int x){ if (t[x].lz){ t[x<<].lz=t[x<<|].lz=t[x].lz; t[x<<].lc=t[x<<].rc=t[x<<|].lc=t[x<<|].rc=t[x].lz; t[x<<].sum=t[x<<|].sum=; t[x].lz=; } } inline void pushup(int x){ t[x].lc=t[x<<].lc; t[x].rc=t[x<<|].rc; t[x].sum=t[x<<].sum+t[x<<|].sum-(t[x<<].rc==t[x<<|].lc); } inline int query(int a, int b, int x){ int l=t[x].l, r=t[x].r; if (a==l && r==b) return t[x].sum; ; pushdown(x); ); |); )+query(mid+,b,x<<|)-(t[x<<].rc==t[x<<|].lc); } inline void update(int a, int b, int c, int x){ int l=t[x].l, r=t[x].r; if (a==l && r==b){ t[x].lc=t[x].rc=t[x].lz=c; t[x].sum=; return; } ; pushdown(x); ); |); else{ update(a,mid,c,x<<); update(mid+,b,c,x<<|); } pushup(x); } inline int get_col(int a, int x){ int l=t[x].l, r=t[x].r; if (l==r) return t[x].lc; pushdown(x); ; ); |); } inline void build(int l, int r, int x){ t[x].l=l; t[x].r=r; if (l==r){ t[x].lc=t[x].rc=col[pre[l]]; t[x].sum=; return; } ; ); ,r,x<<|); pushup(x); } inline void change(int x, int f, int c){ while (top[x]!=top[f]){ update(tree[top[x]],tree[x],c,); x=fa[top[x]][]; } update(tree[f],tree[x],c,); } inline int get_sum(int x, int f){ ; while (top[x]!=top[f]){ res+=query(tree[top[x]],tree[x],); )==get_col(tree[fa[top[x]][]],)) res--; x=fa[top[x]][]; } res+=query(tree[f],tree[x],); return res; } int main(){ read(n); read(m); <<logn)<n) logn++; ; i<=n; i++) read(col[i]),col[i]++; tot=-; memset(head,-,sizeof(head)); ; i<n; i++){ read(u); read(v); insert(u,v); insert(v,u); } cnt=; dfs1(,,); dfs2(,); build(,n,); ]; while (m--){ scanf("%s", s); ]=='Q'){ read(u); read(v); int t=lca(u,v); printf(); } else{ int color; read(u); read(v); read(color); int t=lca(u,v); color++; change(u,t,color); change(v,t,color); } } ; }