제출 #1290918

#제출 시각아이디문제언어결과실행 시간메모리
1290918gustavo_dArranging Shoes (IOI19_shoes)C++20
100 / 100
47 ms14528 KiB
#include "shoes.h"
#include <bits/stdc++.h>
using namespace std;

#define sz(v) (int)(v).size()

typedef long long ll;

const int MAXN = 1e6;

int p[2*MAXN];
vector<int> pos[MAXN+1][2];

struct BIT {
	vector<int> bit; int n;

	BIT(int _n=0): bit(_n+11, 0), n(_n+10) {}

	void update(int i, int v) {
		i+=5;
		while (i <= n) {
			bit[i] += v;
			i += (i & -i);
		}
	}

	int sum(int i) {
		i+=5;
		int res = 0;
		while (i > 0) {
			res += bit[i];
			i -= (i & -i);
		}
		return res;
	}
};

ll count_swaps(vector<int> arr) {
	int n = sz(arr) / 2;

	// cout << n << endl;
	
	for (int i=0; i<2*n; i++) {
		// cout << i << endl;
		pos[abs(arr[i])][arr[i] > 0].push_back(i);
		p[i] = -1;
	}
	for (int i=1; i<=2*n; i++) 
		for (int f=0; f<2; f++) reverse(pos[i][f].begin(), pos[i][f].end());

	for (int i=0, pt=0; i<2*n; i++) {
		if (p[i] != -1) continue;
		// cout << pt << ':' << pos[abs(arr[i])][0].back() << ' ' << pos[abs(arr[i])][1].back() << endl;
		p[pos[abs(arr[i])][0].back()] = pt;
		p[pos[abs(arr[i])][1].back()] = pt+1;
		pos[abs(arr[i])][0].pop_back();
		pos[abs(arr[i])][1].pop_back();
		pt+=2;
	}

	// for (int i=0; i<2*n; i++) cout << p[i] << ' ';
	// cout << endl;

	BIT bit(2*n); ll ans = 0;
	for (int i=2*n-1; i>=0; i--) {
		ans += bit.sum(p[i]);
		bit.update(p[i], 1);
	}

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