codeforces C. Dreamoon Likes Coloring

在这里插入图片描述

题目

题意:

给你 n n m m ,表示你有 m m 个操作要让 n n 涂满颜色而且每种颜色都要存在,每个 m m 操作都给你一个 a i a_i 表示涂色的范围,现在问要求你求出 p i p_i p i p_i 表示从 p i p_i ~ p i + a i p_i + a_i 全部都涂成 i i 颜色)

思路:

我们先来分析不可能的情况:

  • 因为 a i a_i 表示范围,所以如果把 a i a_i 全部加起来都达不到 n n 的话,那么就不可能把颜色涂满。
  • 第二个就是 n a i + 1 < i n-a_i+1<i 的话那么也是不可以的,因为这样会把之前的 i t h i_{th} 覆盖。

然后我们才可以求序列,可以先求出后缀和,然后求出 m a x ( i , n s u m i + 1 ) max(i, n - sum_i + 1) 因为 s u m i sum_i 是后缀和,表示的是后面的是否可以让此时的 i i 满足剩余的 a i a_i 涂满色到结尾,画个数轴的话就可以很容易理解了。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
#include <string>
#include <cmath>
#include <set>
#include <map>
#include <deque>
#include <stack>
using namespace std;
typedef long long ll;
typedef vector<int> veci;
typedef vector<ll> vecl;
typedef pair<int, int> pii;
template <class T>
inline void read(T &ret) {
    char c;
    int sgn;
    if (c = getchar(), c == EOF) return ;
    while (c != '-' && (c < '0' || c > '9')) c = getchar();
    sgn = (c == '-') ? -1:1;
    ret = (c == '-') ? 0:(c - '0');
    while (c = getchar(), c >= '0' && c <= '9') ret = ret * 10 + (c - '0');
    ret *= sgn;
    return ;
}
inline void out(int x) {
    if (x > 9) out(x / 10);
    putchar(x % 10 + '0');
}
const int maxn = 1e5 + 10;
ll a[maxn], sum[maxn] = {0};
int main() {
    int n, m;
    read(n), read(m);
    for (int i = 1; i <= m; i++) read(a[i]);
    for (int i = 1; i <= m; i++) {
        if (n - a[i] + 1 < i) {
            printf("-1");
            return 0;
        }
    }
    for (int i = m; i >= 1; i--) {
        sum[i] = sum[i + 1] + a[i];
    }
    if (sum[1] < n) {
        printf("-1\n");
        return 0;
    }
    for (int i = 1; i <= m; i++) {
        printf("%lld ", max(1ll * i, n - sum[i] + 1));
    }
    return 0;
}

发布了463 篇原创文章 · 获赞 27 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/weixin_45031646/article/details/105369705