Submission #598031

#TimeUsernameProblemLanguageResultExecution timeMemory
598031yutabiArranging Shoes (IOI19_shoes)C++14
100 / 100
124 ms76720 KiB
#include "shoes.h"


#include <bits/stdc++.h>
using namespace std;



int seg_tree[850000];


int n;
int N;


void update(int h, int l=0, int r=N-1, int node=1)
{
	seg_tree[node]++;

	if(l==r)
	{
		return;
	}

	int m=(l+r)/2;

	if(h<=m)
	{
		update(h,l,m,node*2);
	}

	else
	{
		update(h,m+1,r,node*2+1);
	}
}


long long query(int hl, int hr, int l=0, int r=N-1, int node=1)
{
	if(hl<=l && r<=hr)
	{
		return seg_tree[node];
	}

	int m=(l+r)/2;

	int res=0;

	if(hl<=m)
	{
		res+=query(hl,hr,l,m,node*2);
	}

	if(m+1<=hr)
	{
		res+=query(hl,hr,m+1,r,node*2+1);
	}

	return res;
}



long long count_swaps(std::vector <int> s)
{
	n=s.size()/2;
	N=2*n;

	vector <queue <int> > q(n+1);

	int k=1;

	vector <int> nw(2*n);

	for(int i=0;i<s.size();i++)
	{
		if(q[abs(s[i])].size())
		{
			if(q[abs(s[i])].front() < 0 && s[i]>0)
			{
				nw[(-q[abs(s[i])].front())-1]=-k;
				nw[i]=k;

				k++;

				q[abs(s[i])].pop();
			}

			else if(q[abs(s[i])].front() > 0 && s[i]<0)
			{
				nw[(q[abs(s[i])].front())-1]=k;
				nw[i]=-k;

				k++;

				q[abs(s[i])].pop();
			}

			else if(s[i]>0)
			{
				q[abs(s[i])].push(i+1);
			}

			else
			{
				q[abs(s[i])].push(-i-1);
			}
		}

		else if(s[i]>0)
		{
			q[abs(s[i])].push(i+1);
		}

		else
		{
			q[abs(s[i])].push(-i-1);
		}
	}

	vector <int> t(n+1,-1);

	vector <long long> p(2*n);

	k=0;

	for(int i=0;i<nw.size();i++)
	{
		if(t[abs(nw[i])]==-1)
		{
			t[abs(nw[i])]=k;
			k++;
		}

		p[i]=2*t[abs(nw[i])];

		if(nw[i]>0)
		{
			p[i]++;
		}
	}

	/*for(int i=0;i<nw.size();i++)
	{
		printf("%d ",nw[i]);
	}

	printf("\n");

	for(int i=0;i<p.size();i++)
	{
		printf("%lld ",p[i]);
	}

	printf("\n");*/

	vector <long long> p_inv (2*n);

	for(int i=0;i<p.size();i++)
	{
		p_inv[p[i]]=i;
	}

	/*for(int i=0;i<p_inv.size();i++)
	{
		printf("%lld ",p_inv[i]);
	}

	printf("\n");*/


	long long ans=0;

	for(long long i=0;i<p_inv.size();i++)
	{
		ans+=p_inv[i];

		ans-=query(0,p_inv[i]);

		update(p_inv[i]);
	}



	return ans;
}

Compilation message (stderr)

shoes.cpp: In function 'long long int count_swaps(std::vector<int>)':
shoes.cpp:76:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   76 |  for(int i=0;i<s.size();i++)
      |              ~^~~~~~~~~
shoes.cpp:128:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  128 |  for(int i=0;i<nw.size();i++)
      |              ~^~~~~~~~~~
shoes.cpp:160:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  160 |  for(int i=0;i<p.size();i++)
      |              ~^~~~~~~~~
shoes.cpp:175:21: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  175 |  for(long long i=0;i<p_inv.size();i++)
      |                    ~^~~~~~~~~~~~~
#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...