Submission #380021

#TimeUsernameProblemLanguageResultExecution timeMemory
380021madlogicArranging Shoes (IOI19_shoes)C++17
100 / 100
755 ms151916 KiB
#include <bits/stdc++.h> #include "shoes.h" using namespace std; struct SegmentTree { int n; vector<int> a, st; SegmentTree(vector<int> b) { n = (int) b.size(); a = b; st.resize(4 * n); build(0, n - 1, 1); } inline int L(int n) { return (n << 1); } int build(int l, int r, int node) { if (l == r) { st[node] = a[l]; return st[node]; } int mid = l + r >> 1; int left = build(l, mid, L(node)); int right = build(mid + 1, r, L(node) + 1); return st[node] = st[(node << 1)] + st[(node << 1) + 1]; } int query(int l, int r) { return rsq(0, n - 1, l, r, 1); } void update(int ind, int k) { upd(0, n - 1, ind, k, 1); } int upd(int l, int r, int ind, int val, int node) { if (l == r) { st[node] += val; return st[node]; } int mid = l + r >> 1; if (ind <= mid) upd(l, mid, ind, val, (node << 1)); else upd(mid + 1, r, ind, val, (node << 1) + 1); return st[node] = st[(node << 1)] + st[(node << 1) + 1]; } int rsq(int l, int r, int lb, int rb, int node) { if (l > rb || r < lb) return 0; if (l >= lb && r <= rb) return st[node]; int mid = l + r >> 1; int left = rsq(l, mid, lb, rb, L(node)); int right = rsq(mid + 1, r, lb, rb, L(node) + 1); return left + right; } }; long long count_swaps(std::vector<int> s) { int n = (int) s.size(); map<int, queue<int>> mp; for (int i = 0; i < n; i++) { mp[s[i]].push(i); } SegmentTree st(vector<int>(n, 0)); long long res = 0; vector<bool> vis(n); for (int i = 0; i < n; i++) { if (vis[i]) { continue; } int pos = mp[-s[i]].front(); vis[pos] = true; mp[-s[i]].pop(); mp[s[i]].pop(); int to; if (s[i] < 0) { to = i + 1; } else { to = i; } res += pos - to - st.query(to, pos); st.update(pos, 1); } return res; }

Compilation message (stderr)

shoes.cpp: In member function 'int SegmentTree::build(int, int, int)':
shoes.cpp:25:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   25 |     int mid = l + r >> 1;
      |               ~~^~~
shoes.cpp:26:9: warning: unused variable 'left' [-Wunused-variable]
   26 |     int left = build(l, mid, L(node));
      |         ^~~~
shoes.cpp:27:9: warning: unused variable 'right' [-Wunused-variable]
   27 |     int right = build(mid + 1, r, L(node) + 1);
      |         ^~~~~
shoes.cpp: In member function 'int SegmentTree::upd(int, int, int, int, int)':
shoes.cpp:44:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   44 |     int mid = l + r >> 1;
      |               ~~^~~
shoes.cpp: In member function 'int SegmentTree::rsq(int, int, int, int, int)':
shoes.cpp:57:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   57 |     int mid = l + r >> 1;
      |               ~~^~~
#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...