MnZn求助(马粪良好)
查看原帖
MnZn求助(马粪良好)
556740
hzx360楼主2024/10/23 22:23

只有25pts。Wa on 6-20

感觉写的没啥问题捏

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+100;
int n,m,c,p[N],w[N],rfl[N];
int anc[N][22],de[N];
int f[N][22],g[N][22],pos[N],pos1[N],Pos[N];
vector<int>E[N];
void add(int x,int y){
	E[x].push_back(y);
}
struct node{int id,s;}; vector<node>qes[N];
inline void dfs1(int u,int fa){
//	cout<<u<<' '<<w[u]<<endl;
	if(w[u]==1) pos1[u]=u;
	else pos1[u]=pos1[fa];
	int P=pos[w[u]]; pos[w[u]]=u;
	if(w[u]>=1) f[u][0]=pos[w[u]+1],g[u][0]=pos[w[u]-1];
	de[u]=de[fa]+1,anc[u][0]=fa;
	for(int i=0;i<E[u].size();i++){
		int v=E[u][i];
		if(v==fa) continue;
		dfs1(v,u);
	}
	pos[w[u]]=P;
}
int LCA(int x,int y){
	if(de[x]<de[y]) swap(x,y);
	for(int i=20;i>=0;i--) if(de[anc[x][i]]>=de[y]) x=anc[x][i];
	if(x==y) return x;
	for(int i=19;i>=0;i--) if(anc[x][i]!=anc[y][i]) x=anc[x][i],y=anc[y][i];
	return anc[x][0];
}
int bb[N],ans[N];
void dfs2(int u,int fa){
	int BB=bb[w[u]];
	bb[w[u]]=(w[u]==0?0:u);
	for(int k=0;k<qes[u].size();k++){
		int t=u,s=qes[u][k].s;
		int lca=LCA(s,t); s=pos1[s];
		int sit;
		if(de[s]<de[lca]) sit=0;
		else sit=1;
		if(de[s]>=de[lca]) for(int i=20;i>=0;i--) if(de[f[s][i]]>=de[lca]){
//			cout<<qes[u][k].id<<": "<<f[s][i]<<endl;
			sit=w[f[s][i]]; 
			break;
		}
	//	cout<<qes[u][k].id<<':'<<sit<<' '<<s<<endl;
		int l=sit+1,r=c,res=sit;
		while(l<=r){
			int mid=(l+r)>>1; bool flag=1;
			int now=bb[mid];
			if(de[now]<de[lca]){r=mid-1;continue;}
			int ssit=mid;
			for(int i=20;i>=0;i--){
				if(de[g[now][i]]>=de[lca]){
					ssit=w[g[now][i]];
					break;
				}
			}
			if(ssit>sit+1) r=mid-1;
			else res=mid,l=mid+1;
		}
		ans[qes[u][k].id]=res;
	}
	for(int i=0;i<E[u].size();i++){
		int v=E[u][i];
		if(v==fa)continue;
		dfs2(v,u);
	}
	bb[w[u]]=BB;
}
int main(){
//	freopen("P7518_6.in","r",stdin);
//	freopen("gem2.out","w",stdout);
	cin>>n>>m>>c;
	for(int i=1;i<=c;i++) scanf("%d",&p[i]),rfl[p[i]]=i;
	for(int i=1;i<=n;i++) scanf("%d",&w[i]),w[i]=rfl[w[i]];
	for(int i=1;i<n;i++){
		int x,y; scanf("%d%d",&x,&y);
		add(x,y),add(y,x);
	}
	int Q; cin>>Q;
	for(int i=1;i<=Q;i++){
		int s,t; scanf("%d%d",&s,&t);
		qes[t].push_back((node){i,s});
	}
	dfs1(1,0);
	for(int u=1;u<=n;u++) for(int k=1;k<=20;k++) anc[u][k]=anc[anc[u][k-1]][k-1],f[u][k]=f[f[u][k-1]][k-1],g[u][k]=g[g[u][k-1]][k-1];
	dfs2(1,0);
	for(int i=1;i<=Q;i++) cout<<ans[i]<<endl;
	return 0;
}
2024/10/23 22:23
加载中...