Submission #954042

#TimeUsernameProblemLanguageResultExecution timeMemory
954042owoovoTourism (JOI23_tourism)C++17
24 / 100
719 ms34660 KiB
#include<bits/stdc++.h> #define ll long long #define MP make_pair #define F first #define S second using namespace std; int f[100010],si[100010],hs[100010],top[100010],dep[100010],in[100010],cnt; int n,m,q; vector<int> e[100010]; int dfs1(int now,int last){ dep[now]=dep[last]+1; f[now]=last; si[now]=1; for(auto x:e[now]){ if(x==last)continue; int siz=dfs1(x,now); if(siz>si[hs[now]]){ hs[now]=x; } si[now]+=siz; } return si[now]; } void dfs2(int now,int tp){ in[now]=++cnt; top[now]=tp; if(hs[now]!=0)dfs2(hs[now],tp); for(auto x:e[now]){ if(x==f[now]||x==hs[now])continue; dfs2(x,x); } return; } struct Bit{ int ori[100010]={}; void modify(int p,int x){ while(p<=100000){ ori[p]+=x; p+=p&(-p); } return ; } int query(int p){ int ans=0; while(p){ ans+=ori[p]; p-=p&(-p); } return ans; } }bit; int ans[100010],ver[100010]; vector<pair<pair<int,int>,int>> qu; set<pair<pair<int,int>,int>>st; void segin(int l,int r,int id){ if(l>r)swap(l,r); //cout<<l<<" "<<r<<" "<<id<<" x\n"; auto oi=st.lower_bound({{l+1,0},0}); auto tar=oi; vector<pair<pair<int,int>,int>> add={}; vector<set<pair<pair<int,int>,int>>::iterator> del={}; if(tar!=st.begin()&&(*(prev(tar))).F.S>=l)oi=prev(oi); tar=oi; //cout<<l<<" "<<r<<" "<<id<<"\n"; while(tar!=st.end()&&(*tar).F.F<=r){ auto [x,ID]=*tar; auto [L,R]=x; del.push_back(tar); //cout<<L<<" "<<R<<" "<<l<<" "<<r<<" "<<id<<" "<<ID<<"\n"; if(l<=L&&R<=r){ bit.modify(ID,L-R-1); }else if(L<l&&R<=r){ add.push_back(MP(MP(L,l-1),ID)); bit.modify(ID,l-R-1); }else if(l<=L&&r<R){ add.push_back(MP(MP(r+1,R),ID)); bit.modify(ID,L-r-1); }else{ add.push_back(MP(MP(L,l-1),ID)); add.push_back(MP(MP(r+1,R),ID)); bit.modify(ID,l-r-1); } tar=next(tar); } if(del.size()!=0)st.erase(del[0],next(del[del.size()-1])); // for(auto x:del){ // //cout<<"DEL "<<(*x).F.F<<" "<<(*x).F.S<<" "<<(*x).S<<"\n"; // st.erase(x); // } for(auto x:add){ //cout<<"ADD "<<x.F.F<<" "<<x.F.S<<" "<<x.S<<"\n"; st.insert(x); } st.insert({{l,r},id}); bit.modify(id,r-l+1); return; } void putin(int u,int v,int id){ while(1){ //cout<<u<<" "<<v<<" "<<id<<"\n"; if(top[u]==top[v]){ segin(in[v],in[u],id); break; } if(dep[top[u]]<dep[top[v]])swap(u,v); segin(in[top[u]],in[u],id); u=f[top[u]]; } return; } int main(){ ios::sync_with_stdio(0); cin.tie(0); cin>>n>>m>>q; for(int i=1;i<n;i++){ int u,v; cin>>u>>v; e[u].push_back(v); e[v].push_back(u); } dfs1(1,1); dfs2(1,1); for(int i=1;i<=m;i++){ cin>>ver[i]; } for(int i=1;i<=q;i++){ int l,r; cin>>l>>r; if(l==r){ ans[i]=1; continue; } qu.push_back({{l,r},i}); } sort(qu.begin(),qu.end()); reverse(qu.begin(),qu.end()); int now=0; for(int i=m-1;i>=1;i--){ //cout<<i<<"ok\n"; //put in i,i+1 putin(ver[i],ver[i+1],i+1); while(now!=q&&qu[now].F.F==i){ auto [x,id]=qu[now]; auto [l,r]=x; ans[id]=bit.query(r); now++; } } for(int i=1;i<=q;i++)cout<<ans[i]<<"\n"; return 0; }
#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...