제출 #1239572

#제출 시각아이디문제언어결과실행 시간메모리
1239572yuichiro17Arranging Shoes (IOI19_shoes)C++20
50 / 100
1094 ms25864 KiB
#include "shoes.h" #include <bits/stdc++.h> using namespace std; using ll = long long; //brute force 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=1e18; vector<int>v; vector<vector<int>>l1(n),r1(n); for(int i=2*n-1;i>=0;i--){ if(s[i]>0){ v.push_back(s[i]-1); r1[s[i]-1].push_back(i); }else{ l1[-s[i]-1].push_back(i); } } sort(v.begin(),v.end()); do{ segtree seg(2*n); ll cnt=0; vector<vector<int>>l(l1),r(r1); for(int i=0;i<n;i++){ int li=l[v[i]].back(),ri=r[v[i]].back(); li+=seg.sum(li,2*n); ri+=seg.sum(ri,2*n); seg.update(l[v[i]].back(),1); seg.update(r[v[i]].back(),1); l[v[i]].pop_back();r[v[i]].pop_back(); if(ri==2*i){ cnt+=abs(li-2*i); }else cnt+=abs(li-2*i)+abs(ri-2*i-1)+(li>ri); } ans=min(ans,cnt); }while(next_permutation(v.begin(),v.end())); 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...