Submission #1261229

#TimeUsernameProblemLanguageResultExecution timeMemory
1261229user736482Tourism (JOI23_tourism)C++20
100 / 100
1920 ms93052 KiB
#pragma GCC optimize("O3")
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ld long double
#define pb push_back
#define ff first
#define ss second
#define MOD 1000000007
#define INF 1000000019
#define POT (1<<20)
#define INFL 1000000000000000099
ll odp[100007];
pair<ll,ll> par[100007];
vector<pair<ll,ll>>g[100007],d[100007];
vector<pair<pair<ll,ll>,ll>>ak,ak2;
bool czy[100007],czy2[100007];
ll mn[100007];
ll mx[100007];

ll sg[POT];

void add(ll v,ll pocz,ll kon,ll l,ll r,ll x){
    if(l>kon || r<pocz)return;
    if(kon>=r && pocz<=l)sg[v]+=x;
    else{
        add(v*2,pocz,kon,l,(l+r)/2,x);
        add(v*2+1,pocz,kon,(l+r)/2+1,r,x);
    }
}

ll gt(ll v){
    v+=POT/2-1;
    ll ans=0;
    while(v){
        ans+=sg[v];
        v/=2;
    }
    return ans;
}
void dfs3(ll v,ll pop,ll x){
    //  cout<<v<<" "<<czy[v]<<"  "<<flush;
    par[v]={pop,x};
    ll cnt=0;
    ll x2=0;
    for(auto i : g[v]){
        if(i.ff!=pop){
            d[v].pb(i);
            dfs3(i.ff,v,i.ss);
            if(czy2[i.ff]){
                cnt++;
            }
        }
    }
    
    if(cnt>1)czy[v]=1;
    if(czy[v] || cnt>0)czy2[v]=1;
    else czy2[v]=0;
    //cout<<v<<" "<<czy[v]<<"\n"<<flush;

    return;
}
void dfs4(ll v,ll pop,ll x){
    //  cout<<v<<" "<<czy[v]<<"  "<<flush;
    par[v]={pop,x};
    ll cnt=0;
    ll x2=0;
    for(auto i : g[v]){
        if(i.ff!=pop){
            dfs4(i.ff,v,i.ss);
        }
    }
    
    //cout<<v<<" "<<czy[v]<<"\n"<<flush;
    if(czy[v] && v!=pop){
        ll x3=par[v].ss;
        ll pom=par[v].ff;
        while(!czy[pom]){
            x3+=par[pom].ss;
            pom=par[pom].ff;
        }
        ak.pb({{pom,v},x3});
    }

    return;
}
void dfs(ll v,ll pop,ll x){
  dfs3(v,pop,x);dfs4(v,pop,x);
}

void dfs2(ll v,ll x){
    for(auto i : d[v]){
        dfs2(i.ff,i.ss);
        mn[v]=min(mn[v],mn[i.ff]);
        mx[v]=max(mx[v],mx[i.ff]);
    }
    ak.pb({{mx[v],mn[v]},x});
}

