Submission #1246857

#TimeUsernameProblemLanguageResultExecution timeMemory
1246857sofiefuArranging Shoes (IOI19_shoes)C++20
100 / 100
389 ms31720 KiB
#include <bits/stdc++.h> #include "shoes.h" using namespace std; #define int long long #define vo vector #define pb push_back #define fi first #define se second #define all(x) x.begin(), x.end() typedef vector<int> vi; typedef pair<int, int> pii; typedef long long ll; #define rep(i, a, b) for(int i=(a); i<(b); i++) #define repd(i, a, b) for(int i=(b-1); i>=(a); i--) #define pr(x) cerr << #x << " = " << x << endl; int const inf = 1e18, mxn = 2e5+4; int n; struct segtree{ vi seg; int n; segtree(int _n): n(_n), seg(_n*4, 0){} void upd(int v, int l, int r, int pos, int add){ if(l==r) {seg[v]+=add; return;} int mid = (l+r)/2; if(pos<=mid) upd(v*2+1, l, mid, pos, add); else upd(v*2+2, mid+1, r, pos, add); seg[v] = seg[v*2+1] + seg[v*2+2]; } int qry(int v, int l, int r, int ql, int qr){ if(ql<=l && r<=qr) return seg[v]; if(ql>r || l>qr) return 0; int mid = (l+r)/2; return qry(2*v+1, l, mid, ql, qr) + qry(2*v+2, mid+1, r, ql, qr); } }; int count_swaps(vector<signed> inp){ n = inp.size()/2; vi fixed(2*n); map<int, vi> occ; segtree seg(2*n); repd(i, 0, 2*n){ seg.upd(0, 0, seg.n-1, i, 1); occ[inp[i]].pb(i); } int i = 0, ans = 0; while(i<2*n){ if(fixed[i]) {i++; continue;} int x = inp[i]; vi &tmp = occ[-x]; int nex = tmp.back(); tmp.pop_back(); occ[x].pop_back(); fixed[i] = fixed[nex] = 1; seg.upd(0, 0, seg.n-1, i, -1); seg.upd(0, 0, seg.n-1, nex, -1); if(x<0) ans += seg.qry(0, 0, seg.n-1, i, nex); else ans += seg.qry(0, 0, seg.n-1, i, nex) + 1; i++; } return ans; } /* 3 -1 -1 -3 1 1 3 svar: 2+2+1=5 */
#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...