제출 #1238958

#제출 시각아이디문제언어결과실행 시간메모리
1238958yuichiro17Arranging Shoes (IOI19_shoes)C++20
10 / 100
69 ms15032 KiB
#include "shoes.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

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({l[i].back()+abs(r[i].back()-1)+(l[i]>r[i]),i});
		}
	}
	vector<int>v;
	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+=v.end()-lower_bound(v.begin(),v.end(),li);
		ri+=v.end()-lower_bound(v.begin(),v.end(),ri);
		v.push_back(l[p.second].back());
		v.push_back(r[p.second].back());
		l[p.second].pop_back();r[p.second].pop_back();
		if(!l[p.second].empty()){
			pq.push({l[p.second].back()+abs(r[p.second].back()-1)+(l[p.second]>r[p.second]),p.second});
		}
		if(li==2*i+1&&ri==2*i){
			ans+=1;
		}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...