Submission #867129

#TimeUsernameProblemLanguageResultExecution timeMemory
867129gazizmadi11Untitled (POI11_rot)C++14
63 / 100
550 ms65536 KiB
//gm --- akezhon #include <bits/stdc++.h> //#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math,O3") //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native") // #define int long long #define pb push_back #define F first #define S second #define all(v) v.begin(),v.end() #define pii pair<int,int> #define tm (tl+tr)/2 #define TL v+v, tl, tm #define TR v+v+1, tm+1, tr #define DA l <= tl && tr <= r #define NET r < tl || tr < l #define double long double using namespace std; const int N=4e5+7; const int M=1e9+7; const int NN=2e5+7; const int inf=1e9; int c[N], tin[N], tout[N], eul[N], sz[N], big[N], t[N], l[N], r[N], szz; vector <pair<int*, int>> rb; int n, timer, cur, ans; void roll(int &x){ rb.push_back({&x, x}); } void tupd(int pos, int v=1, int tl=1, int tr=n){ roll(t[v]); if(tl == tr){ t[v]=1; return; } if(pos <= tm)tupd(pos, TL); else tupd(pos, TR); t[v] = t[v+v] + t[v+v+1]; } int get(int l, int r, int v=1, int tl=1, int tr=n){ if(NET)return 0; if(DA)return t[v]; return get(l, r, TL) + get(l, r, TR); } void dfs(int v=1){ tin[v] = ++timer; eul[timer] = v; sz[v] = 1; if(!c[v]){ dfs(l[v]); dfs(r[v]); sz[v] += sz[l[v]]; sz[v] += sz[r[v]]; if(sz[r[v]] > sz[l[v]])big[v] = r[v]; else big[v] = l[v]; } tout[v] = timer; } void go(int v=1, int cl=0){ if(c[v]){ if(!cl)tupd(c[v]); return; } int temp = rb.size(), ok=0, cntkeep=0, cntswap=0, x = l[v]; if(big[v] == l[v]){ x = r[v]; ok = 1; } go(x, 1); go(big[v], 0); for(int i=tin[x]; i <= tout[x]; i++){ int f = eul[i]; if(c[f]){ if(ok){ cntkeep += get(c[f], n); cntswap += get(1, c[f]); } else { cntkeep += get(1, c[f]); cntswap += get(c[f], n); } } } ans += min(cntkeep, cntswap); if(cl){ while(temp < rb.size()){ *(rb.back().F) = rb.back().S; rb.pop_back(); } } else{ for(int i=tin[x]; i <= tout[x]; i++){ int f = eul[i]; if(c[f])tupd(c[f]); } } } void rec(){ cin >> c[szz]; if(!c[szz]){ int cur = szz; szz++; l[cur] = szz; rec(); szz++; r[cur] = szz; rec(); } } void AlemAmenov(){ cin >> n; szz=1; rec(); dfs(); go(); cout << ans; } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); // freopen("promote.in", "r", stdin); // freopen("promote.out", "w", stdout); int RealName=1; // cin >> RealName; // int C=0; while(RealName--){ // cout << "Case " << ++C << ":\n"; AlemAmenov(); } return 0; }

Compilation message (stderr)

rot.cpp: In function 'void go(int, int)':
rot.cpp:86:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int*, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   86 |   while(temp < rb.size()){
      |         ~~~~~^~~~~~~~~~~
#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...
#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...