求助,有数据
查看原帖
求助,有数据
800499
suzhikz楼主2024/8/22 09:52

数据输出应为1

100 1
2 5
2 6
2 2
2 1
2 5
2 4
1 5
1 3
2 5
2 2
2 4
2 4
2 6
2 1
2 6
1 2
2 2
2 5
2 1
2 5
2 5
2 6
2 2
2 1
2 2
2 1
2 4
2 5
2 4
2 3
2 6
1 1
2 5
2 1
2 5
2 5
2 5
2 4
1 4
2 3
2 4
1 2
2 1
2 3
2 2
2 4
1 6
2 4
2 6
2 2
2 2
1 4
2 1
2 1
2 6
2 6
2 2
2 6
1 3
2 5
2 6
2 2
2 2
2 1
2 4
2 6
2 6
2 1
1 3
2 3
2 2
1 4
1 6
1 1
1 1
2 3
2 2
2 4
1 1
2 2
1 5
2 2
2 6
2 1
2 2
1 4
1 5
2 6
1 2
2 5
2 2
2 2
1 1
2 5
1 6
2 6
2 2
2 5
1 6
2 2
2 1
3 1
4 2
5 2
6 4
7 6
8 6
9 8
10 9
11 5
12 3
13 12
14 10
15 12
16 5
17 3
18 6
19 11
20 1
21 2
22 5
23 19
24 6
25 2
26 23
27 8
28 4
29 18
30 20
31 7
32 17
33 12
34 29
35 14
36 6
37 2
38 24
39 25
40 18
41 30
42 39
43 28
44 19
45 26
46 19
47 29
48 32
49 45
50 3
51 44
52 29
53 32
54 40
55 49
56 49
57 41
58 16
59 13
60 17
61 26
62 53
63 10
64 60
65 26
66 18
67 7
68 2
69 35
70 26
71 25
72 23
73 44
74 11
75 38
76 71
77 51
78 35
79 12
80 57
81 21
82 33
83 40
84 1
85 37
86 50
87 52
88 31
89 65
90 86
91 87
92 10
93 29
94 24
95 51
96 95
97 47
98 22
99 64
100 19

