[SP10707 COT2]
- 算法原理
懒癌晚期懒得写了
Code
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65#include<bits/stdc++.h> #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define per(i,a,b) for(int i=(a);i>=(b);i--) using namespace std; const int N=4e5; struct Q{int l,r,id,add;}q[N]; struct node{int y,n;}e[N<<1]; int lin[N<<1],fa[N][25],deep[N],pos[N],cnt[N],ans[N],v[N],s[N],t[N],a[N],b[N],blo,now=0,tot=0,len=0,l,r,n,tmp,m,x,y; void read(int x,int y) {e[++len].y=y,e[len].n=lin[x],lin[x]=len;} void dfs(int x,int f){ fa[x][0]=f,s[x]=++tot,pos[tot]=x; rep(i,1,20)if((1<<i)<=deep[x])fa[x][i]=fa[fa[x][i-1]][i-1]; for(int i=lin[x];i;i=e[i].n){ int y=e[i].y; if(y==f)continue; deep[y]=deep[x]+1; dfs(y,x); }t[x]=++tot,pos[tot]=x; } int lca(int x,int y){ if(deep[x]<deep[y])swap(x,y); per(i,20,0)if((1<<i)<=deep[x]-deep[y])x=fa[x][i]; if(x==y)return x; per(i,20,0)if(fa[x][i]!=fa[y][i]){ x=fa[x][i],y=fa[y][i]; } return fa[x][0]; } bool cmp(Q a,Q b){return (a.l/blo==b.l/blo&&a.r<b.r)||(a.l/blo<b.l/blo);} void add(int x){int q=a[x];if(cnt[q]==0)++now;++cnt[q];} void del(int x){int q=a[x];--cnt[q];if(cnt[q]==0)now--;} void upd(int x){(v[x])? del(x):add(x);v[x]^=1;} int main() { scanf("%d%d",&n,&m);blo=sqrt(n); rep(i,1,n)scanf("%d",&a[i]),b[i]=a[i]; sort(b+1,b+n+1); rep(i,1,n)a[i]=lower_bound(b+1,b+n+1,a[i])-b; rep(i,2,n){ scanf("%d%d",&x,&y); read(x,y),read(y,x); } dfs(1,1); rep(i,1,m){ scanf("%d%d",&x,&y); int top=lca(x,y); if(s[x]>s[y])swap(x,y); if(x==top)q[i].l=s[x],q[i].r=s[y],q[i].id=i; else q[i].l=t[x],q[i].r=s[y],q[i].id=i,q[i].add=top; } sort(q+1,q+m+1,cmp); l=1,r=0; rep(i,1,m){ while(l<q[i].l)upd(pos[l++]); while(l>q[i].l)upd(pos[--l]); while(r>q[i].r)upd(pos[r--]); while(r<q[i].r)upd(pos[++r]); if(q[i].add)upd(q[i].add); ans[q[i].id]=now; if(q[i].add)upd(q[i].add); } rep(i,1,m)printf("%dn",ans[i]); return 0; }
最后
以上就是昏睡大叔最近收集整理的关于[SP10707 COT2] 树上莫队的全部内容,更多相关[SP10707内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复