题解 - CF1329A Dreamoon Likes Coloring

题解 - C F 1329 A   D r e a m o o n   L i k e s   C o l o r i n g \mathrm{CF1329A\ Dreamoon\ Likes\ Coloring}

题目意思

  • CF1329A

  • 就是让你构造一个长为 m ( 1 0 5 ) m(\leq 10^5) 的序列 p i p_i ,每次把颜色 i i 覆盖 [ p i , p i + l i 1 ] [p_i,p_i+l_i-1] 使得把 n n 个位置全覆盖且 1 m 1-m 的颜色全部出现。

S o l \mathrm{Sol}

  • 考场 F S T FST ,我也真的自闭(现在发现一种更为简单的做法 q w q qwq

  • 我们首先考虑无解的情况,有两种:

    • ( 1 ) l i n 1 (1)\sum l_i\leq n-1

    • ( 2 ) l i + i 1 > n (2)∃ l_i+i-1>n (即 p j = j ( j < i ) p_j=j(j<i) 却满足不了)

  • 那么我们就从无解的第二种情况下手:我们记录一个后缀和 s u f i suf_i ,我们先贪心地涂色即 p i = i ( i + s u f i 1 > = n ) p_i=i(i+suf_i-1>=n) ,否则我们就使得他刚好覆盖长度为 n n 的区间即可,即 b i = n s u f i + 1 b_i=n-suf_i+1 。这很好理解,然后就撒花了。

C o d e \mathrm{Code}

#include <bits/stdc++.h>
#define int long long 
#define pb push_back
using namespace std;

inline int read()
{
	int sum=0,ff=1; char ch=getchar();
	while(!isdigit(ch))
	{
		if(ch=='-') ff=-1;
		ch=getchar();
	}
	while(isdigit(ch))
		sum=sum*10+(ch^48),ch=getchar();
	return sum*ff;
}

const int N=1e5+5;

int n,m,a[N],b[N],sum[N],suf[N],ans;

signed main()
{
	n=read();
	m=read();
	int all=0;
	for ( int i=1;i<=m;i++ ) 
	{
		a[i]=read(); 
		all+=a[i];
		if(i+a[i]-1>n) 
			return printf("-1\n"),0;
	}
	for ( int i=n;i>=1;i-- ) 
		suf[i]=suf[i+1]+a[i];
	if(all<n) return printf("-1\n"),0;
	b[1]=1;
	for ( int i=2;i<=m;i++ )
	{
		if(i+suf[i]-1>=n) b[i]=i;
		else b[i]=n-suf[i]+1;
	}
	for ( int i=1;i<=m;i++ ) printf("%lld ",b[i]);
	return 0;
}
		
		 
	

猜你喜欢

转载自blog.csdn.net/wangyiyang2/article/details/105340758