Submission #722847

#TimeUsernameProblemLanguageResultExecution timeMemory
722847victor_gaoArranging Shoes (IOI19_shoes)C++17
100 / 100
252 ms274860 KiB
#include "shoes.h" #include <bits/stdc++.h> using namespace std; deque<int>all[200015][2]; int n,out[200015]; struct BIT{ int arr[200015]; void modify(int p,int c){ for (;p<=n;p+=(p&-p)) arr[p]+=c; } int query(int p){ int ans=0; for (;p>0;p-=(p&-p)) ans+=arr[p]; return ans; } }bit; long long count_swaps(std::vector<int> s) { n=s.size(); for (int i=0;i<n;i++){ if (s[i]<0) all[abs(s[i])][0].push_back(i+1); else all[s[i]][1].push_back(i+1); bit.modify(i+1,1); } long long ans=0; for (int i=1;i<=n;i++){ if (out[i]) continue; if (s[i-1]<0){ int nxt=all[abs(s[i-1])][1].front(); int realp1=bit.query(i),realp2=bit.query(nxt); out[nxt]=1; out[i]=1; if (realp1>realp2) ans=(ans+realp1-realp2); else ans=(ans+realp2-realp1-1); // cout<<realp1<<" "<<realp2<<' '; bit.modify(i,1); bit.modify(nxt+1,-1); } else { int nxt=all[s[i-1]][0].front(); int realp1=bit.query(nxt),realp2=bit.query(i); out[nxt]=1; out[i]=1; if (realp1>realp2) ans=(ans+realp1-realp2); else ans=(ans+realp2-realp1-1); // cout<<realp1<<" "<<realp2<<" "; bit.modify(i,1); bit.modify(nxt+1,-1); } all[abs(s[i-1])][1].pop_front(); all[abs(s[i-1])][0].pop_front(); // cout<<ans<<'\n'; } 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...