Submission #152066

#TimeUsernameProblemLanguageResultExecution timeMemory
152066oolimryArranging Shoes (IOI19_shoes)C++14
100 / 100
375 ms14280 KiB
#include <bits/stdc++.h> using namespace std; static int tree[500005]; long long N; void update(int x){ x += N; while(x > 0){ tree[x]++; x >>= 1; } } long long query(int l, int r){ long long ans = 0; for(l += N, r += N;l < r;l >>= 1, r >>= 1){ if(l&1){ ans += tree[l]; l++; } if(r&1){ r--; ans += tree[r]; } } return ans; } long long count_swaps(std::vector<int> s) { long long n = s.size() / 2; N = 2 * n; long long ans = 0; set<long long> things; for(int i = 0;i < 2 * n;i++){ if(s[i] < 0) s[i] = (s[i] * -1) - 1; else s[i] = s[i] - 1 + n; long long ss = s[i] * 1000000ll; things.insert(ss + i); } //for(int i = 0;i < 2 * n;i++) cout << nxt[i] << " "; int pos = 0; for(int i = 0;i < 2 * n;i++){ if(query(i,i+1) != 0) continue; int x = s[i]; int y = 0; if(x < n) y = x + n; else y = x - n; int l = i; //if(stuff[y].empty()) while(true) continue; long long rr = *things.lower_bound(y * 1000000ll); int r = rr % 1000000; //int r = stuff[y].front(); //stuff[y].pop(); //if(stuff[x].empty()) while(true) continue; //stuff[x].pop(); int nl = l + query(l+1,2*n); int nr = r + query(r+1,2*n); //cout << i << " " << l << " " << r << " " << nl << " " << nr << " " << ans << "\n"; if(x < n){ ans += (nl - 2 * pos); ans += (nr - (2 * pos + 1)); } else{ ans += (nr - 2 * pos); ans += (nl - (2 * pos + 1)); ans++; } pos++; update(l); update(r); things.erase(rr); //long long things.erase(x * 1000000ll + i); } return ans; }
#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...