原题链接:https://vjudge.net/problem/UVA-1623
分类:贪心法
备注:数据结构
对于每个湖要下雨的那一天,要选择上一次该湖满水之后第一个没下雨的且没被使用过的那一天来喝掉水,因此可以用set来辅助。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
int t,n,m,a[maxn],tag[maxn],h[maxn],ans[maxn];
int main(void){
//freopen("in.txt","r",stdin);
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
memset(tag,0,sizeof(tag));
memset(ans,0,sizeof(ans));
for(int i=1;i<=m;i++)
scanf("%d",&a[i]);
set<int>hav;
int ok=1,tot=0;
for(int i=1;i<=m;i++){
if(a[i]==0){
hav.insert(i);
h[++tot]=i;
}else{
set<int>::iterator it=hav.upper_bound(tag[a[i]]);
//printf("it=%d\n",*it);
if(it==hav.end()){ok=0; break;}
tag[a[i]]=i;
ans[*it]=a[i];
hav.erase(*it);
}
}
if(ok){
printf("YES\n");
for(int i=1;i<=tot;i++)
printf("%d%c",ans[h[i]],i==tot?'\n':' ');
}else{
printf("NO\n");
}
}
return 0;
}