求调
查看原帖
求调
757101
junee楼主2024/8/26 10:57

拍了一个早上了,还没找到问题:(。

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=2e5+10;
int b[N];
int n,m;
int h[N],e[N*4],ne[N*4],idx;
int dep[N],top[N],sz[N],fa[N],son[N];
int Id[N],w[N],nw[N],cnt;
int ans[N];
struct color{
	int c,pos;
}c[N];
int k=1;
struct question{
	int l,r,c,id;
}q[N];
bool cmp(question a,question b){
	return a.c<b.c;
}
bool cmp1(color a,color b){
	return a.c<b.c;
}
void add(int a,int b){
	e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void dfs_son(int u,int f,int d){
	dep[u]=d,sz[u]=1,fa[u]=f;
	for(int i=h[u];~i;i=ne[i]){
		int j=e[i];
		if(j==f)continue;
		dfs_son(j,u,d+1);
		sz[u]+=sz[j];
		if(sz[son[u]]<sz[j])son[u]=j;
	}
}
void dfs(int u,int t){
	top[u]=t,Id[u]=++cnt;
	if(!son[u])return;
	dfs(son[u],t);
	for(int i=h[u];~i;i=ne[i]){
		int j=e[i];
		if(j==fa[u]||j==son[u])continue;
		dfs(j,j);
	}
}
struct node{
	int l,r,m;
}tr[N*4];
void pushup(int u){
	tr[u].m=max(tr[u<<1].m,tr[u<<1|1].m);
}
void build(int u,int l,int r){
	tr[u]={l,r,-1};
	if(l==r)return;
	int mid=(l+r)>>1;
	build(u<<1,l,mid);
	build(u<<1|1,mid+1,r);
}
void modify(int u,int pos,int k){
	if(tr[u].l==tr[u].r){
		tr[u].m=k;
		return;
	}
	int mid=(tr[u].l+tr[u].r)>>1;
	if(pos<=mid)modify(u<<1,pos,k);
	else modify(u<<1|1,pos,k);
	pushup(u);
}
int query(int u,int l,int r){
	if(tr[u].l>=l&&tr[u].r<=r){
		return tr[u].m;
	}
	int mid=(tr[u].l+tr[u].r)>>1;
	int ans=-1;
	if(l<=mid)ans=max(ans,query(u<<1,l,r));
	if(r>mid)ans=max(ans,query(u<<1|1,l,r));
	return ans;
}
int query_path(int u,int v){
	int ans=-1;
	while(top[u]!=top[v]){
		if(dep[top[u]]<dep[top[v]])swap(u,v);
		ans=max(ans,query(1,Id[top[u]],Id[u]));
		u=fa[top[u]];
	}
	if(dep[u]<dep[v])swap(u,v);
	ans=max(ans,query(1,Id[v],Id[u]));
	return ans;
}
void clear(int n){
	idx=cnt=0;
	k=1;
	for(int i=1;i<=n+1;i++){
		h[i]=ans[i]=-1;
		son[i]=dep[i]=fa[i]=sz[i]=top[i]=Id[i]=w[i]=nw[i]=b[i]=0;
		q[i]={0,0,0,0};
		c[i]={0,0};
	}
}
int main(){
	freopen("1.in","r",stdin);
	freopen("1.out","w",stdout);
	while(~scanf("%d%d",&n,&m)){
		clear(n);
		for(int i=1;i<=n;i++){
			int a;
			cin>>a;
			a++;
			c[i]={a,i};
			b[a]=1;
		}
		for(int i=1;i<n;i++){
			int a,b;
			cin>>a>>b;
			add(a,b);
			add(b,a);
		}
		dfs_son(1,-1,1);
		dfs(1,-1);
		build(1,0,n);
		for(int i=1;i<=m;i++){
			int a,b,c;
			cin>>a>>b>>c;
			c++;
			q[i]={a,b,c,i};
		}
		sort(q+1,q+1+m,cmp);
		sort(c+1,c+1+n,cmp1);
		for(int i=1;i<=m;i++){
			int l=q[i].l,r=q[i].r,color=q[i].c,id=q[i].id;
			if(!b[color])ans[id]=0;
			else{
			    while(c[k].c<color&&k<=n)k++;
	    		while(c[k].c==color&&k<=n){
	    			modify(1,Id[c[k].pos],color);
	    			k++;
	    		}
	    		ans[id]=(query_path(l,r)==color);
			}
		}
		for(int i=1;i<=m;i++){
		    if(ans[i])cout<<"Find"<<'\n';
		    else cout<<"NotFind"<<'\n';
		}
		cout<<'\n';
	} 
	cout<<'\n';
	return 0;
}
2024/8/26 10:57
加载中...