Submission #1284646

#TimeUsernameProblemLanguageResultExecution timeMemory
1284646RaresArranging Shoes (IOI19_shoes)C++20
50 / 100
29 ms13744 KiB
#include <bits/stdc++.h> using namespace std; /**ifstream fin ("date.in"); ofstream fout ("date.out"); #define cin fin #define cout fout*/ typedef long long ll; const int MAXN=1e5+10; int n; bool ok[MAXN]; ll rez; vector <int> v; vector <int> ap[2][MAXN]; int aib[MAXN]; void update (int pos, int val){ for (int i=pos;i<=n;i+=(i&(-i)))aib[i]+=val; } void update (int l, int r, int val){ update (l,val); update (r+1,-val); } int query (int pos){ int rez=0; for (int i=pos;i>0;i-=(i&(-i))) rez+=aib[i]; return rez; } int query (int l,int r){ return query (r)-query (l-1); } ll count_swaps (vector <int> aux){ n=aux.size (); v.resize (n+1); for (int i=0;i<n;++i){ v[i+1]=aux[i]; } for (int i=n;i>=1;--i){ if (v[i]<0) ap[0][-v[i]].push_back (i); else ap[1][v[i]].push_back (i); } for (int i=1;i<=n;++i){ if (ok[i]) continue; int crt=v[i],pos=0; if (crt<0){ pos=ap[1][-crt].back (); ap[1][-crt].pop_back (); ap[0][-crt].pop_back (); } else{ rez++; pos=ap[0][crt].back (); ap[0][crt].pop_back (); ap[1][crt].pop_back (); } ok[pos]=1; int l=i+query (i+1,n),r=pos+query (pos+1,n); rez+=r-l-1; update (pos,1); //cout <<l<<' '<<r<<'\n'; } return rez; }
#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...