社区讨论

就修改了一个数,就从85降到60!!!

P2629好消息,坏消息参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lobibmxk
此快照首次捕获于
2023/10/29 21:28
2 年前
此快照最后确认于
2023/11/04 02:39
2 年前
查看原帖
对于求解一段区间中前缀和最小值,我用的是ST表,我不知道是不是这里写错,但是我就修改了cnt变量的值,因为我之前没有判断数组的第一个数大于等于0的情况。所以当我修改cnt值时,我就从85变成60了QAQ,求助大佬们,帮我看看是哪里错了。
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+100;
const int INF=INT_MAX;
int a[N],s[N],st[N][20];
int n;

inline void Init()
{
	memset(st,INF,sizeof(st));
	for(int i=0;i<n;i++)
		st[i][0]=s[i];
	for(int i=1;(1<<i)<=n;i++)
		for(int j=0;j+(1<<i)-1<n;j++)
			st[j][i]=min(st[j][i-1],st[j+(1<<(i-1))][i-1]);
}

inline int query(int l,int r)
{
	int k=(int)(log((double)(r-l+1))/log(2.0));
	return min(st[l][k],st[r-(1<<k)+1][k]);
}

int main()
{
	int sum=0;
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		scanf("%d",&a[i]); 
		sum+=a[i];
		if(i==0) s[i]=a[i];
		else s[i]=s[i-1]+a[i];
	}
	Init();
	
	int minn=a[0],y=0,cnt=((a[0]>=0)?1:0);//我就是修改这里; 
	for(int i=0;i<n-1;i++)
	{
		y+=a[i];
		minn=min(minn,y);
		if((sum-y)+minn<0) continue;
		int x=query(i+1,n-1);
		if(x-y<0) continue;
		cnt++;
	}
	printf("%d\n",cnt);
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...