BFS 过程中在 hash 表中有嘲讽值等于当前的值,天数优于当前的天数时为什么还要插入
我这个代码怎么 MLE 了,用的题解里的思路
#include<bits/stdc++.h>
#define P pair<int,int>
using namespace std;
const int N=101,V=1e8;
unordered_map<int,bool> Map;
int n,m,day,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&&u.F<=V/u.L&&!Map[u.F*u.L])
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=0;~i;i--) {
if (num[i].first>x) continue;
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=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() );
while (m--) putchar(check(read() )?'1':'0'),putchar('\n');
return 0;
}