Cod sursa(job #955340)

Utilizator alexandru70Ungurianu Alexandru alexandru70 Data 31 mai 2013 16:49:43
Problema NextSeq Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

std::ifstream in ("nextseq.in");
std::ofstream out ("nextseq.out");

size_t n,aSz,bSz;
std::vector<int> set,a,b;

void readVector(std::vector<int> &v, size_t sz)
{
	for (int i = 0; i < sz; ++i)
	{
		int t;
		in >> t;
		v.push_back(t);
	}
}

void norm(std::vector<int> &v)
{
	for(int i = 0; i < v.size(); i++ )
		v[i]=(std::lower_bound(set.begin(), set.end(),v[i])-set.begin())+1;
}

bool isBigger(const std::vector<int> &a, const std::vector<int> &b)
{
	if(aSz>bSz)return true;
	if(aSz<bSz)return false;
	for(int i = 0; i < aSz; ++i)
	{
		if(a[i]>b[i])return true;
		if(a[i]<b[i])return false;
	}
	return true;
}

void subtr( std::vector<int> &a, const std::vector<int> &b)
{
	for(int i = 0, l = b.size(); i < l; i++)
	{
		if(a[i]<b[i])
		{
			a[i+1]--;
			a[i]+=n;
		}
		a[i]=a[i]-b[i];
	}
	for(int i = b.size(); i < a.size(); i++)
	{
		if(a[i]<0)
		{
			a[i]+=n;
			a[i+1]--;
		}
	}
	while(a.back()==0)
		a.pop_back();
}

int convTo10(const std::vector<int> &nr)
{
	int res = 0;
	for(int i = nr.size()-1; i >= 0; i--)
		res=res*n+nr[i];
	return res;
}

int main()
{
	in >> n >> aSz >> bSz;
	readVector(set,n);
	readVector(a,aSz);
	readVector(b,bSz);
	std::sort(set.begin(), set.end());
	norm(a);
	norm(b);
	std::reverse(a.begin(), a.end());
	std::reverse(b.begin(), b.end());
	if(isBigger(a,b))
	{
		subtr(a,b);
		int res = convTo10(a);
		out << res-1;
	}
	else
	{
		subtr(b,a);
		int res = convTo10(b);
		out << res-1;
	}
}