Submission #783479

#TimeUsernameProblemLanguageResultExecution timeMemory
783479baneArranging Shoes (IOI19_shoes)C++17
100 / 100
245 ms276080 KiB
#include<bits/stdc++.h> #include<queue> #include "shoes.h" using namespace std; const int nax = (int)1e6+1; int n; struct Segtree{ int t[nax * 3]; void built(int l = 0, int r = n - 1, int k = 1){ if (l == r){ t[k] = 1; return; } int mid = (l+r)/2; built(l,mid,k*2); built(mid+1,r,k*2+1); t[k] = t[k * 2] + t[k * 2 + 1]; } void trigger(int pos, int l = 0, int r = n - 1, int k = 1){ if (l == r){ t[k] = 0; return; } int mid = (l+r) / 2; if (pos <= mid) trigger(pos,l,mid,k*2); else trigger(pos,mid+1,r,k*2+1); t[k] = t[k * 2] + t[k * 2 + 1]; } int range_get(int a, int b, int l = 0, int r = n - 1, int k = 1){ if (a > b)return 0; if (l >= a && r <= b)return t[k]; if(l > b || r < a)return 0; int mid = (l+r)/2; return range_get(a,b,l,mid,k*2)+range_get(a,b,mid+1,r,k*2+1); } } st; long long count_swaps(std::vector<int> s) { n = (int)s.size(); st.built(); vector<int>used(n+1,0); queue<int>Left[n+1]; queue<int>Right[n+1]; for (int i = 0; i < n; i++){ if (s[i] < 0){ Left[-s[i]].push(i); }else{ Right[s[i]].push(i); } } long long ans = 0; for (int i = 0; i < n; i++){ if (used[i])continue; if (s[i] < 0){ //left Left[-s[i]].pop(); assert(Right[s[i]*(-1)].size()>0); int R = Right[-s[i]].front(); Right[-s[i]].pop(); st.trigger(R); used[i]=1; used[R]=1; ans += st.range_get(i+1,R); st.trigger(i); }else{ //right Right[s[i]].pop(); assert(Left[s[i]].size()>0); int L = Left[s[i]].front(); Left[s[i]].pop(); st.trigger(L); used[i]=1; used[L]=1; ans += st.range_get(i,L); //printf("query : %d\n", st.range_get(i,L)); st.trigger(i); } //printf("%lld\n", ans); } 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...