Submission #1239576

#TimeUsernameProblemLanguageResultExecution timeMemory
1239576yuichiro17Arranging Shoes (IOI19_shoes)C++20
100 / 100
66 ms15392 KiB
#include "shoes.h" #include <bits/stdc++.h> using namespace std; using ll = long long; struct segtree{ int n; vector<int>tree; segtree(int n):n(n),tree(2*n,0){} void update(int pos,int val){ tree[pos+=n]=val; for(pos/=2;pos>0;pos/=2){ tree[pos]=tree[2*pos]+tree[2*pos^1]; } } int sum(int l,int r){ int ans=0; for(l+=n,r+=n;l<r;l/=2,r/=2){ if(l%2){ ans+=tree[l++]; } if(r%2){ ans+=tree[--r]; } } return ans; } }; long long count_swaps(std::vector<int> s) { int n=s.size()/2; ll ans=0; vector<vector<int>>l(n),r(n); for(int i=2*n-1;i>=0;i--){ if(s[i]>0){ r[s[i]-1].push_back(i); }else{ l[-s[i]-1].push_back(i); } } priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>pq; for(int i=0;i<n;i++){ if(!l[i].empty()){ pq.push({min(l[i].back(),r[i].back()),i}); } } segtree seg(2*n); for(int i=0;i<n;i++){ pair<int,int>p=pq.top(); pq.pop(); int li=l[p.second].back(),ri=r[p.second].back(); li+=seg.sum(li,2*n); ri+=seg.sum(ri,2*n); seg.update(l[p.second].back(),1); seg.update(r[p.second].back(),1); l[p.second].pop_back();r[p.second].pop_back(); if(!l[p.second].empty()){ pq.push({min(l[p.second].back(),r[p.second].back()),p.second}); } if(ri==2*i){ ans+=abs(li-2*i); }else ans+=abs(li-2*i)+abs(ri-2*i-1)+(li>ri); } 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...