Submission #824820

#TimeUsernameProblemLanguageResultExecution timeMemory
824820groguTourism (JOI23_tourism)C++14
28 / 100
5077 ms20752 KiB
#define here cerr<<"===========================================\n" #define dbg(x) cerr<<#x<<": "<<x<<endl; #include <bits/stdc++.h> #define ld double #define ll int #define ull unsigned long long #define llinf 100000000000000000LL // 10^17 #define iinf 2000000000 // 2*10^9 #define pb push_back #define eb emplace_back #define popb pop_back #define fi first #define sc second #define endl '\n' #define pii pair<int,int> #define pll array<ll,3> #define pld pair<ld,ld> #define all(a) a.begin(),a.end() #define ceri(a,l,r) {cerr<<#a<<": ";for(ll i_ = l;i_<=r;i_++) cerr<<a[i_]<< " ";cerr<<endl;} #define cer(a) {cerr<<#a<<": ";for(ll x_ : a) cerr<<x_<< " ";cerr<<endl;} #define si(a) (ll)(a.size()) using namespace std; #define maxn 100005 #define lg 21 ll n,m,q; vector<ll> g[maxn]; ll st[lg][maxn]; ll in[maxn],out[maxn],ti = 0; ll rev[maxn]; ll dub[maxn]; ll c[maxn]; pll a[maxn]; void dfs(ll u,ll p){ st[0][u] = p; dub[u] = dub[p] + 1; in[u] = ++ti; rev[ti] = u; for(ll s : g[u]){ if(s==p) continue; dfs(s,u); } out[u] = ti-1; } bool intree(ll x,ll y){return in[y]<=in[x]&&out[y]>=out[x];} ll lca(ll x,ll y){ if(intree(x,y)) return y; if(intree(y,x)) return x; for(ll j = lg-1;j>=0;j--){ if(!intree(x,st[j][y])) y = st[j][y]; } return st[0][y]; } ll dis(ll x,ll y){ return dub[x] + dub[y] - 2*dub[lca(x,y)]; } ll d = 100; bool cmp(pll x,pll y){ if(x[0]/d!=y[0]/d) return x[0]/d<y[0]/d; return x[1]<y[1]; } multiset<ll> s; ll ans = 0; void add(ll i){ ll x = c[i]; s.insert(in[x]); auto it = s.lower_bound(in[x]); ll y = -1,z = -1; if(it!=s.begin()){ it--; y = rev[*it]; ans+=dis(x,y); it++; } it++; if(it!=s.end()){ z = rev[*it]; ans+=dis(x,z); } if(z!=-1&&y!=-1) ans-=dis(z,y); } void del(ll i){ ll x = c[i]; auto it = s.lower_bound(in[x]); ll y = -1,z = -1; if(it!=s.begin()){ it--; y = rev[*it]; ans-=dis(x,y); it++; } it++; if(it!=s.end()){ z = rev[*it]; ans-=dis(x,z); } if(z!=-1&&y!=-1) ans+=dis(z,y); it--; s.erase(it); } ll rez[maxn]; int main(){ ios_base::sync_with_stdio(false);cerr.tie(0);cout.tie(0);cin.tie(0); cin >> n >> m >> q; for(ll i = 1;i<=n-1;i++){ ll x,y; cin >> x >> y; g[x].pb(y); g[y].pb(x); } dfs(1,1); for(ll j = 1;j<lg;j++) for(ll i = 1;i<=n;i++) st[j][i] = st[j-1][st[j-1][i]]; for(ll i = 1;i<=m;i++) cin >> c[i]; for(ll i = 1;i<=q;i++) cin >> a[i][0] >> a[i][1]; for(ll i = 1;i<=q;i++) a[i][2] = i; sort(a+1,a+1+q,cmp); ll tl = 1,tr = 1; add(1); for(ll i = 1;i<=q;i++){ while(tr<a[i][1]) add(++tr); while(tl>a[i][0]) add(--tl); while(tl<a[i][0]) del(tl++); while(tr>a[i][1]) del(tr--); ll y = rev[*s.begin()]; ll z = rev[*prev(s.end())]; rez[a[i][2]] = ans + dis(y,z); } for(ll i = 1;i<=q;i++){ cout<<rez[i]/2 + 1<<endl; } return (0-0); } /** 7 6 2 1 2 1 3 2 4 2 5 3 6 3 7 2 3 6 4 5 7 1 3 4 6 **/
#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...