Submission #609645

#TimeUsernameProblemLanguageResultExecution timeMemory
609645fvogel499Arranging Shoes (IOI19_shoes)C++17
100 / 100
382 ms40496 KiB
// #include "grader.cpp"
#include "shoes.h"
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

#define vi vector<int>

#define size(x) (int)((x).size())

#define int long long

using namespace std;
using namespace __gnu_pbds;

typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;

const int p2 = 1<<18;

struct Segtree {
	Segtree() {
		t = new int [p2*2];
		for (int i = 0; i < p2*2; i++) t[i] = 0;
	}
	void upd(int x, int v) {
		for (x += p2; x; x /= 2) {
			t[x] += v;
		}
	}
	int get(int b, int e) {
		int r = 0;
		b += p2;
		e += p2;
		while (b <= e) {
			if (b%2 == 1) {
				r += t[b];
				b++;
			}
			if (e%2 == 0) {
				r += t[e];
				e--;
			}
			b /= 2;
			e /= 2;
		}
		return r;
	}
	int* t;
};

int count_swaps(vector<signed> bcc) {
	vi b;
	for (int i : bcc) b.push_back(i);
	int n = size(b);
	map<int, map<int, vi>> per;
	for (int i = n-1; i >= 0; i--) {
		int sign = 0;
		if (b[i] < 0) {
			sign = 1;
		}
		per[abs(b[i])][sign].push_back(i);
	}
	bool handled [n];
	for (int i = 0; i < n; i++) handled[i] = false;
	Segtree st = Segtree();
	int cost = 0;
	int before = 0;
	for (int i = 0; i < n; i++) if (!handled[i]) {
		int sign = 0;
		if (b[i] < 0) {
			sign = 1;
		}
		assert(size(per[abs(b[i])][sign]) == size(per[abs(b[i])][!sign]));
		assert(!per[abs(b[i])][sign].empty() && per[abs(b[i])][sign].back() == i);
		per[abs(b[i])][sign].pop_back();
		int j = per[abs(b[i])][!sign].back();
		per[abs(b[i])][!sign].pop_back();
		if (b[i] > 0) {
			cost++;
		}
		if (i+1 <= j-1) {
			int loc = st.get(i+1, j-1);
			cost += (j-1)-(i+1)+1 - loc;
		}
		st.upd(i, 1); // not needed
		st.upd(j, 1);
		handled[i] = true;
		handled[j] = true;
	}
	return cost;
}

Compilation message (stderr)

shoes.cpp: In function 'long long int count_swaps(std::vector<int>)':
shoes.cpp:67:6: warning: unused variable 'before' [-Wunused-variable]
   67 |  int before = 0;
      |      ^~~~~~
#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...