Submission #535415

#TimeUsernameProblemLanguageResultExecution timeMemory
535415mario05092929Arranging Shoes (IOI19_shoes)C++14
100 / 100
235 ms142220 KiB
#include "shoes.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; int n,cnt,g; int a[200005],c[200005],t[800005]; queue <int> wi[200005]; int query(int x,int l,int r,int rl,int rr) { if(rl > r||l > rr) return 0; if(rl <= l&&r <= rr) return t[x]; int mid = (l + r) >> 1; return query(x*2,l,mid,rl,rr)+query(x*2+1,mid+1,r,rl,rr); } void update(int x,int l,int r,int wi) { if(wi < l||r < wi) return; if(l == r) { t[x] = 1; return; } int mid = (l + r) >> 1; update(x*2,l,mid,wi), update(x*2+1,mid+1,r,wi); t[x] = t[x*2]+t[x*2+1]; } ll count_swaps(vector <int> s) { n = s.size(); n /= 2; for(int i = 1;i <= 2*n;i++) a[i] = s[i-1]; for(int i = 1;i <= 2*n;i++) { wi[a[i]+n].push(i); } ll ans = 0; for(int i = 1;i <= 2*n;i++) { if(c[i]) continue; int x = a[i]; //cout << i << ' ' << wi[-x+n].front() << '\n'; if(x < 0) { ans += wi[-x+n].front()-i-query(1,1,2*n,i+1,wi[-x+n].front())-1; } else { ans += wi[-x+n].front()-i-query(1,1,2*n,i+1,wi[-x+n].front()); } update(1,1,2*n,wi[-x+n].front()); update(1,1,2*n,i); c[i] = c[wi[-x+n].front()] = 1; wi[-x+n].pop(); wi[x+n].pop(); } 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...