题意:
一行上有 个方格,给出每个颜色染色的长度 ,可以选择从 中的一处开始染色,问能否给每个方格染上颜色并且可以看到每一种颜色。
每个颜色染色的起点应不小于自己序次对应的方格。
无解的情况:
-
若总染色长度小于 ,最终一定会有方格没有颜色。
-
若某个颜色的最大起点在前面的方格中,此时会覆盖先前至少一种颜色。
染色时的情况:
假设每个颜色互不覆盖能染的最大长度为
,
即为该颜色段的起点。
若
大于当前方格位置,说明如果从当前方格处开始染色最终一定会有空白的方格,此时至少要从
处染色才能给每个方格染色。
若
小于当前方格位置,说明接下来一定会有颜色相覆盖,此时保证每个颜色至少染上自己对应的方格即可。
AC代码:
const int N = 1e5 + 10;
int a[N], ans[N];
int n, m;
int res, tmp, now;
ll sum;
int main()
{
sum = 0;
sdd(n, m);
rep(i, 1, m)
{
sd(a[i]);
sum += a[i];
}
if (sum < n)
{
puts("-1");
return 0;
}
rep(i, 1, m)
{
if (a[i] > (n - i + 1))
{
puts("-1");
return 0;
}
ans[i] = i;
}
now = n;
per(i, m, 1)
{
if (now - a[i] + 1 <= i)
{
ans[i] = i;
break;
}
ans[i] = now - a[i] + 1;
now -= a[i];
}
rep(i, 1, m)
printf("%d%c", ans[i], i == n ? '\n' : ' ');
return 0;
}