社区讨论
就修改了一个数,就从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 条回复,欢迎继续交流。
正在加载回复...