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...