Submission #1273184

#TimeUsernameProblemLanguageResultExecution timeMemory
1273184arkanefuryArranging Shoes (IOI19_shoes)C++20
50 / 100
16 ms5040 KiB
#include "shoes.h"
#include <bits/stdc++.h>
#define sz size()
#define all(v) v.begin(), v.end()
#define pb push_back
using namespace std;
const int N = 2e5+5;
int a[N], b[N], t[N*6], n;
vector<int>g[N];
void upd(int pos, int v = 1, int tl = 0, int tr = n-1){
	if(tl == tr){
		t[v] = 1;
		return;
	}
	int tm = (tl + tr) >> 1;
	if(pos <= tm)upd(pos, v*2, tl, tm);
	else upd(pos, v*2+1, tm+1, tr);
	t[v] = t[v*2] + t[v*2+1];
}
int get(int l, int r, int v = 1, int tl = 0, int tr = n-1){
	if(l <= tl && tr <= r)return t[v];
	if(l > tr || tl > r)return 0;
	int tm = (tl + tr) >> 1;
	return get(l, r, v*2, tl, tm) + get(l, r, v*2+1, tm+1, tr);
}
long long count_swaps(vector <int> v){
    n = v.sz;
	int k;
    long long ans = 0;
    for(int i = 0; i < n; i ++){
    	if(v[i] < 0)g[abs(v[i]) + n].pb(i);
    	else g[v[i]].pb(i);
	}
	for(int i = 1; i <= 2*n; i ++)reverse(all(g[i]));
	for(int i = 0; i < n; i ++){
		if(b[i])continue;
		if(v[i] < 0){
			int x = abs(v[i]);
			x = g[x][g[x].sz-1];
			k = get(i+1, x-1);
			ans += x - i - 1 - k;
			b[x] = 1;
			upd(x);
			g[abs(v[i])].pop_back();
			g[abs(v[i]) + n].pop_back();
		}
		else{
			int x = v[i] + n;
			k = get(i+1, g[x][g[x].sz-1]-1);
			ans += g[x][g[x].sz-1] - i - k;
			upd(g[x][g[x].sz-1]);
			b[g[x][g[x].sz-1]] = 1;
			g[x].pop_back();
			g[v[i]].pop_back();
		}
	}
	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...