Submission #303188

#TimeUsernameProblemLanguageResultExecution timeMemory
303188sofapudenArranging Shoes (IOI19_shoes)C++14
100 / 100
105 ms16884 KiB
#include "shoes.h"
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

bool com(pair<int,int> a, pair<int,int> b){
	return min(a.first,a.second)<min(b.first,b.second);
}
vector<int> tree;
vector<int> ind;

void build(int l, int r, int p){
	if(l == r)ind[l] = p;
	else{
		build(l,(l+r)/2,p*2);
		build((l+r)/2+1,r,p*2+1);
	}
}
void add(int r, int p, int lb, int rb){
	if(rb <= r){tree[p]++;return;}
	if(lb > r)return;
	add(r,p*2,lb,(rb+lb)/2);
	add(r,p*2+1,(rb+lb)/2+1,rb);
}
int check(int p){
	if(p == 0)return 0;
	return check(p/2)+tree[p];
}
ll count_swaps(vector<int> s) {
	int n = s.size()/2;
	tree.resize(8*n);
	ind.resize(n*2+1);
	build(0,n*2-1,1);
	vector<vector<pair<int,int>>> shoe(n*2+1);
	vector<pair<int,int>> seg;
	vector<int> num(n*2+1,0);
	for(int i = 0; i < n*2; ++i){
		if(num[abs(s[i])] == (int)shoe[abs(s[i])].size()){
			shoe[abs(s[i])].push_back({s[i],i});
			continue;
		}
		if(shoe[abs(s[i])][num[abs(s[i])]].first == s[i]){
			shoe[abs(s[i])].push_back({s[i],i});
			continue;
		}
		if(s[i] > 0)seg.push_back({i,shoe[abs(s[i])][num[abs(s[i])]].second});
		else seg.push_back({shoe[abs(s[i])][num[abs(s[i])]].second,i});
		num[abs(s[i])]++;
	}
	sort(seg.begin(),seg.end(),com);
	ll ans = 0;
	for(int i = 0; i < (int)seg.size(); ++i){
		int x = max(seg[i].first,seg[i].second);
		int y = x+check(ind[x]);
		add(x,1,0,n*2-1);
		ans+=y-(i*2+1);
		ans+=seg[i].first < seg[i].second;		
	}
	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...