单调队列细节求问
  • 板块学术版
  • 楼主紊莫turtle
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/12/16 20:25
  • 上次更新2023/12/16 22:01:44
查看原帖
单调队列细节求问
443675
紊莫turtle楼主2023/12/16 20:25

最近又做了一遍P3957,一开始WA了,改了一下就过了。

//WA
int ck(int g){
	int h=1,t=0,l=0;
	fill(f+1,f+n+1,-inf);
	F(i,1,n){
		while(h<=t&&x[i]-x[q[h]]>d+g) h++;
		while(l<i&&x[i]-x[l]>=d-g){
			while(h<=t&&f[l]>=f[q[t]])t--;
			q[++t] = l++;
		}if(h<=t)f[i]=f[q[h]]+s[i];
		if(f[i]>=k) return 1;
	}return 0;
}
//AC
int ck(int g){
	int h=1,t=0,l=0;
	fill(f+1,f+n+1,-inf);
	F(i,1,n){
		while(l<i&&x[i]-x[l]>=d-g){
			while(h<=t&&f[l]>=f[q[t]])t--;
			q[++t] = l++;
		}
		while(h<=t&&x[i]-x[q[h]]>d+g) h++;
		if(h<=t)f[i]=f[q[h]]+s[i];
		if(f[i]>=k) return 1;
	}return 0;
}

注意到我只是调换了删除队头和加入队尾的操作,为什么会导致WA呢。

2023/12/16 20:25
加载中...