Submission #1348059

#TimeUsernameProblemLanguageResultExecution timeMemory
1348059MuhammadSaramArranging Shoes (IOI19_shoes)C++20
100 / 100
49 ms13480 KiB
#include "shoes.h"
#include <bits/stdc++.h>

using namespace std;

#define ll long long

const int M = 2e5 + 1;

int fen[M];

void modify(int p, int x)
{
	while (p<M)
		fen[p]+=x, p+=p&-p;
}

int get(int p)
{
	int ans=0;
	while (p)
		ans+=fen[p], p^=p&-p;
	return ans;
}

ll count_swaps(vector<int> v)
{
	int n=v.size()/2;
	vector<int> ind[n*2+1];
	for (int i=0;i<n*2;i++)
	{
		if (v[i]>0) v[i]+=n;
		else v[i]*=-1;
		ind[v[i]].push_back(i), modify(i+1,1);
	}
	for (int i=1;i<=2*n;i++)
		reverse(ind[i].begin(),ind[i].end());
	ll ans=0;
	for (int i=0;i<n*2;i++)
	{
		if (ind[v[i]].empty() or ind[v[i]].back()!=i) continue;
		if (v[i]<=n && ind[v[i]+n].size())
		{
			ans+=get(ind[v[i]+n].back())-get(i+1), modify(ind[v[i]+n].back()+1,-1);
			ind[v[i]].pop_back(), ind[v[i]+n].pop_back();
		}
		if(v[i]>n && ind[v[i]-n].size())
		{
			ans+=get(ind[v[i]-n].back())-get(i+1)+1, modify(ind[v[i]-n].back()+1,-1);
			ind[v[i]].pop_back(), ind[v[i]-n].pop_back();
		}
	}
	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...