Submission #1303341

#TimeUsernameProblemLanguageResultExecution timeMemory
1303341aloo123Arranging Shoes (IOI19_shoes)C++20
50 / 100
1095 ms16040 KiB
#include "shoes.h" #include <set> #include <map> #include <climits> #include <iostream> #include <assert.h> using namespace std; long long count_swaps(std::vector<int> s) { int n = s.size() / 2; long long ans = 0; multiset<int> se; for(int &x: s) { if(x > 0) se.insert(x); } for(int i = 0;i<n*2;i+=2) { // get to 0 map<int,int> posL, posR; for(int j = i;j<(int)s.size();j++) { if(s[j] < 0) { if(posL.count(s[j]) == 0) posL[s[j]] = j; else posL[s[j]] = min(posL[s[j]], j); }else { if(posR.count(s[j]) == 0) posR[s[j]] = j; else posR[s[j]] = min(posR[s[j]], j); } } int which = -1; int mn = INT_MAX; for(auto yo: posL) { int cst = (yo.second - i) + (posR[-yo.first] - i); if(yo.second < posR[-yo.first]) cst--; if(cst < mn) { which = yo.first; mn = cst; } } int L = posL[which]; int R = posR[-which]; if(posL[which] < posR[-which]) { s.erase(s.begin() + posL[which]); s.erase(s.begin() + posR[-which] - 1); }else { assert(posR[-which] < posL[which]); s.erase(s.begin() + posR[-which]); s.erase(s.begin() + posL[which] - 1); } s.insert(s.begin() + i, which); s.insert(s.begin() + i+1, -which); ans += mn; // cout << "which = " << which << endl; // for(int &x: s) cout << x << " "; // cout << endl; } return ans; } // . . . . . -1 -2 2 ...... 1 // pos[-1] + pos[1] // min(pos[-L] + pos[+L]) // h j k l -1 1 // 5 // -x +x -> pos[-x] + pos[x] - 1 // +x -x -> pos[-x] + pos[x] // // .... 1. - // int main() { // cout << count_swaps({-2, 2, 2, -2, -2, 2}) << endl; // return 0; // }
#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...