问个问题
查看原帖
问个问题
681036
OldDriverTree楼主2024/3/17 20:28

rt,bfs 时搜到的状态如果在之前有一个嘲讽值等于当前状态,天数小于当前状态的为什么要还要加入哈希表?天数越长不是越不优吗?

顺便求调代码

#include<bits/stdc++.h>
#define P pair<int,int>
using namespace std;
const int N=101;
bitset<100000001> Map;
int n,m,day,V,Q[N],f[N][N];
int MC,a[N],b[N];
vector<P> num;

int read() {
	int x=0; char c=0; while (!isdigit(c) ) c=getchar();
	while (isdigit(c) ) x=(x<<3)+(x<<1)+(c&15),c=getchar();
	return x;
}
struct node {
	int F,L,step;
};
void bfs()
{
	queue<node> q;
	q.push({1,0,1});
	while (!q.empty() )
	{
		node u=q.front(); q.pop();
		if (u.step>=day) break;
		q.push({u.F,u.L+1,u.step+1});
		if (u.L>1&&1ll*u.L*u.F<=V) {
			if (Map[u.F*u.L]) continue;
			Map[u.F*u.L]=true,num.push_back({u.F*u.L,u.step+1});
			q.push({u.F*u.L,u.L,u.step+1});
		}
	}
}
bool check(int x)
{
	if (x<=day) return true;
	for (int i=(int)(num.size() )-1,j=0,maxv=-1e9;~i;i--) {
		while (j<num.size()&&num[i].first+num[j].first<=x)
		maxv=max(maxv,num[j].first-num[j].second),j++;
		if (num[i].first-num[i].second+maxv+day>=x) return true;
		if (num[i].first<=x&&num[i].first+day-num[i].second>=x) return true;
	}
	return false;
}
int main()
{
	n=read(),m=read(),MC=read();
	for (int i=1;i<=n;i++) a[i]=read();
	for (int i=1;i<=n;i++) b[i]=read();
	for (int i=0;i<m;i++) V=max(Q[i]=read(),V);
	for (int i=1;i<=n;i++)
		for (int j=a[i];j<=MC;j++) {
			f[i][j-a[i] ]=max(f[i][j-a[i] ],f[i-1][j]+1);
			f[i][min(j-a[i]+b[i],MC)]=max(f[i][min(j-a[i]+b[i],MC)],f[i-1][j]);
		}
	for (int i=1;i<=n;i++)
		for (int j=0;j<=MC;j++)
			day=max(day,f[i][j]); //可以前 i 天就把大佬怼死
	
	bfs(),sort(num.begin(),num.end() );
	for (int i=0;i<m;i++) putchar(check(Q[i])?'1':'0'),putchar('\n');
	return 0;
}
2024/3/17 20:28
加载中...