Submission #119524

#TimeUsernameProblemLanguageResultExecution timeMemory
119524popovicirobertUntitled (POI11_rot)C++14
0 / 100
152 ms11888 KiB
#include <bits/stdc++.h> #define lsb(x) (x & (-x)) #define ll long long #define ull unsigned long long // 217 // 44 /* const int MOD = ; inline void mod(int &x) { if(x >= MOD) x -= MOD; } inline void add(int &x, int y) { x += y; mod(x); } inline void mul(int &x, int y) { x = (1LL * x * y) % MOD; } */ using namespace std; //ifstream fin("B.in"); //ofstream fout("B.out"); const int MAXN = (int) 4e5; int idl[MAXN + 1], idr[MAXN + 1], sz; int son[MAXN + 1][2]; vector <int> arr; int read(int &id) { int x, root = id; cin >> x; if(x == 0) { int a = read(++id), b = read(++id); son[root][0] = a, son[root][1] = b; idl[root] = idl[a], idr[root] = idr[b]; } else { idl[root] = idr[root] = ++sz; arr.push_back(x); } return root; } int aib[MAXN + 1], n; inline void update(int pos, int val) { for(int i = pos; i <= n; i += lsb(i)) { aib[i] += val; } } inline int query(int pos) { int ans = 0; for(int i = pos; i > 0; i -= lsb(i)) { ans += aib[i]; } return ans; } vector <int> stk; bool vis[MAXN + 1]; ll tot; void dfs(int nod) { vis[nod] = 1; int a = son[nod][0], b = son[nod][1]; if(idr[b] - idl[b] > idr[a] - idl[a]) { swap(a, b); } if(a == 0 && b == 0) { update(arr[idl[nod]], 1); stk.push_back(arr[idl[nod]]); return ; } dfs(a); ll cur = 0; for(int i = idl[b]; i <= idr[b]; i++) { cur += query(n) - query(arr[i]); } for(int i = idl[b]; i <= idr[b]; i++) { update(arr[i], 1); stk.push_back(arr[i]); } int len = idr[a] + idr[b] - idl[a] - idl[b] + 2; tot += min(cur, 1LL * len * (len - 1) / 2 - cur); } int main() { int i; ios::sync_with_stdio(false); cin.tie(0), cout.tie(0); cin >> n; arr.resize(1); int id = 1; int root = read(id); for(i = 1; i <= id; i++) { if(vis[i]) { continue; } dfs(i); for(auto it : stk) { update(it, -1); } stk.clear(); } cout << tot; //fin.close(); //fout.close(); return 0; }

Compilation message (stderr)

rot.cpp: In function 'int main()':
rot.cpp:114:9: warning: unused variable 'root' [-Wunused-variable]
     int root = read(id);
         ^~~~
#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...