Submission #1152438

#TimeUsernameProblemLanguageResultExecution timeMemory
1152438EsgeerArranging Shoes (IOI19_shoes)C++20
100 / 100
108 ms31752 KiB
#include "shoes.h" #include <bits/stdc++.h> #define int long long #define rint int32_t #define vr vector<rint> #pragma GCC optimize("O3") #define vi vector<int> #define vb vector<bool> #define F(i, s, e) for(int i = s; i < e; i++) #define sp <<' '<< #define pii pair<int, int> #define fi first #define se second #define pb push_back #define vvi vector<vi> #define vpi vector<pii> #define vvpi vector<vpi> #define endl '\n' using namespace std; const int N = 2e5+5; int t[N]; void update(int idx, int val) { idx++; while(idx > 0 && idx < N) { t[idx] += val; idx += (idx & -idx); } } int query(int idx) { idx++; int res = 0; while(idx > 0 && idx < N) { res += t[idx]; idx -= (idx & -idx); } return res; } int query(int l, int r) { if(l > r) return 0; return query(r) - query(l-1); } long long count_swaps(vr a) { // find the leftest shoe that was not paired yet -> shoe x // find the closest unpaired possible-pair for x // add the distance between to ans // mark both paired int n = a.size(); vector<bool> paired(n, 0); set<int> lefts[n+1]; set<int> rights[n+1]; F(i, 0, n) { update(i, 1); if(a[i] < 0) lefts[-a[i]].insert(i); else rights[a[i]].insert(i); } int ans = 0; F(i, 0, n) { if(paired[i]) continue; int sz = abs(a[i]); if(a[i] < 0) { int per = *rights[sz].begin(); //cout << i sp per << endl; ans += query(i+1, per-1); paired[i] = 1; paired[per] = 1; rights[sz].erase(per); lefts[sz].erase(i); update(per, -1); update(i, -1); } else { int per = *lefts[sz].begin(); //cout << i sp per << endl; ans += query(i, per-1); paired[i] = 1; paired[per] = 1; lefts[sz].erase(per); rights[sz].erase(i); update(per, -1); update(i, -1); } } 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...