啊啊啊啊,有没有人能调调,12pts
查看原帖
啊啊啊啊,有没有人能调调,12pts
910357
songzhihan2010楼主2024/8/14 16:35
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll read() {
	ll x=0,f=1;
	char ch=getchar();
	while (ch<'0'||ch>'9') {
		if (ch=='-') f=-1;
		ch=getchar();
	}
	while (ch>='0'&&ch<='9') {
		x=x*10+ch-48;
		ch=getchar();
	}
	return x*f;
}
const ll N=100010;
vector<ll> color[N],e[N];
ll sz[N],vis[N],son[N],top[N],dfn[N],deep[N],f[N],cnt=0,u,v,x,n,m;
struct Node {
	ll a,b,c,pos,ans;
//	friend bool operator<(Node x,Node y){
//		return x.c<y.c;
//	}
} a[N];
struct Tree {
	ll l,r,maxn;
} t[4*N];
bool cmp(Node x,Node y) {
	return x.c<y.c;
}
bool cmp1(Node x,Node y) {
	return x.pos<y.pos;
}
void build(ll q,ll l,ll r) {
	t[q].l=l;
	t[q].r=r;
	if(l==r) {
		return ;
	}
	ll mid=(l+r)/2;
	build(q*2,l,mid);
	build(q*2+1,mid+1,r);
}
void dfs(ll t,ll fa) {
	sz[t]=1;
	for (int i=0; i<e[t].size(); i++) {
		if(e[t][i]==fa) continue;
		deep[e[t][i]]=deep[t]+1;
		f[e[t][i]]=t;
		dfs(e[t][i],t);
		if(sz[son[t]]<sz[e[t][i]]) {
			son[t]=e[t][i];
		}
		sz[t]+=sz[e[t][i]];
	}
}
void dfs1(ll t,ll tp) {
	top[t]=tp;
	dfn[t]=++cnt;
	if(son[t]!=0) dfs1(son[t],tp);
	for (int i=0; i<e[t].size(); i++) {
		if(e[t][i]==f[t]||e[t][i]==son[t]) continue;
		dfs1(e[t][i],e[t][i]);
	}
}
void change(ll q,ll seat,ll d) {
	if(t[q].l==t[q].r) {
		t[q].maxn=d;
		return ;
	}
	t[q].maxn=d;
	ll mid=(t[q].l+t[q].r)/2;
	if(mid>=seat) change(q*2,seat,d);
	if(seat>mid) change(q*2+1,seat,d);
}
ll ask_maxn(ll q,ll l,ll r) {
	if(t[q].l>=l&&t[q].r<=r) {
		return t[q].maxn;
	}
	ll mid=(t[q].l+t[q].r)/2,ans=0;
	if(l<=mid) ans=max(ans,ask_maxn(q*2,l,r));
	if(r>mid) ans=max(ans,ask_maxn(q*2+1,l,r));
	return ans;
}
ll ask(ll u,ll v,ll co) {
	while(top[u]!=top[v]) {
		if(deep[top[u]]<deep[top[v]]) swap(u,v);
		if(ask_maxn(1,dfn[top[u]],dfn[u])==co) return 1;
		u=f[top[u]];
	}
	if(ask_maxn(1,min(dfn[u],dfn[v]),max(dfn[u],dfn[v]))==co) return 1;
	return 0;
}
signed main() {
	n=read();
	m=read();
	for (int i=1; i<=n; i++) {
		x=read();
		color[x].push_back(i);
	}
	for (int i=1; i<n; i++) {
		u=read();
		v=read();
		e[u].push_back(v);
		e[v].push_back(u);
	}
	for (int i=1; i<=m; i++) {
		a[i].a=read();
		a[i].b=read();
		a[i].c=read();
		a[i].pos=i;
	}
	dfs(1,0);
	dfs1(1,1);
	sort(a+1,a+1+m,cmp);
	build(1,1,n);
	for (int i=1; i<=m; i++) {
		if(color[a[i].c].size()==0) continue;
		if(!vis[a[i].c]) {
			for (int j=0; j<color[a[i].c].size(); j++) {
				change(1,dfn[color[a[i].c][j]],a[i].c);
			}
			vis[a[i].c]=1;
		}
		a[i].ans=ask(dfn[a[i].a],dfn[a[i].b],a[i].c);
	}
	sort(a+1,a+1+m,cmp1);
	for (int i=1; i<=m; i++) {
		printf("%lld",a[i].ans);
	}
}
2024/8/14 16:35
加载中...