关于P4085
  • 板块学术版
  • 楼主lxzy_
  • 当前回复1
  • 已保存回复1
  • 发布时间2021/5/13 18:21
  • 上次更新2023/11/4 23:19:23
查看原帖
关于P4085
67493
lxzy_楼主2021/5/13 18:21

RT,我的方法是枚举每一种区间的最大值 ii ,然后取出最长能够得到的区间,判断这个区间的 fi>=m\sum f_i>=m 是否成立。

preipre_i表示从第 ii 个点开始往前第一个 si\geq s_i的数的下标

sufisuf_i表示从第 ii 个点开始往后第一个 si\geq s_i的数的下标

这个做法只拿了 80 分,#6 和#7 WA了。

求助各位大佬

#include<cstdio>
#include<iomanip>
#define int long long
#define INF 0x7f7f7f7f7f7f7f7f
using namespace std;
const int N=1e5+50;
int f[N],s[N],sum[N],pre[N],suf[N];
int n,m;
inline int Min(int a,int b){return a<b?a:b;}
signed main()
{
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++) scanf("%lld%lld",&f[i],&s[i]),sum[i]=sum[i-1]+f[i];
	s[0]=s[n+1]=INF,pre[1]=0,suf[n]=n+1;
	for(int i=n;i>=1;i--){
		int pos=i+1;
		while(s[pos]<s[i]&&pos!=n+1) pos=suf[pos];
		suf[i]=pos;
	}
	int mine=INF;
	for(int i=1;i<=n;i++){
		int pos=i-1;
		while(s[pos]<s[i]&&pos) pos=pre[pos];
		pre[i]=pos;
		if(sum[suf[i]-1]-sum[pre[i]]>=m) mine=Min(mine,s[i]);
	}
	printf("%lld\n",mine);
	return 0;
}
2021/5/13 18:21
加载中...