Submission #59658

#TimeUsernameProblemLanguageResultExecution timeMemory
59658TadijaSebezAncient Books (IOI17_books)C++11
100 / 100
330 ms243252 KiB
#include "books.h"
#include <stdio.h>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
#define ll long long
queue<int> q1,q2;
const int N=1000050;
int max(int a, int b){ return a>b?a:b;}
int min(int a, int b){ return a>b?b:a;}
int abs(int x){ return x>0?x:-x;}
ll minimum_walk(vector<int> p, int s)
{
	ll sol=0;
	int n=p.size(),i,j,ml=n,mr=-1;
	for(i=0;i<n;i++)
	{
		sol+=abs(p[i]-i);
		if(p[i]!=i) ml=min(ml,i),mr=max(mr,i);
	}
	q1.push(s);
	int myl=s,myr=s;
	while(1)
	{
		while(q1.size())
		{
			int x=q1.front();q1.pop();
			while(myl>p[x]) q1.push(--myl);
			while(myr<p[x]) q1.push(++myr);
		}
		int nl=myl,nr=myr,addl=0,addr=0;
		bool lf=0,rf=0;
		while(1)
		{
			if(nl<=ml) break;
			nl--;addl+=2;q2.push(nl);
			while(q2.size())
			{
				int x=q2.front();q2.pop();
				if(p[x]>s) lf=1;
				while(nl>p[x]) q2.push(--nl);
			}
			if(lf) break;
		}
		while(1)
		{
			if(nr>=mr) break;
			nr++;addr+=2;q2.push(nr);
			while(q2.size())
			{
				int x=q2.front();q2.pop();
				if(p[x]<s) rf=1;
				while(nr<p[x]) q2.push(++nr);
			}
			if(rf) break;
		}
		if(lf && rf) sol+=min(addl,addr);
		else{ sol+=addl+addr;break;}
		while(myl>nl) q1.push(--myl);
		while(myr<nr) q1.push(++myr);
	}
	return sol;
}

Compilation message (stderr)

books.cpp: In function 'long long int minimum_walk(std::vector<int>, int)':
books.cpp:16:19: warning: unused variable 'j' [-Wunused-variable]
  int n=p.size(),i,j,ml=n,mr=-1;
                   ^
#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...