Submission #768299

#TimeUsernameProblemLanguageResultExecution timeMemory
768299Essa2006Synchronization (JOI13_synchronization)C++14
60 / 100
419 ms93236 KiB
#include<bits/stdc++.h> using namespace std; #define int long long #define endl '\n' #define FF first #define SS second #define all(a) a.begin(), a.end() #define mod (ll)(1000000007) const int inf=1e9, lg=20; int n, q1, q2, m, time_; vector<int>C, Dt, Ft, Bit; vector<vector<int>>A, Lca; map<int, pair<int, int>>mp; void pre(){ C.clear(), Dt.clear(), Ft.clear(), Bit.clear(), A.clear(), mp.clear(), Lca.clear(); C.resize(3*n, 1), Dt.resize(3*n), Ft.resize(3*n), Bit.resize(3*n), A.resize(3*n), Lca.resize(3*n, vector<int>(lg+1)); m=n-1, time_=1; } void dfs(int u, int p){ Dt[u]=time_++; Lca[u][0]=p; for(int j=1;j<=lg;j++){ Lca[u][j]=Lca[Lca[u][j-1]][j-1]; } for(int i=0;i<A[u].size();i++){ int v=A[u][i]; if(v!=p) dfs(v, u); } Ft[u]=time_++; } int g(int i){ return i-(i&(-i)); } int h(int i){ return i+(i&(-i)); } void inc(int ind, int delta){ while(ind<=2*n){ Bit[ind]+=delta; ind=h(ind); } } int get(int ind){ int sum=0; while(ind>=1){ sum+=Bit[ind]; ind=g(ind); } return sum; } int find_root(int u){ int lca=u; for(int j=lg;j>=0;j--){ if(get(Dt[u])==get(Dt[Lca[lca][j]])) lca=Lca[lca][j]; } return lca; } signed main(){ ios_base::sync_with_stdio(0);cin.tie(0); cin>>n>>q1>>q2; pre(); if(q2==1){ int cnt=1; while(m--){ int u, v; cin>>u>>v; A[u].push_back(v); A[v].push_back(u); mp[cnt++]={u, v}; } vector<bool>Active(n); vector<int>Q1(q1); for(int i=0;i<q1;i++){ cin>>Q1[i]; } int node; cin>>node; dfs(node, node); for(int i=1;i<=n;i++){ inc(Dt[i], 1); inc(Ft[i], -1); } for(int i=0;i<q1;i++){ int id=Q1[i]; int u=mp[id].FF, v=mp[id].SS; if(Lca[u][0]==v) swap(u, v); if(!Active[id]){ int root=find_root(u); C[root]+=C[v]; C[v]=0; inc(Dt[v], -1); inc(Ft[v], 1); } else if(Active[id]){ inc(Dt[v], 1); inc(Ft[v], -1); } Active[id]=!Active[id]; } cout<<C[node]<<endl; } else{ int cnt=1; while(m--){ int u, v; cin>>u>>v; if(u>v) swap(u, v); A[u].push_back(v); A[v].push_back(u); mp[cnt++]={u, v}; } vector<int>Mnf(n+1), Mxf(n+1); for(int i=1;i<=n;i++){ Mnf[i]=Mxf[i]=i; } set<array<int, 2>>S; for(int i=1;i<=n;i++){ S.insert({i, i}); } vector<bool>Active(n); while(q1--){ int id; cin>>id; int u=mp[id].FF, v=mp[id].SS; int L=u, R=v; array<int, 2>a={u, inf}; auto it=S.upper_bound(a); a=*--it; L=a[0]; a={v, inf}; it=S.upper_bound(a); a=*--it; R=a[1]; if(!Active[id]){ Mxf[L]=Mxf[R], Mnf[R]=Mnf[L]; a={u, inf}; it=S.upper_bound(a); S.erase(--it); a={v, inf}; it=S.upper_bound(a); S.erase(--it); S.insert({L, R}); } else{ Mnf[u]=Mnf[v]=Mnf[L]; Mxf[u]=Mxf[v]=Mxf[R]; a={L, R}; S.erase(a); S.insert({L, u}); S.insert({v, R}); } Active[id]=!Active[id]; } for(int i=2;i<=n;i++){ Mxf[i]=max(Mxf[i], Mxf[i-1]); } for(int i=n-1;i>=1;i--){ Mnf[i]=min(Mnf[i], Mnf[i+1]); } while(q2--){ int x; cin>>x; cout<<Mxf[x]-Mnf[x]+1<<endl; } } }

Compilation message (stderr)

synchronization.cpp: In function 'void dfs(long long int, long long int)':
synchronization.cpp:26:18: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   26 |     for(int i=0;i<A[u].size();i++){
      |                 ~^~~~~~~~~~~~
#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...