Submission #931053

#TimeUsernameProblemLanguageResultExecution timeMemory
931053vjudge1Untitled (POI11_rot)C++17
63 / 100
481 ms27908 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 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=2e6+7; const int inf=1e9; int c[N], tin[N], tout[N], eul[N], sz[N], t[N*4], l[N], r[N], szz, a, b; vector <pair<int*, int>> rb; int n, timer, ans; void roll(int &x){ rb.push_back({&x, x}); } void tupd(int pos, int val, int v=1, int tl=1, int tr=n){ // roll(t[v]); if(tl == tr){ t[v] = val; return; } if(pos <= tm)tupd(pos, val, TL); else tupd(pos, val, 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 calc(int v){ if(c[v]){ a += get(1, c[v]); b += get(c[v], n); }else{ calc(l[v]); calc(r[v]); } } void add(int v, int x){ if(c[v]){ tupd(c[v], x); }else{ add(l[v], x); add(r[v], x); } } void go(int v=1, int cl=0){ if(c[v]){ if(cl==0)tupd(c[v], 1); return; } if(sz[l[v]] > sz[r[v]]){ swap(l[v], r[v]); } go(l[v], 1); go(r[v], 0); a=0, b=0; calc(l[v]); ans += min(a, b); if(cl)add(r[v], 0); else add(l[v], 1); } void rec(){ cin >> c[szz]; if(c[szz]){ tin[szz] = tout[szz] = ++timer; eul[timer] = c[szz]; sz[szz] = 1; } else{ int cur = szz; szz++; l[cur] = szz; rec(); szz++; r[cur] = szz; rec(); tin[cur] = tin[l[cur]]; tout[cur] = timer; sz[cur] = sz[l[cur]] + sz[r[cur]]; } } void AlemAmenov(){ cin >> n; szz=1; rec(); 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; }
#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...