Submission #887197

#TimeUsernameProblemLanguageResultExecution timeMemory
887197theghostkingArranging Shoes (IOI19_shoes)C++17
100 / 100
72 ms20948 KiB
#include "shoes.h" #include <bits/stdc++.h> using namespace std; vector<int> tree; int nc; int query(int a, int b){ a += nc; b += nc; int s = 0; while (a <= b){ if (a%2){ s += tree[a++]; } if (b%2 == 0){ s += tree[b--]; } a /= 2; b /= 2; } return s; } void update(int k, int x){ k += nc; tree[k] = x; k /= 2; while (k >= 1){ tree[k] = tree[2*k] + tree[2*k+1]; k /= 2; } } long long count_swaps(vector<int> s) { int n = s.size(); vector<vector<int>> pos(n), neg(n); for (int i = 0; i<n; i++){ int g = abs(s[i]); if (s[i] < 0){ neg[g].push_back(i); } else{ pos[g].push_back(i); } } for (int i = 0; i<n; i++){ reverse(pos[i].begin(),pos[i].end()); reverse(neg[i].begin(),neg[i].end()); } nc = 1; while ((1<<nc) < n) nc++; nc = 1<<nc; tree.resize(2*nc); for (int i = 0; i<n; i++){ tree[nc+i] = 1; } for (int i = nc-1; i>=1; i--){ tree[i] = tree[2*i] + tree[2*i+1]; } long long ans = 0; for (int i = 0; i<n; i++){ int val = s[i]; int g = abs(s[i]); if (s[i] > 0){ if (pos[g].empty() || pos[g].back() != i) continue; pos[g].pop_back(); } else{ if (neg[g].empty() || neg[g].back() != i) continue; neg[g].pop_back(); } int ind = -1; int rev = -s[i]; if (rev > 0){ ind = pos[g].back(); pos[g].pop_back(); } else{ ind = neg[g].back(); neg[g].pop_back(); } ans += query(i+1,ind-1); if (s[i] > 0) ans++; update(i,0); update(ind,0); } return ans; }

Compilation message (stderr)

shoes.cpp: In function 'long long int count_swaps(std::vector<int>)':
shoes.cpp:64:13: warning: unused variable 'val' [-Wunused-variable]
   64 |         int val = s[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...
#Verdict Execution timeMemoryGrader output
Fetching results...