参考链接1:https://blog.csdn.net/mrcrack/article/details/105310808
参考链接2:https://www.xht37.com/codeforces-round-631-div-1-thanks-denis-aramis-shitov-题解/
参考链接3:https://blog.csdn.net/qq_42968686/article/details/105315793
题意:所有格子都被染色,并且每一种颜色都能被看到
先理解题目的各种边界,
反向,第i次就最多选到i,贪心选最大的染色区间,最大染色部分为 [n-l[i]+1 ~ n]
如果,选择的pi比i小(有可能导致前i个染不到色的情况) 移动一下 移动到i (让i-1个也能染上不一样的颜色)
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+100;
typedef long long ll;
int l[maxn],p[maxn];
ll sum = 0;
int n,m;
bool flag = false;
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++) p[i] = i;
for(int i=1;i<=m;i++){
cin>>l[i];
sum += l[i];
if(i > n-l[i]+1) flag = true;
}
if(sum < n) flag = true;
if(flag){
puts("-1");
return 0;
}
n = n + 1;
for(int i=m;i>=1;i--){
n = n - l[i]; //贪心选最大使得染色部分为 n-l[i]+1 ~ n
p[i] = n;
if(p[i] < i){ //比i小 移动一下 移动到i (让i-1个也能染上不一样的颜色)
n = i;
p[i] = i;
}
}
for(int i=1;i<=m;i++) cout<<p[i]<<" ";
return 0;
}