Submission #1292668

#TimeUsernameProblemLanguageResultExecution timeMemory
1292668MMihalevArranging Shoes (IOI19_shoes)C++20
50 / 100
1103 ms137396 KiB
#include<iostream> #include<vector> #include<queue> #include<set> #include "shoes.h" using namespace std; const int MAX_N=1e5+5; deque<int>pos[2][MAX_N]; int tree[MAX_N]; int N; void Update(int pos) { pos++; for(;;) { if(pos>N)break; tree[pos]++; pos+=((pos)&(-pos)); } } int Find(int pos) { int res=0; pos++; for(;;) { if(pos<1)break; res+=tree[pos]; pos-=((pos)&(-pos)); } return res; } bool ban[MAX_N]; long long count_swaps(std::vector<int> s) { N=s.size(); for(int i=0;i<s.size();i++) { if(s[i]<0)pos[0][-s[i]].push_back(i); else pos[1][s[i]].push_back(i); } long long ans=0; for(int i=0;i<s.size();i+=2) { int k; for(int j=i+1;j<s.size();j++) { if(abs(s[j])==abs(s[i]) && ((s[i]<0 && s[j]>0) or (s[i]>0 && s[j]<0))){k=j;break;} } for(int j=k;j>i+(s[i]<0);j--) { swap(s[j],s[j-1]); ans++; } } return ans; int cnt=0; for(int i=0;i<s.size();i++) { if(ban[i])continue; int wh=1-(s[i]<0 ? 0 : 1); int cur=pos[wh][abs(s[i])].front()-Find(pos[wh][abs(s[i])].front())+cnt-i-wh; ans+=cur; Update(pos[wh][abs(s[i])].front()); cnt++; ban[pos[wh][abs(s[i])].front()]=1; pos[wh][abs(s[i])].pop_front(); pos[1-wh][abs(s[i])].pop_front(); } 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...