题目链接

题面:

题意:
给定n个格子排在一排,初始时格子没有颜色。
给定一个 m 和 m 个正整数 l i l_i li,按照给定的顺序给格子进行染色,第 i 次可以将长度为 l i l_i li 的格子( l i l_i li个格子)染成第 i 种颜色。
问最终能不能使得每个格子都有颜色,且这m种颜色每种至少在一个格子上出现。

题解:
如果 l i < n \sum l_i<n li<n 或者 i 1 + l i > n i-1+l_i>n i1+li>n那么不可以。
前者显然,后者前 i 1 i-1 i1种颜色至少要占 i 1 i-1 i1个格子,这样的话第 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;
}