题解 -
题目意思
-
就是让你构造一个长为 的序列 ,每次把颜色 覆盖 使得把 个位置全覆盖且 的颜色全部出现。
-
考场 ,我也真的自闭(现在发现一种更为简单的做法 )
-
我们首先考虑无解的情况,有两种:
-
-
(即 却满足不了)
-
-
那么我们就从无解的第二种情况下手:我们记录一个后缀和 ,我们先贪心地涂色即 ,否则我们就使得他刚好覆盖长度为 的区间即可,即 。这很好理解,然后就撒花了。
#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;
}