Submission #820133

#TimeUsernameProblemLanguageResultExecution timeMemory
820133AlphaMale06Arranging Shoes (IOI19_shoes)C++14
10 / 100
20 ms7056 KiB
#include <bits/stdc++.h> #include "shoes.h" using namespace std; using ll = long long; #define mp make_pair #define F first #define S second #define pb push_back const int N = 100010; int st[4*N]; void Build(int node, int l, int r){ if(l>r)return; if(l==r){ st[node]=1; return; } int mid=(l+r)/2; Build(2*node+1, l, mid); Build(2*node+2, mid+1, r); st[node]=st[2*node+1]+st[2*node+2]; } void Update(int node, int l, int r, int ind){ if(l>r || l>ind || r<ind)return; if(l==r){ st[node]=0; return; } int mid=(l+r)/2; Update(2*node+1, l, mid, ind); Update(2*node+2, mid+1, r, ind); st[node]=st[2*node+1]+st[2*node+2]; } int Get(int node, int l, int r, int L, int R){ if(l>r || l>R || r<L)return 0; else if(L<=l && R>=r){ return st[node]; } int mid=(l+r)/2; return Get(2*node+1, l, mid, L, R)+Get(2*node+2, mid+1, r, L, R); } long long count_swaps(std::vector<int> s) { int n=s.size(); Build(0, 0, n-1); ll ans=0; bool used[n]={0}; set<pair<int, int>, less<pair<int, int>>> skup; for(int i=0; i< n; i++){ if(used[i]){ continue; } if(skup.empty()){ skup.insert(mp(s[i], i)); continue; } auto ptr = skup.lower_bound(mp(-s[i], -1)); pair<int, int> p=*ptr; if(ptr==skup.end() || p.F != -s[i]){ skup.insert(mp(s[i], i)); } else{ if(s[i]<0)ans++; ans+=Get(0, 0, n-1, p.S, i); ans-=2; Update(0, 0, n-1, i); Update(0, 0, n-1, p.S); used[p.S]=true; used[i]=true; skup.erase(ptr); } } 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...