题目是UVA1623-神龙喝水
这是网上找到的一个已AC代码
下面是WA代码
#include<stdio.h>
#include<set>
#include<vector>
#include<string.h>
using namespace std;
int days[1000000],vis[1000001];
set<int> ava;
vector<int> cler;
int main(){
#ifdef DEBUG
freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
#endif
int t,n,m;
set<int>::iterator loc;
scanf("%d",&t);
while(t--){
//ava是目前可用的喝水日的集合,cler是没下雨的日期组成的链表
ava.clear();cler.clear();
//vis是某一个池子上一次下雨的日子
memset(vis,-1,sizeof(vis));
scanf("%d%d",&n,&m);
for(int j = 0;j < m;j++){
scanf("%d",days+j);
if(days[j] == 0){
//如果当天下雨的池塘编号是0则将这个日期写入ava与vis
ava.insert(j);
cler.push_back(j);
}
else{
//否则查找区间内最早的喝水日
int index = days[j];
//index是当前遍历到的这天的水池编号
loc = ava.lower_bound(vis[index]);
if(loc == ava.end()) goto fail;
//喝水日对应的水池编号原本是0,改成负数表示这个喝水日被用来喝掉index水池里的水
days[*loc] = -index;
ava.erase(loc);
vis[index] = j;
}
}
printf("YES\n");
//遍历cler里所有没下雨的日期的状态
for(vector<int>::iterator iter = cler.begin();iter != cler.end();iter++){
if(iter != cler.begin()) printf(" ");
printf("%d",-days[*iter]);
}
printf("\n");
continue;
fail:printf("NO\n");
}
return 0;
}
和AC代码对比了很久,代码的整体结构几乎完全一样。
尝试把数组的大小改成2000000也是WA。
溢出应该是没有的,每次循环前也初始化了各个容器,尝试输入各种样例也能得到正确的答案。
问题究竟在何处呢?求高人解答!