Cod sursa(job #3136508)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 6 iunie 2023 17:29:35
Problema NextSeq Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.51 kb
//Ilie Dumitru
#include<cstdio>
#include<algorithm>
const int NMAX=10005;

int N, M;
int X[NMAX], A[NMAX], B[NMAX];
int ans;

int fastExp(int a, int b)
{
	if(b==0)
		return 1;
	if(b==1)
		return a;
	int x=fastExp(a, b>>1);
	x*=x;
	if(b&1)
		x*=a;
	return x;
}

void back(int k, bool under, bool over)
{
	if(under && over)
		ans+=fastExp(N, M-k);
	else if(k<M)
	{
		int i;

		if(over)
		{
			for(i=0;i<B[k];++i)
				back(k+1, 1, 1);
			back(k+1, 0, 1);
		}
		else if(under)
		{
			back(k+1, 1, 0);
			for(i=A[k]+1;i<N;++i)
				back(k+1, 1, 1);
		}
		else
		{
			if(A[k]<B[k])
			{
				back(k+1, 1, 0);
				for(i=A[k]+1;i<B[k];++i)
					back(k+1, 1, 1);
				back(k+1, 0, 1);
			}
			else
				back(k+1, 0, 0);
		}
	}
}

int main()
{
	FILE* f=fopen("nextseq.in", "r"), *g=fopen("nextseq.out", "w");
	int i, a, l, r, mid;

	fscanf(f, "%d%d%d", &N, &a, &M);
	for(i=0;i<N;++i)
		fscanf(f, "%d", X+i);
	std::sort(X, X+N);
	for(i=0;i<M-a;++i)
		A[i]=-1;
	for(;i<M;++i)
	{
		fscanf(f, "%d", &a);
		l=0;
		r=N-1;
		while(l<=r)
		{
			mid=l+((r-l)>>1);
			if(a==X[mid])
				a=mid, l=r+1;
			else if(a>X[mid])
				l=mid+1;
			else
				r=mid-1;
		}
		A[i]=a;
	}

	for(i=0;i<M;++i)
	{
		fscanf(f, "%d", &a);
		l=0;
		r=N-1;
		while(l<=r)
		{
			mid=l+((r-l)>>1);
			if(a==X[mid])
				a=mid, l=r+1;
			else if(a>X[mid])
				l=mid+1;
			else
				r=mid-1;
		}
		B[i]=a;
	}

	back(0, 0, 0);

	fprintf(g, "%d\n", ans);

	fclose(f);
	fclose(g);
	return 0;
}