Submission #1355997

#TimeUsernameProblemLanguageResultExecution timeMemory
1355997po_rag526Arranging Shoes (IOI19_shoes)C++20
50 / 100
75 ms138612 KiB
#include "shoes.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

void dbg() { cout << "\n"; }
template<typename H, typename... T>
void dbg(H h, T... t) {
    cout << h << " ";
    dbg(t...);
}

#define pii pair<int,int>

const int N = 1e5+10;
int n,fw[N],mark[N];
deque<int> a[N],b[N];


struct hee {
	int w,i,j;
	bool operator < (const hee&o) const {
		return w < o.w;
	}
};

vector<hee> v;

void upd(int i, int v) {
	if (i == 0) return;
	for (i; i <= n; i+=i&-i) {
		fw[i] += v;
	}
}

int query(int i) {
	int sum = 0;
	for (i; i > 0; i-=i&-i) {
		sum += fw[i];
	}
	return sum;
}

long long count_swaps(vector<int> s) {
	n = s.size();
	deque<int> l,r;
	for (int i = 0; i < n; i++) {
		if (s[i] < 0) a[-s[i]].push_back(i+1), l.push_back(i+1);
		else b[s[i]].push_back(i+1), r.push_back(i+1);
	}
	for (int i = 1; i <= n; i++) upd(i,1);
	ll ans = 0;
	for (int i = 1; i <= n; i++) {
		if (mark[i]) continue;
		int x = abs(s[i-1]);
		while (!a[x].empty() && mark[a[x].front()]) a[x].pop_front();
		while (!b[x].empty() && mark[b[x].front()]) b[x].pop_front();
		if (s[i-1] < 0) {
			a[x].pop_front();
			int idx = b[x].front(); b[x].pop_front();
			ans += query(idx)-query(i)-1;
			mark[i] = mark[idx] = 1;
			upd(i,-1);
			upd(idx,-1);
		} else {
			b[x].pop_front();
			int idx = a[x].front(); a[x].pop_front();
			ans += query(idx)-query(i);
			mark[i] = mark[idx] = 1;
			upd(i,-1);
			upd(idx,-1);
		}
	}
	return ans;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...