题目
题意:
给你 和 ,表示你有 个操作要让 涂满颜色而且每种颜色都要存在,每个 操作都给你一个 表示涂色的范围,现在问要求你求出 ( 表示从 ~ 全部都涂成 颜色)
思路:
我们先来分析不可能的情况:
- 因为 表示范围,所以如果把 全部加起来都达不到 的话,那么就不可能把颜色涂满。
- 第二个就是 的话那么也是不可以的,因为这样会把之前的 覆盖。
然后我们才可以求序列,可以先求出后缀和,然后求出 因为 是后缀和,表示的是后面的是否可以让此时的 满足剩余的 涂满色到结尾,画个数轴的话就可以很容易理解了。
#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;
}