67 64
#include<bits/stdc++.h>
using namespace std;
int read(){
	int x=0;
	char c=getchar();
	while(c>'9'||c<'0')c=getchar();
	while(c>='0'&&c<='9'){
		x=x*10+c-'0';
		c=getchar();
	}
	return x;
}
const int N=5e5+5;
int n,m;
int t[N],c[N];
vector<int>col[N];
int head[N],to[N*2],nex[N*2],cnt;
void add(int u,int v){
	cnt++;
	to[cnt]=v;nex[cnt]=head[u];head[u]=cnt;
}
int fa[N][22],deep[N],tim,dfn[N],dfnr[N];
void dfs(int x){
	dfn[x]=++tim;
	deep[x]=deep[fa[x][0]]+1;
	for(int i=1;i<=log2(deep[x]);i++){
		fa[x][i]=fa[fa[x][i-1]][i-1];
	}
	for(int i=head[x];i;i=nex[i]){
		int y=to[i];if(y==fa[x][0])continue;
		fa[y][0]=x;dfs(y);
	}
	dfnr[x]=tim;
}
int lca(int x,int y){
	if(deep[y]>deep[x]){
		swap(x,y);
	}
	int d=deep[x]-deep[y];
	for(int i=0;i<=log2(d);i++){
		if((1<<i)&d){
			x=fa[x][i];
		}
	}
	if(x==y)return x;
	for(int i=log2(deep[x]);i>=0;i--){
		if(fa[x][i]!=fa[y][i]){
			x=fa[x][i];y=fa[y][i];
		}
	}
	return fa[x][0];
}
bool cmp(int a,int b){
	return dfn[a]<dfn[b];
}
struct node{
	int x,w;
};
vector<node>ed[N];
vector<int>q[N];
int dian[N*2],len;
vector<int>g[N];
bool in(int u,int v){
	if(dfn[v]<=dfn[u]&&dfnr[v]>=dfn[u])return 1;
	return 0;
}
int get(int u,int v){
	for(int i=log2(deep[u]);i>=0;i--){
		if(deep[fa[u][i]]>deep[v])u=fa[u][i];
	}
	return u;
}
void add(int lu,int ru,int lv,int rv){
	if(lv>rv||lu>ru)return;
	cout<<lu<<' '<<ru<<' '<<lv<<' '<<rv<<endl;
	node book;
	book.x=ru+1,book.w=-1;
	ed[lv].push_back(book);
	book.w=1;
	ed[rv+1].push_back(book);
	book.x=lu;
	book.w=1;
	ed[lv].push_back(book);
	book.w=-1;
	ed[rv+1].push_back(book);
}
void ins(int u,int v){
	if(in(u,v)){
//		cout<<1<<endl;
		v=get(u,v);
		add(dfn[u],dfnr[u],1,dfn[v]-1);add(dfn[u],dfnr[u],dfnr[v]+1,n);
	}else if(in(v,u)){
//		cout<<2<<endl;
		u=get(v,u);
//		cout<<u<<endl;
		add(1,dfn[u]-1,dfn[v],dfnr[v]);add(dfnr[u]+1,n,dfn[v],dfnr[v]);
	}else{
//		cout<<3<<endl;
		add(dfn[u],dfnr[u],dfn[v],dfnr[v]);
	}
}
void df(int root,int x,int fa,int cnt){
	if(c[x]==c[root]){
		if(t[x]==1)cnt++;
		else cnt--;
	}
	if(!cnt){
//		cout<<"dasiojf"<<root<<' '<<x<<endl;
		ins(root,x);return;
	}
	for(int i:g[x]){
		if(i==fa)continue;
		df(root,i,x,cnt);
	}
}
vector<int>id[N];
int tree[N];
int lowbit(int x){
	return x&(-x);
}
void update(int x,int w){
	while(x<=n){
		tree[x]+=w;
		x+=lowbit(x);
	}
}
int ask(int x){
	int re=0;
	while(x){
		re+=tree[x];
		x-=lowbit(x);
	}
	return re;
}
int ans[N];
int main(){
	int num;
	n=read();num=read();
	for(int i=1;i<=n;i++){
		t[i]=read();c[i]=read();
		col[c[i]].push_back(i);
	}
	for(int u,v,i=1;i<n;i++){
		u=read();v=read();add(u,v);add(v,u);
	}
	dfs(1);
	for(int i=1;i<=n;i++){
		len=0;
		if(col[i].size()==0)continue;
		for(int j:col[i]){
			++len;m=len;
			dian[len]=j;
		}
		sort(dian+1,dian+1+m,cmp);
		for(int j=1;j<m;j++){
			dian[++len]=lca(dian[j],dian[j+1]);
		}
		dian[++len]=1;
		sort(dian+1,dian+1+len);len=unique(dian+1,dian+1+len)-dian-1;
		sort(dian+1,dian+1+len,cmp);
		for(int i=1;i<len;i++){
			g[lca(dian[i],dian[i+1])].push_back(dian[i+1]);
			g[dian[i+1]].push_back(lca(dian[i],dian[i+1]));
		}
		for(int i=1;i<=len;i++){
			if(t[dian[i]]==1){
				df(dian[i],dian[i],0,0);
			}
		}
		for(int i=1;i<=len;i++)g[dian[i]].clear();
	}
	for(int i=1;i<=num;i++){
		int u,v;
		u=read();v=read();
//		cout<<"change"<<dfn[u]<<' '<<dfn[v]<<endl;
		q[dfn[v]].push_back(dfn[u]);id[dfn[v]].push_back(i);
	}
	for(int i=1;i<=n;i++){
//		cout<<i<<endl;
		for(int k=0;k<ed[i].size();k++){
			node j=ed[i][k];
			if(j.x==0)continue; 
//			cout<<j.x<<' '<<j.w<<endl;
			update(j.x,j.w);
		}
		for(int j=0;j<q[i].size();j++){
			ans[id[i][j]]=ask(q[i][j]);
		}
	}
	for(int i=1;i<=num;i++)cout<<ans[i]<<endl;
	return 0;
}
2024/8/22 09:52
加载中...