为什么要特判端点为所需颜色的情况
查看原帖
为什么要特判端点为所需颜色的情况
483966
一粒夸克楼主2021/7/25 16:41

我把询问离线下来,每经过一个点,就更新一下这个点对应颜色的时间戳

如果在两个点处发现某个颜色的时间戳变了,说明这两点的路径经过了这种颜色的点

但如果不特判端点只有 8888

#include<bits/stdc++.h>
using namespace std;
int n,m;
int t[100005];
int ver[200005],ne[200005],head[200005],tot;
inline void link(int x,int y){
	ver[++tot]=y;
	ne[tot]=head[x];
	head[x]=tot;
}
int ans[100005],q[100005],vis[100005],cnt;
vector<int> vec[100005];
void dfs(int x,int fi){
	int tmp=vis[t[x]];
	vis[t[x]]=++cnt;
	for(vector<int>::iterator it=vec[x].begin();it!=vec[x].end();it++){
		if(~ans[*it])ans[*it]=(ans[*it]!=vis[q[*it]]);
		else ans[*it]=vis[q[*it]];
	}
	for(int i=head[x];i;i=ne[i]){
		int u=ver[i];
		if(u==fi)continue;
		vis[t[x]]=++cnt;
		dfs(u,x);
	}
	vis[t[x]]=tmp;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)scanf("%d",&t[i]);
	for(int i=1;i<n;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		link(x,y);link(y,x);
	}
	memset(ans,-1,sizeof(ans));
	for(int i=0;i<m;i++){
		int x,y;
		scanf("%d%d%d",&x,&y,&q[i]);
		vec[x].push_back(i);
		vec[y].push_back(i);
	}
	dfs(1,1);
	for(int i=0;i<m;i++)printf("%d",ans[i]);

	return 0;
}

特判一下就过了

#include<bits/stdc++.h>
using namespace std;
int n,m;
int t[100005];
int ver[200005],ne[200005],head[200005],tot;
inline void link(int x,int y){
	ver[++tot]=y;
	ne[tot]=head[x];
	head[x]=tot;
}
int ans[100005],q[100005],vis[100005],cnt;
vector<int> vec[100005];
void dfs(int x,int fi){
	int tmp=vis[t[x]];
	vis[t[x]]=++cnt;
	for(vector<int>::iterator it=vec[x].begin();it!=vec[x].end();it++){
		if(~ans[*it])ans[*it]=(ans[*it]!=vis[q[*it]]);
		else ans[*it]=vis[q[*it]];
	}
	for(int i=head[x];i;i=ne[i]){
		int u=ver[i];
		if(u==fi)continue;
		dfs(u,x);
		vis[t[x]]=++cnt;
	}
	vis[t[x]]=tmp;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)scanf("%d",&t[i]);
	for(int i=1;i<n;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		link(x,y);link(y,x);
	}
	memset(ans,-1,sizeof(ans));
	for(int i=0;i<m;i++){
		int x,y;
		scanf("%d%d%d",&x,&y,&q[i]);
		if(t[x]==q[i]||t[y]==q[i])ans[i]=1;
        else{
            vec[x].push_back(i);
	    	vec[y].push_back(i);
        }
	}
	dfs(1,1);
	for(int i=0;i<m;i++)printf("%d",ans[i]);

	return 0;
}
2021/7/25 16:41
加载中...