题面:
题意:
给定n个格子排在一排,初始时格子没有颜色。
给定一个 m 和 m 个正整数 li,按照给定的顺序给格子进行染色,第 i 次可以将长度为 li 的格子( li个格子)染成第 i 种颜色。
问最终能不能使得每个格子都有颜色,且这m种颜色每种至少在一个格子上出现。
题解:
如果 ∑li<n 或者 i−1+li>n那么不可以。
前者显然,后者前 i−1种颜色至少要占 i−1个格子,这样的话第 i 种颜色没办法涂上。
剩下的情况都可以,我们只需要贪心的从前往后涂格子就好啦。
第 i 种颜色涂色的起始位置,让 i 和从第 i 种颜色开始后面颜色最多能涂的格子数取个max。
代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<string>
#include<queue>
#include<bitset>
#include<map>
#include<unordered_map>
#include<set>
#include<list>
#define ui unsigned int
#define ll long long
#define llu unsigned ll
#define ld long double
#define pr make_pair
#define pb push_back
#define lc (cnt<<1)
#define rc (cnt<<1|1)
//#define len(x) (t[(x)].r-t[(x)].l+1)
#define tmid ((l+r)>>1)
using namespace std;
const int inf=0x3f3f3f3f;
const ll lnf=0x3f3f3f3f3f3f3f3f;
const double dnf=1e18;
const int mod=998244353;
const double eps=1e-1;
const double pi=acos(-1.0);
const int hp=13331;
const int maxn=100100;
const int maxp=1100;
const int maxm=500100;
const int up=100000;
int l[maxn];
int main(void)
{
int n,m;
ll sum=0;
bool flag=false;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d",&l[i]);
if(i-1+l[i]>n) flag=true;
sum=sum+l[i];
}
if(flag||sum<n)
{
printf("-1\n");
return 0;
}
for(int i=1;i<=m;i++)
{
printf("%lld ",max(1ll*i,n-sum+1));
sum-=l[i];
}
putchar('\n');
return 0;
}