Submission #599676

#TimeUsernameProblemLanguageResultExecution timeMemory
599676OrazBArranging Shoes (IOI19_shoes)C++14
100 / 100
273 ms202920 KiB
#include <bits/stdc++.h>
#include "shoes.h"
#define N 4000005
#define wr cout << "Continue debugging\n";
#define ll long long int
#define pii pair <int, int>
#define pb push_back
#define ff first
#define ss second
using namespace std;

ll t[N], s[N], vis[N];
vector <int> a, v1[N], v2[N];

void build(int l, int r, int idx){
	if (l == r){t[idx] = 1; return;}
	int md = (l + r) / 2;
	build(l, md, idx*2);
	build(md+1, r, idx*2+1);
	t[idx] = t[idx*2] + t[idx*2+1];
}
ll sum(int a, int b, int l, int r, int idx){
	if (r < a or l > b) return 0;
	if (l >= a and r <= b) return t[idx];
	int md = (l + r) / 2;
	return sum(a, b, l, md, idx*2) + sum(a, b, md+1, r, idx*2+1);
}
void upd(int nd, int l, int r, int idx){
	int md = (l + r) / 2;
	if (l == r){t[idx] = 0; return;}
	if (nd <= md) upd(nd, l, md, idx*2);
	else upd(nd, md+1, r, idx*2+1);
	t[idx] = t[idx*2] + t[idx*2+1];
}
ll count_swaps(vector <int> a){
	ll n = a.size(), ans = 0;
	for (int i = 0; i < n; i++){
		if (a[i] < 0) v1[-a[i]].pb(i);
		else v2[a[i]].pb(i);
	}
	build(0, n-1, 1);
	for (int i = 1; i <= n; i++){
		reverse(v1[i].begin(), v1[i].end());
		reverse(v2[i].begin(), v2[i].end());
	}
	for (int i = 0; i < n; i++){
		if (vis[i]) continue;
		int idx = 0;
		if (a[i] < 0){
			idx = v2[-a[i]].back();
			ans += sum(i+1, idx-1, 0, n-1, 1);
		}else{
			idx = v1[a[i]].back();
			ans += sum(i+1, idx-1, 0, n-1, 1)+1;
		}
		v2[abs(a[i])].pop_back();
		v1[abs(a[i])].pop_back();
		vis[idx] = 1;
		upd(idx, 0, n-1, 1);
	}
	return ans;
}
// int main ()
// {
// 	int n1;
// 	cin >> n1;
// 	for (int i = 1; i <= n1; i++) cin >> s[i], a.pb(s[i]);
// 	cout << count_swaps(a);
// }	
#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...