就修改了一个数,就从85降到60!!!
查看原帖
就修改了一个数,就从85降到60!!!
286752
h1910819075楼主2021/10/23 18:43

对于求解一段区间中前缀和最小值,我用的是ST表,我不知道是不是这里写错,但是我就修改了cnt变量的值,因为我之前没有判断数组的第一个数大于等于0的情况。所以当我修改cnt值时,我就从85变成60了QAQ,求助大佬们,帮我看看是哪里错了。

#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;
}
2021/10/23 18:43
加载中...