Submission #1239563

#TimeUsernameProblemLanguageResultExecution timeMemory
1239563yuichiro17Arranging Shoes (IOI19_shoes)C++20
10 / 100
1097 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;
	for(int i:s){
		if(i>0)v.push_back(i-1);
	}
	sort(v.begin(),v.end());
	vector<vector<int>>l1(n),r1(n);
	for(int i=2*n-1;i>=0;i--){
		if(s[i]>0){
			r1[s[i]-1].push_back(i);
		}else{
			l1[-s[i]-1].push_back(i);
		}
	}
	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(li==2*i+1&&ri==2*i){
				cnt+=1;
			}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...