제출 #1290384

#제출 시각아이디문제언어결과실행 시간메모리
1290384lambd47동기화 (JOI13_synchronization)C++20
100 / 100
913 ms24264 KiB
#include <bits/stdc++.h> #define int long long using namespace std; #define sz(v) ((int)(v).size()) #define all(v) (v).begin(), (v).end() #define L(i, j, k) for(int i = (j); i <= (k); ++i) #define R(i, j, k) for(int i = (j); i >= (k); --i) std::mt19937 rng(std::chrono::steady_clock::now().time_since_epoch().count()); const int MX=1e5+7; int n,m; int seg[4*MX],pai[MX]; int edLow[MX]; vector<pair<int,int>> adj[MX]; int tam[MX]; void update(int pos, int ini, int fim, int id){//posso mudar para perssegs e fazer o(nlog) mas mo preguica if(ini>id || fim<id)return; if(ini==fim){ seg[pos]^=1; return; } int m=(ini+fim)/2; update(2*pos,ini,m,id); update(2*pos+1,m+1,fim,id); seg[pos]=seg[2*pos]+seg[2*pos+1]; } int query(int pos, int ini, int fim, int l, int r){ if(ini>r || fim<l)return 0; if(l<= ini && fim<=r)return seg[pos]; int m=(ini+fim)/2; return query(2*pos,ini,m,l,r)+query(2*pos+1,m+1,fim,l,r); } int findTop(int l, int r){ if(l==r)return l; int m=(l+r)/2; if(query(1,0,n,m+1,r)==r-m)return findTop(l,m); return findTop(m+1,r); } int dfstam(int node){ tam[node]=1; for(auto [a,ide]:adj[node]){ if(tam[a]!=0)continue; pai[a]=node; edLow[ide]=a; tam[node]+=dfstam(a); } return tam[node]; } int head[MX]; int id[MX]; int tmp; vector<int> dfsOrd; void hld(int node,int h){ dfsOrd.push_back(node); id[node]=tmp++; head[node]=h; int hc=-1,peso=-1; for(auto [a,_]:adj[node]){ if(a==pai[node])continue; if(peso<tam[a]){ hc=a; peso=tam[a]; } } if(hc==-1)return; hld(hc,h); for(auto [a,_]:adj[node]){ if(a==hc || a==pai[node])continue; hld(a,a); } } int findGoat(int node){ int x=query(1,0,n,id[head[node]],id[node]); if(x==0)return node; if(x==(id[node]-id[head[node]]+1))return findGoat(pai[head[node]]); return dfsOrd[findTop(id[head[node]],id[node])]; } int arr[MX]; int brr[MX]; void update(int node){ int tipo=query(1,0,n,id[node],id[node]); if(tipo==1){//on e vai pra off arr[node]=arr[findGoat(node)]; brr[node]=arr[node]; update(1,0,n,id[node]); } else{ update(1,0,n,id[node]); arr[findGoat(node)]+=arr[node]-brr[node]; brr[node]=arr[node]; } } void solve() { adj[0].push_back({1,0}); tmp=0; int q; cin>>n>>m>>q; L(i,1,n){ arr[i]=1; brr[i]=0; } L(i,1,n-1){ int a,b;cin>>a>>b; adj[a].push_back({b,i}); adj[b].push_back({a,i}); } dfstam(0); hld(1,1); L(i,0,m-1){ int a;cin>>a; update(edLow[a]); } R(i,n-1,0){ int at=dfsOrd[i]; if(query(1,0,n,id[at],id[at]))update(at); } //L(i,1,n)cout<<arr[i]<<" "<<brr[i]<<"\n"; while(q--){ int a;cin>>a; cout<<arr[a]<<"\n"; } } int32_t main() { std::cin.tie(0)->sync_with_stdio(0); std::cin.exceptions(std::cin.failbit); int T = 1; // std::cin >> T; while(T--) { solve(); } 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...