Submission #376337

#TimeUsernameProblemLanguageResultExecution timeMemory
376337InternetPerson10Arranging Shoes (IOI19_shoes)C++14
100 / 100
104 ms16364 KiB
#include "shoes.h" #include <iostream> #include <cmath> typedef long long ll; using namespace std; struct FTree { vector<ll> nums; int size=1; void init(int n) { while(size < n) size *= 2; nums.resize(size+1); } void set(int n) { while(n <= size) { nums[n]++; n += (n & -(n)); } } ll get(int n) { ll ans = 0; while(n > 0) { ans += nums[n]; n -= (n & -(n)); } return ans; } void print() { for(int i = 0; i <= size; i++) cout << nums[i] << ' '; cout << '\n'; } }; vector<vector<int>> ct; bool taken[200002]; ll count_swaps(vector<int> s) { int n = s.size(); n /= 2; ll ans = 0; ct.resize(2*n+1); for(int i = 2*n-1; i >= 0; i--) { ct[n+s[i]].push_back(i+1); } FTree ft; ft.init(2*n); for(int i = 0; i < 2*n; i++) { if(taken[i]) continue; int x = s[i]; int a = ct[n+x].back(), b = ct[n-x].back(); ct[n+x].pop_back(); ct[n-x].pop_back(); if(x < 0) ans--; int bb = ft.get(b), aa = ft.get(a); ans += std::abs(b-a) - std::abs(bb - aa); ft.set(b); ft.set(a); taken[a-1] = taken[b-1] = true; } 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...