萌新刚学在线莫队WA,求调QwQ

SP10707 COT2 - Count on a tree II

[评测记录](https://vjudge.csgrandeur.cn/solution/43631441)
by Augury @ 2023-06-16 15:56:32


@[Augury](/user/401461) ```cpp #include<bits/stdc++.h> using namespace std; inline int read(){ int ans=0;bool op=0;char ch=getchar(); while(ch<'0'||'9'<ch){if(ch=='-')op=1;ch=getchar();} while('0'<=ch&&ch<='9'){ans=(ans<<1)+(ans<<3)+(ch^48);ch=getchar();} if(op)return -ans; return ans; } const int maxn=1e5+10; int n,m; int Block; struct query{ int u,v; int l,r; int lca,id; bool operator < (const query cmp)const{ if(l/Block==cmp.l/Block)return r<cmp.r; return l/Block<cmp.l/Block; } }q[maxn]; int a[maxn]; vector<int>g[maxn]; int euler[maxn],node=0; pair<int,int>mp[maxn]; int fa[20][maxn],dep[maxn]; int buc[maxn],res,vis[maxn]; int ans[maxn]; void init(){ vector<int>mp; for(int i=1;i<=n;i++)mp.push_back(a[i]); sort(mp.begin(),mp.end()); mp.erase(unique(mp.begin(),mp.end()),mp.end()); for(int i=1;i<=n;i++)a[i]=lower_bound(mp.begin(),mp.end(),a[i])-mp.begin(); } void dfs(int now){ euler[++node]=now; mp[now].first=node; for(int i=1;i<=19;i++)fa[i][now]=fa[i-1][fa[i-1][now]]; dep[now]=dep[fa[0][now]]+1; for(int nxt:g[now]){ if(nxt==fa[0][now])continue; fa[0][nxt]=now; dfs(nxt); } euler[++node]=now; mp[now].second=node; } int lca(int a,int b){ if(dep[a]<dep[b])swap(a,b); for(int i=19;~i;--i){ if(dep[fa[i][a]]<dep[b])continue; a=fa[i][a]; } if(a==b)return a; for(int i=19;~i;--i){ if(fa[i][a]==fa[i][b])continue; a=fa[i][a],b=fa[i][b]; } return fa[0][a]; } void ins(int pos){ if(!buc[pos])++res; ++buc[pos]; } void era(int pos){ --buc[pos]; if(!buc[pos])--res; } void work(int pos){ if(vis[pos]) era(a[pos]); else ins(a[pos]); vis[pos]^=1; } void sol(){ int l=1,r=0; for(int i=1;i<=m;i++){ while(r<q[i].r)work(euler[++r]); while(l>q[i].l)work(euler[--l]); while(r>q[i].r)work(euler[r--]); while(l<q[i].l)work(euler[l++]); if(~q[i].lca)work(q[i].lca); ans[q[i].id]=res; if(~q[i].lca)work(q[i].lca); } } signed main(){ n=read(),m=read(); Block=sqrt(n); for(int i=1;i<=n;i++)a[i]=read(); init(); for(int i=1;i<n;i++){ int u=read(),v=read(); g[u].push_back(v); g[v].push_back(u); } dfs(1); for(int i=1;i<=m;i++){ int u=read(),v=read(); if(mp[u].first>mp[v].first)swap(u,v); if(mp[v].second<mp[u].second){ q[i]=(query){u,v,mp[u].first,mp[v].first,-1,i}; } else{ q[i]=(query){u,v,mp[u].second,mp[v].first,lca(u,v),i}; } } sort(q+1,q+1+m); sol(); for(int i=1;i<=m;i++)cout<<ans[i]<<'\n'; return 0; } ```
by LgxTpre @ 2023-06-16 16:26:37


@[LgxTpre](/user/66709) ?
by Augury @ 2023-06-16 16:30:53


|