제출 #1140558

#제출 시각아이디문제언어결과실행 시간메모리
1140558marinovSprinklers (CEOI24_sprinklers)C++20
100 / 100
268 ms4340 KiB
// Author: Jiří Kalvoda
#include<bits/stdc++.h>
using namespace std;

using ll = long long;

#define printe(a...) fprintf(stderr, a)

const int NMAX = 112345;

int s[NMAX];
int f[NMAX];

const int DPLEN=3;
const int DPCHECKDELAY=1;
const int MAX=1'000'000'001;

int opt_from[NMAX][1<<DPLEN];
int N,M;

bool test(int K)
{
	int fi=0;
	for(int i=DPLEN; i<N; i++)
	{
		for (int mask=0; mask<(1<<DPLEN); mask++)
		{
			opt_from[i][mask] = -1;
			for (int case_id=0; case_id< 2; case_id++)
			{
				int full_mask = mask + (case_id<<DPLEN);
				int from_mask = full_mask>>1;
				if(opt_from[i-1][from_mask] == -1) goto nook;
				for(int fj=fi; fj<M && f[fj]<=s[i-DPCHECKDELAY]; fj++)
				{
					for(int k=i-DPLEN;k<=i;k++)
					{
						if(f[fj] == s[k]) goto ok;;
						if((f[fj] >= s[k]) == ((full_mask>>(i-k))&1) && abs(f[fj]-s[k]) <= K) goto ok;
					}
					goto nook;
					ok:;
				}
				opt_from[i][mask] = from_mask;
				nook:;
			}
		}
		while(fi<M && f[fi]<=s[i-DPCHECKDELAY]) fi++;
	}

	return opt_from[N-1][0] != -1;
}

int main(int argc, char ** argv)
{
	scanf("%d%d", &N, &M);
	for (int i=0; i<DPLEN; i++) s[i] = -2'000'000'011; // We will add some sprinklers far away at the begin
	for (int i=0; i<N; i++) scanf("%d", s+DPLEN+i);
	for (int i=0; i<M; i++) scanf("%d", f+i);

	N+=DPLEN;
	for (int i=0; i<DPLEN; i++) s[N++] = 2'000'000'011; // We will add some sprinklers far away at the end

	int kmin=0, kmax=MAX;
	while(kmin<kmax)
	{
		int K=(kmin+kmax)/2;
		if(test(K))
			kmax=K;
		else
			kmin=K+1;
	}
	int K = kmin;
	test(K);


	if(K > 1'000'000'000)
		printf("-1\n");
	else
	{
		string out(N, ' ');
		for(int i=N-1, j=0; i>=0;i--)
		{
			out[i] = (j&1) ? 'R' : 'L';
			j = opt_from[i][j];
		}
		out[N-DPLEN]=0;

		printf("%d\n%s\n", K, out.c_str()+DPLEN);
	}

	return 0;
}


컴파일 시 표준 에러 (stderr) 메시지

Main.cpp: In function 'int main(int, char**)':
Main.cpp:56:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   56 |         scanf("%d%d", &N, &M);
      |         ~~~~~^~~~~~~~~~~~~~~~
Main.cpp:58:38: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   58 |         for (int i=0; i<N; i++) scanf("%d", s+DPLEN+i);
      |                                 ~~~~~^~~~~~~~~~~~~~~~~
Main.cpp:59:38: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   59 |         for (int i=0; i<M; i++) scanf("%d", f+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...