分析:找出当前下雨天之前的最后一个满湖的位置,从当前开始找不下雨天。
#include<iostream>
#include<string.h>
#include<sstream>
#include<set>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<math.h>
using namespace std;
const int maxn = 1e6 + 5;
int lake[maxn];
int ans[maxn];
set<int> s;
vector<int> v;
int main()
{
int T; scanf("%d", &T);
for (int k = 1; k <= T; k++) {
int n, m; scanf("%d%d", &n, &m);
memset(lake + 1, 0, sizeof(int)*n);
s.clear(); v.clear();
bool fail = false;
for (int i = 1; i <= m; i++) {
int t;
scanf("%d", &t);
if (t) {
set<int>::iterator it = s.lower_bound(lake[t]);
if (it != s.end()) {
ans[*it] = t;
lake[t] = i;//更新最后一个满湖位置信息
s.erase(it);
}
else {
for (; i < m; i++) scanf("%d", &t);
fail = true;
}
}
else {
v.push_back(i);
ans[i] = 0;
s.insert(i);
}
}
if (fail) {
puts("NO");
}
else {
printf("YES"); printf("\n%d", ans[v[0]]);
for (int i = 1; i < v.size(); i++) {
printf(" %d", ans[v[i]]);
}
putchar('\n');
}
}
return 0;
}