TLE
查看原帖
TLE
354310
Tnuzy_plzro楼主2023/3/24 10:18

rt,蒟蒻的 双log 二分+倍增,前6个AC其余全TLE。求救!

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
const int N=2e5+10,lgN=17;
int p[N],a[N],l[N];
int n,m,k,q;
vector<int> g[N];
int fa[N][lgN+1],ps[N][lgN+1],dep[N];
int xj[N][lgN+1];
int p1[N];
void dfs(int x,int fa,int dp=1){
    ::fa[x][0]=fa;
    dep[x]=dp;
    for(auto v:g[x]){
        if(v!=fa)dfs(v,x,dp+1);
    }
}
vector<int> poss[N];
void evaldfs(int x,int fa){
    poss[a[x]].push_back(x);
    ps[x][0]=poss[a[x]+1].back();
    xj[x][0]=poss[a[x]-1].back();
    p1[x]=poss[1].back();
    for(auto v:g[x]){
        if(v!=fa)evaldfs(v,x);
    }
    poss[a[x]].pop_back();
}
void bitwor(){
    rep(i,1,lgN)rep(j,1,n)fa[j][i]=fa[fa[j][i-1]][i-1];
    rep(i,0,m+2)poss[i].push_back(0);
    evaldfs(1,0);
    rep(i,1,lgN)rep(j,1,n)ps[j][i]=ps[ps[j][i-1]][i-1];
    rep(i,1,lgN)rep(j,1,n)ps[j][i]=xj[xj[j][i-1]][i-1];
}
int lca(int u,int v){
    if(u==v)return u;
    if(dep[u]<dep[v])swap(u,v);
    per(i,lgN,0){
        if(dep[fa[u][i]]>=dep[v]){
            u=fa[u][i];
        }
    }
    if(u==v)return u;
    per(i,lgN,0){
        if(fa[u][i]!=fa[v][i])u=fa[u][i],v=fa[v][i];
    }
    return fa[u][0];
}
vector<pair<int,int>> querys[N];
vector<int> anss[N];
int climbup(int x,int y){
    int fr=0;
    int ans=0;
    for(int i=lgN;i>=0;i--){
        if(dep[ps[x][i]]>=dep[y]){
            x=ps[x][i];fr=1;
            ans+=(1<<i);
        }
    }
    if(!fr)return ans;
    else return ans+climbup(x,y);
}
int climbpb(int x,int y){
    int fr=0;
    int ans=0;
    for(int i=lgN;i>=0;i--){
        if(dep[xj[x][i]]>=dep[y]){
            x=xj[x][i];fr=1;
            ans+=(1<<i);
        }
    }
    if(!fr)return ans;
    else return ans+climbpb(x,y);
}
void avdfs(int x,int fa){
    poss[a[x]].push_back(x);
    for(auto [lc,w]:querys[x]){// 
        int l=-1,dlt=1<<lgN;
        while(dlt){
            if(w+l+dlt<=m){
                int tar=poss[w+l+dlt].back();
                if(dep[tar]<dep[lc]){
                    ;
                }else{
                    int zg=climbpb(tar,lc);
                    if(zg-l-dlt>=0){
                        l+=dlt;
                    }
                }
            }
            dlt>>=1;
        }
        anss[x].push_back(w+l);
    }
    for(auto v:g[x]){
        if(v!=fa)avdfs(v,x);
    }
    poss[a[x]].pop_back();
}
vector<pair<int,int>> Q;
signed main(){
    cin>>n>>m>>k;
    rep(i,1,k)cin>>p[i];
    rep(i,1,k)l[p[i]]=i;
    rep(i,1,n)cin>>a[i];
    rep(i,1,n)a[i]=l[a[i]];
    rep(i,1,n-1){
        int u,v;cin>>u>>v;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    dfs(1,0);
    bitwor();
    int q;cin>>q;
    while(q--){
        int u,v;cin>>u>>v;
        int lc=lca(u,v);
        u=p1[u];int w;
        if(dep[u]<dep[lc]){
            w=0;
        }
        else w=climbup(u,lc)+1;
        querys[v].push_back({lc,w+1});
        Q.push_back({v,querys[v].size()-1});
    }
    avdfs(1,0);
    for(auto [u,v]:Q){
        cout<<anss[u][v]<<'\n';
    }
}
2023/3/24 10:18
加载中...