TLE70tps求调
查看原帖
TLE70tps求调
1184388
zengzixuan666楼主2025/1/28 18:12
#include<bits/stdc++.h>
using namespace std;
bool vis[200010];
int n,m,b[200010],f[200010],dep[200010],t[200010],dis[200010],cnt;
unordered_map<int,vector<int>>c;
vector<int>G[200010];
struct edge{
    int l,r,c;
}a[800010];
struct cow{
    int x,y,c,id;
}q[100010];
bool cmp(cow a,cow b){
    return a.c<b.c;
}
void dfs1(int u,int fa){
    f[u]=fa;
    dep[u]=dep[fa]+1;
    for(int v:G[u]){
        if(v==fa){
        	continue;
        }
        dfs1(v,u);
    }
}
void dfs2(int u,int fa){
    t[u]=fa;
    dis[u]=++cnt;
    int son=-1;
    for(int v:G[u]){
        if(v==f[u]){
        	continue;
        }
        if(son==-1||dep[v]>dep[son]){
        	son=v;
        }
    }
    if(son!=-1){
    	dfs2(son,fa);
    }
    for(int v:G[u]){
        if(v==f[u]||v==son){
        	continue;
        }
        dfs2(v,v);
    }
}
void work(int p,int l,int r){
    a[p].l=l;
    a[p].r=r;
    a[p].c=0;
    if(l==r){
    	return;
    }
    int mid=(l+r)>>1;
    work(p*2,l,mid);
    work(p*2+1,mid+1,r);
}
void ud(int p,int pos,int cow){
	int l=a[p].l,r=a[p].r;
    if(l==r){
        a[p].c=cow;
        return;
    }
    int mid=(l+r)>>1;
    if(pos<=mid){
    	ud(p*2,pos,cow);
    }else{
    	ud(p*2+1,pos,cow);
    }
    a[p].c=max(a[p*2].c,a[p*2+1].c);
}
bool qi(int p,int x,int y,int cow){
    if(x<=a[p].l&&a[p].r<=y){
    	return (a[p].c==cow);
    }
    int mid=(a[p].l+a[p].r)>>1;
    if(x<=mid){
        if(qi(p*2,x,y,cow)){
        	return 1;
        }
    }
    if(y>mid){
        if(qi(p*2+1,x,y,cow)){
        	return 1;
        }
    }
    return 0;
}
bool ask(int u,int v,int cow){
    while(t[u]!=t[v]) {
        if(dep[t[u]]<dep[t[v]]){
        	swap(u,v);
        }
        if(qi(1,dis[t[u]],dis[u],cow)){
        	return 1;
        }
        u=f[t[u]];
    }
    if(dep[u]>dep[v]){
    	swap(u, v);
    }
    return qi(1,dis[u],dis[v],cow);
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
    cin>>n>>m;
    vector<int> c[100010];
    for(int i=1;i<=n;i++){
        cin>>b[i];
		c[b[i]].reserve(1000);
        c[b[i]].push_back(i);
    }
    for(int i=1;i<n;i++){
        int x,y;
        cin>>x>>y;
        G[x].push_back(y);
        G[y].push_back(x);
    }
    dfs1(1,0);
    dfs2(1,1);
    work(1,1,n);
    for(int i=1;i<=m;i++){
        cin>>q[i].x>>q[i].y>>q[i].c;
        q[i].id=i;
    }
    sort(q+1,q+1+m,cmp);
    string ans(m,'0');
    for(int i=1;i<=m;i++){
        int ct=q[i].c;
        if(!c[ct].size()){
        	continue;
        }
        if(!vis[ct]){
            for(int j=0;j<c[ct].size();j++){
                ud(1,dis[c[ct][j]],ct);
            }
            vis[ct]=1;
        }
        if(ask(q[i].x,q[i].y,ct)){
        	ans[q[i].id-1]='1';
        }
    }
    cout<<ans;
    return 0;
}
2025/1/28 18:12
加载中...