问个问题
查看原帖
问个问题
681036
OldDriverTree楼主2024/3/17 18:04
  1. BFS 过程中在 hash 表中有嘲讽值等于当前的值,天数优于当前的天数时为什么还要插入

  2. 我这个代码怎么 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;
}
2024/3/17 18:04
加载中...