void solve(vector<pair<pair<ll,ll>,ll>>e,ll n,vector<pair<pair<ll,ll>,ll>>zap,vector<ll>arr){
   // for(ll i=1;i<POT;i++)sg[i]=0;
   /* cout<<n<<"\n"<<flush;
    for(auto i : e){
        cout<<i.ff.ff<<" "<<i.ff.ss<<" "<<i.ss<<"\n"<<flush;
    }
    cout<<"\n"<<flush;
    for(auto i :zap){
        cout<<i.ff.ff<<" "<<i.ff.ss<<" "<<i.ss<<"\n"<<flush;
    }
    cout<<"\n"<<flush;
    for(ll i : arr)cout<<i<<" ";
    cout<<"\n\n\n"<<flush;*/
    ak.clear();
    for(ll i=1;i<=n;i++){g[i].clear();czy[i]=0;d[i].clear();}
    for(auto i : e){
        g[i.ff.ff].pb({i.ff.ss,i.ss});
        g[i.ff.ss].pb({i.ff.ff,i.ss});
    }
    ll md=arr.size()/2;
    for(ll i : arr)czy[i]=1;
    dfs(arr[md],arr[md],0);
   /* for(auto i : ak){
        cout<<i.ff.ff<<" "<<i.ff.ss<<" "<<i.ss<<"\n"<<flush;
    }
    cout<<"\n"<<flush;*/
    for(ll i=1;i<=n;i++){g[i].clear();czy[i]=0;d[i].clear();}
    ll pm=1;
    map<ll,ll>sk;
    ak2.clear();
    swap(ak,ak2);
    for(auto i : ak2){
        if(sk[i.ff.ff]==0)sk[i.ff.ff]=pm++;
        if(sk[i.ff.ss]==0)sk[i.ff.ss]=pm++;
        ak.pb({{sk[i.ff.ff],sk[i.ff.ss]},i.ss});
    }
    
  /*  for(auto i : ak){
        cout<<i.ff.ff<<" "<<i.ff.ss<<" "<<i.ss<<"\n"<<flush;
    }
    cout<<"\n"<<flush;
    cout<<pm<<" ";*/
    n=pm-1;
    for(ll i=0;i<arr.size();i++)arr[i]=sk[arr[i]];
    for(ll i : arr)czy[i]=1;
   // cout<<"\n"<<flush;
   // for(ll i : arr)cout<<i<<" ";cout<<"\n"<<flush;
    for(ll i=1;i<=n;i++){
        mn[i]=INFL;
        mx[i]=-1;
    }
    for(auto i : ak){
        g[i.ff.ff].pb({i.ff.ss,i.ss});
        g[i.ff.ss].pb({i.ff.ff,i.ss});
    }
     auto akk=ak;
  //   cout<<"xd"<<flush;
    dfs(arr[md],arr[md],0);
  /*  cout<<"xd"<<flush;
    for(ll i=1;i<=n;i++){
        cout<<i<<": ";
        for(auto j : d[i])cout<<j.ff<<" "<<j.ss<<"   ";
        cout<<"\n"<<flush;
    }
        */
    for(ll i=0;i<md;i++){
        mx[arr[i]]=i;
    }
    for(ll i=md+1;i<arr.size();i++)mn[arr[i]]=min(mn[arr[i]],i);
    ak.clear();
    dfs2(arr[md],0);
    vector<pair<pair<ll,ll>,ll>>moj,lewe,prawe;
    for(auto i : zap){
        
        if(i.ff.ss<=md)lewe.pb(i);
        else if(i.ff.ff>md+1)prawe.pb(i);
        else {moj.pb(i);moj.back().ff.ss*=-1;}
    }
    for(ll i=0;i<prawe.size();i++){
        prawe[i].ff.ff-=(md+1);
        prawe[i].ff.ss-=(md+1);
    }
   // cout<<"\n"<<flush;
  //  for(ll i=1;i<=n;i++){
   //     cout<<mn[i]<<" "<<mx[i]<<"\n"<<flush;
  //  }
    
    vector<pair<ll,ll>>op;
    for(auto i : ak){
        op.pb({POT/2,-i.ss});
        op.pb({i.ff.ss,i.ss});
        moj.pb({{0,POT/2},i.ss});
        moj.pb({{i.ff.ff+1,i.ff.ss},-i.ss});
    }
    sort(moj.begin(),moj.end());
    for(auto i : moj){
       // cout<<i.ff.ff<<" "<<i.ff.ss<<" "<<i.ss<<"\n"<<flush;
        if(i.ff.ss>=0){
            
            add(1,1,i.ff.ss,1,POT/2,i.ss);
        }
        else{
            i.ff.ss*=-1;
            odp[i.ss]=gt(i.ff.ss);
         //   cout<<odp[i.ss]<<" ";
        }
    }
    for(auto i : op){
        add(1,1,i.ff,1,POT/2,i.ss);
    }
    
    vector<ll>a1,a2;
    for(ll i=0;i<md;i++)a1.pb(arr[i]);
    for(ll i=md+1;i<arr.size();i++)a2.pb(arr[i]);
    //cout<<md<<" "<<a1.size()<<" a "<<a2.size()<<"\n"<<flush;
   
    if(a1.size()){
     //   cout<<"lw: ";
    
    solve(akk,n,lewe,a1);}
    if(a2.size()){//cout<<"pw: ";
    solve(akk,n,prawe,a2);}
    //cout<<"back";
}

ll n,m,q;
vector<pair<pair<ll,ll>,ll>>e;
vector<ll>arr;
vector<pair<pair<ll,ll>,ll>>zap;
int main(){
    cin>>n>>m>>q;
    ll a,b;
    for(ll i=0;i<n-1;i++){
        cin>>a>>b;
        e.pb({{a,b},1});
    }
    for(ll i=0;i<m;i++){
        cin>>a;
        arr.pb(a);
    }
    for(ll i=0;i<q;i++){
        cin>>a>>b;
        zap.pb({{a,b},i});
    }
    solve(e,n,zap,arr);
    for(ll i=0;i<q;i++)cout<<odp[i]+1<<"\n"<<flush;
}   
#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...