Submission #198298

#TimeUsernameProblemLanguageResultExecution timeMemory
198298AkashiArranging Shoes (IOI19_shoes)C++14
100 / 100
229 ms31648 KiB
#include "shoes.h"
#include <bits/stdc++.h>
using namespace std;

struct grup{
	int x, y;
	bool operator < (const grup &aux)const{
		if((x + y) / 2 != (aux.x + aux.y) / 2) return (x + y) / 2 < (aux.x + aux.y) / 2;
		return x < aux.x;
	}
};

grup a[100005];

set <int> lf[200005], rf[200005];
int n;

int Arb[800005], Lazy[800005];

void propag(int nod){
	for(int i = nod * 2; i <= nod * 2 + 1 ; ++i){
		Lazy[i] += Lazy[nod];
		Arb[i] += Lazy[nod]; 
	}
	Lazy[nod] = 0;
}

void build(int st = 1, int dr = n, int nod = 1){
	Lazy[nod] = 0;
	if(st == dr){
		Arb[nod] = st;
		return ;
	}
	
	int mij = (st + dr) / 2;
	build(st, mij, nod * 2);
	build(mij + 1, dr, nod * 2 + 1);
}

void update(int x, int y, int val, int st = 1, int dr = n, int nod = 1){
	if(x <= st && dr <= y){
		Lazy[nod] += val;
		Arb[nod] += val;
		return ;
	}
	
	propag(nod);
	
	int mij = (st + dr) / 2;
	if(x <= mij) update(x, y, val, st, mij, nod * 2);
	if(mij + 1 <= y) update(x, y, val, mij + 1, dr, nod * 2 + 1);
}

int query(int x, int st = 1, int dr = n, int nod = 1){
	if(st == dr) return Arb[nod];
	propag(nod);
	
	int mij = (st + dr) / 2;
	if(x <= mij) return query(x, st, mij, nod * 2);
	else return query(x, mij + 1, dr, nod * 2 + 1);
}

long long count_swaps(vector<int> s) {
	int NR = 0;
	n = s.size();
	long long Sol = 0;
	for(int i = 1; i <= n ; ++i){
		int x = s[i - 1];
		if(x < 0){
			x = -x;
			if(!rf[x].empty()){
				a[++NR] = {i, *rf[x].begin()};
				rf[x].erase(rf[x].begin());
				//++Sol;
			}
			else lf[x].insert(i);
		}
		else{
			if(!lf[x].empty()){
				a[++NR] = {*lf[x].begin(), i};
				lf[x].erase(lf[x].begin());
			}
			else rf[x].insert(i);
		}
	}

	sort(a + 1, a + NR + 1);
	//cerr << n;
	build();
	
	for(int i = 1; i <= NR ; ++i){
		int p1 = 2 * i - 1, p2 = 2 * i;
		
		int x = query(a[i].x);
		Sol = Sol + abs(x - p1); 
		update(1, a[i].x, 1);

		int y = query(a[i].y);
		Sol = Sol + abs(y - p2);
		update(1, a[i].y, 1);
	}
	
	return Sol;
}
#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...