Submission #406053

#TimeUsernameProblemLanguageResultExecution timeMemory
406053ngraceArranging Shoes (IOI19_shoes)C++14
100 / 100
576 ms28228 KiB
#include "shoes.h"
#include <bits/stdc++.h>
using namespace std;

vector<int> st(2*4*100000 + 5,0);

int n;

void update(int cur, int l, int r, int tar){
	if(l==r){
		st[cur]=1;
	}
	else{
		int m=(l+r)/2;
		if(tar<=m){
			update(cur*2,l,m,tar);
		}
		else{
			update(cur*2+1,m+1,r,tar);
		}
		st[cur]=st[cur*2]+st[cur*2+1];
	}
}

int query(int cur, int l, int r, int ql, int qr){
	if(ql>qr){
		return 0;
	}
	if(ql<=l && r<=qr){
		return st[cur];
	}
	int m=(l+r)/2;
	return query(cur*2,l,m,ql,min(m,qr)) + query(cur*2+1,m+1,r,max(m+1,ql),qr);
}

void update(int tar){//updates point to 1
	update(1,1,2*n,tar+1);
}

int query(int ql, int qr){
	return query(1,1,2*n,ql+1,qr+1);
}

long long count_swaps(vector<int> s) {
	n=s.size()/2;
	long long out=0;

	map<int,priority_queue<int>> next;
	for(int i=0;i<2*n;i++){
		next[s[i]].push(-i);
	}
	//maps a size to the next -ve index of that size

	for(int i=0;i<2*n;i++){
		if(query(i,i)==1){
			continue;
		}
		if(s[i]>0){
			out++;//final swap if wrong way around
		}
		int ind=-next[-s[i]].top();
		next[-s[i]].pop();
		next[s[i]].pop();
		out+=ind-i-1;
		out-=query(i,ind);
		update(i);
		update(ind);
	}

	return out;
}
#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...