Submission #1303677

#TimeUsernameProblemLanguageResultExecution timeMemory
1303677zhangspicyuwuTourism (JOI23_tourism)C++20
100 / 100
275 ms28144 KiB
#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define pll pair<long long,long long>
#define ll long long
//#define int long long
using namespace std;
const int N=1e5+5,mod=1e9+7,imod=(mod+1)/2;
const long long inf=1e18;
vector<int> adj[N];
int n,m,q,par[N],head[N],pos[N],sz[N],h[N],up[N],idd,arr[N],a[17][N],ans[N];
void pre_dfs(int u,int p){
    h[u]=h[p]+1;
    par[u]=p;
    sz[u]=1;
    for(const int v:adj[u]){
        if(v==p) continue;
        pre_dfs(v,u);
        sz[u]+=sz[v];
    }
}
void hld(int u,int x){
    head[u]=x;
    pos[u]=++idd;
    arr[idd]=u;
    int t1=0;
    for(const int v:adj[u]){
        if(v==par[u]) continue;
        if(sz[v]>sz[t1]) t1=v;
    }
    if(t1) hld(t1,x);
    for(const int v:adj[u]){
        if(v==par[u] || v==t1) continue;
        hld(v,v);
    }
}
int lca(int u,int v){
    while(head[u]!=head[v]){
        if(h[head[u]]<h[head[v]]) swap(u,v);
        u=par[head[u]];
    }
    if(h[u]>h[v]) return v;
    else return u;
}
int lg[N],fen[N];
int getlca(int l,int r){
    const int t=lg[r-l+1];
    return lca(a[t][l],a[t][r-(1<<t)+1]);
}
void add(int u,int val){
    while(u){
        fen[u]+=val;
        u-=(u&-u);
    }
}
int get(int u){
    int ans=0;
    while(u<=m){
        ans+=fen[u];
        u+=(u&-u);
    }
    return ans;
}
int seg[4*N];
void down(int crr){
    if(seg[crr]){
        const int x=seg[crr]; seg[crr]=0;
        seg[crr*2]=seg[crr*2+1]=x;
    }
}
void upd(int crr,int l,int r,int lm,int rm,int val){
    if(l>rm || lm>r) return;
    if(lm<=l && r<=rm){
        seg[crr]=val;
        return;
    }
    down(crr);
    int mid=l+r>>1;
    upd(crr*2,l,mid,lm,rm,val);
    upd(crr*2+1,mid+1,r,lm,rm,val);
}
int get(int crr,int l,int r,int id){
    if(l==r) return seg[crr];
    down(crr);
    int mid=l+r>>1;
    if(id<=mid) return get(crr*2,l,mid,id);
    else return get(crr*2+1,mid+1,r,id);
}
void upd(int u,const int c){
    while(u){
        upd(1,1,n,pos[head[u]],pos[u],c);
        u=par[head[u]];
    }
}
vector<pii> event[N];
signed main(){
    //freopen("GAME.inp","r",stdin);
    //freopen("MESSAGE.out","w",stdout);
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin>>n>>m>>q;
    for(int i=1;i<n;i++){
        int u,v; cin>>u>>v;
        adj[u].push_back(v); adj[v].push_back(u);
    }
    pre_dfs(1,0); hld(1,1);
    for(int i=1;i<=m;i++) cin>>a[0][i];
    for(int i=2;i<=m;i++) lg[i]=lg[i/2]+1;
    for(int j=1;j<17;j++){
        for(int i=1;i+(1<<j)-1<=m;i++){
            a[j][i]=lca(a[j-1][i],a[j-1][i+(1<<j-1)]);
        }
    }
    for(int i=1;i<=q;i++){
        int l,r; cin>>l>>r;
        event[r].push_back({l,i});
    }
    for(int i=1;i<=m;i++){
        int u=a[0][i];
        while(u && get(1,1,n,pos[u])==0){
            u=par[u];
        }
        while(u){
            const int col=get(1,1,n,pos[u]),nw=up[col];
            //cout<<"U: "<<u<<" "<<col<<"\n";
            add(col,h[nw]-h[u]);
            up[col]=u;
            u=nw;
        }
        u=a[0][i]; add(i,h[u]); upd(u,i);
        for(const pii j:event[i]){
            ans[j.se]=get(j.fi);
            int v=par[getlca(j.fi,i)];
            while(v){
                const int col=get(1,1,n,pos[v]),nw=up[col];
                if(col>=j.fi) ans[j.se]-=h[v]-h[nw];
                //cout<<"G: "<<v<<" "<<col<<"\n";
                v=nw;
            }
        }
    }
    for(int i=1;i<=q;i++) cout<<ans[i]<<"\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...