Submission #786322

#TimeUsernameProblemLanguageResultExecution timeMemory
78632212345678Arranging Shoes (IOI19_shoes)C++17
100 / 100
232 ms274380 KiB
#include "shoes.h"
#include <bits/stdc++.h>

using namespace std;

const int nx=2e5+5;

int n;
long long ans;
queue<int> q[2][nx];
bool used[nx];

struct fenwick
{
	int d[nx];
	void add(int idx, int vl)
	{
		while (idx<nx) d[idx]+=vl, idx+=(idx&-idx); 
	}
	int find(int idx)
	{
		int tmp=0;
		while (idx>0) tmp+=d[idx], idx-=(idx&-idx);
		return tmp;
	}
} f;

long long count_swaps(std::vector<int> s) {
	int n=s.size();
	for (int i=1; i<=n; i++)
	{
		if (s[i-1]<0) q[0][-s[i-1]].push(i);
		else q[1][s[i-1]].push(i);
	}
	for (int i=1; i<=n; i++) f.add(i, 1);
	for (int i=1; i<=n; i++)
	{
		if (used[i]) continue;
		int sz=s[i-1];
		if (sz<0)
		{
			q[0][-sz].pop();
			int p=q[1][-sz].front(), cl=f.find(i), pl=f.find(p);
			q[1][-sz].pop();
			used[p]=1;
			ans+=(pl-cl-1);
			f.add(i, 1); f.add(p+1, -1);
		}
		else
		{
			q[1][sz].pop();
			int p=q[0][sz].front(), cl=f.find(i), pl=f.find(p);
			q[0][sz].pop();
			used[p]=1;
			ans+=(pl-cl);
			f.add(i, 1); f.add(p+1, -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...