제출 #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...