[CF1329A] Dreamoon Likes Coloring

[CF1329A] Dreamoon Likes Coloring - 构造

Description

给定长为 (n) 的格子和 (m) 种颜色。Dreamoon 会依次刷这 (m) 种颜色,对于第 (i) 种颜色,他会从第 (p_i) 格开始刷到第 (p_i+l_i-1) 格。(p_i) 不能超过 (n-l_i+1) 或小于 (1),这样会超出格子。您的任务是找出一组 (p_i),使得 Dreamoon 刷完所有颜色之后每种颜色至少出现了一次,且每个格子都被刷上了颜色。

Solution

假设默认散开来放,同时记录一个剩余长度,如果剩余长度不够了,就压缩

#include <bits/stdc++.h>
using namespace std;

#define int long long

int n, m;
int l[100005], p[100005];

signed main()
{
    ios::sync_with_stdio(false);
    cin >> n >> m;
    for (int i = 1; i <= m; i++)
        cin >> l[i];
    int res = 0;
    for (int i = 1; i <= m; i++)
        res += l[i];
    int pos = 1;
    for (int i = 1; i <= m; i++)
    {
        if (pos > n)
        {
            cout << -1;
            return 0;
        }
        p[i] = pos;
        res -= l[i];
        if (pos + l[i] > n + 1)
        {
            cout << -1;
            return 0;
        }
        pos += min(l[i], max(1ll, n - res - pos + 1));
    }
    if (pos != n + 1)
    {
        cout << -1 << endl;
        return 0;
    }
    else
    {
        for (int i = 1; i <= m; i++)
            cout << p[i] << " ";
        cout << endl;
    }
}
原文地址:https://www.cnblogs.com/mollnn/p/14565100.html