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;
}