CF 最近一场比赛的 F 题 WA on test 6 求助
  • 板块学术版
  • 楼主sbno333
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/11/13 20:27
  • 上次更新2024/11/13 22:22:14
查看原帖
CF 最近一场比赛的 F 题 WA on test 6 求助
416975
sbno333楼主2024/11/13 20:27

rt,题目

#include<bits/stdc++.h>
#define int long long
using namespace std;
bitset<10009> bs[49],z,gg;
int h,t;
int a[49];
void _main(){
	h=t=1;//循环队列
	for(int i=0;i<=45;i++){
		bs[i].reset();
		a[i]=0;
	}
	gg.reset();//为了判 0,记录所有的或
	bs[h][0]=1;
	gg|=bs[h];
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		int x;
		cin>>x;
		int g;
		g=x;
		z.reset();
		int fl;
		fl=0;//如果乘积太大就不要计算
		for(int j=t;;j--,j+=40,j%=40){
			if(g>m||fl==1){//g 爆掉 long long 的最后保障
				fl=1;
				g*=a[j];
				if(!a[j]){//g 回归 0
					fl=2;
				}
				if(j==h){
					break;
				}
				continue;
			}
			z|=(bs[j]<<g);
			g*=a[j];
			if(!a[j]){
				fl=2;
			}
			if(j==h){
				break;
			}
		}
		if(x==0){
			while(t!=h){
				int z;
				z=t-1;
				z+=40;
				z%=40;
				bs[z]|=bs[t];
				t=z;
			}
			bs[h]|=gg;
		}else if(x==1){
			bs[t]|=z;
			continue;
		}
		t++;
		t%=40;
		if(t==h){
			gg|=bs[h];
			bs[h].reset();
			a[h]=0; 
			h++;
			h%=40;
		}
		a[t]=x;
		bs[t]=z;
		gg|=z;
	}
	cout<<(bs[t][m]?"YES":"NO")<<endl;
	return;
}
signed main(){
	int t;
	cin>>t;
	while(t--){
		_main();
	}
	return 0;
}
2024/11/13 20:27
加载中...