社区讨论
0pts求条
P9681幽默的世界。参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @m59hcknx
- 此快照首次捕获于
- 2024/12/29 18:40 去年
- 此快照最后确认于
- 2024/12/29 18:44 去年
CPP
#include<bits/stdc++.h>
using namespace std;
long long n,q;
long long a[229028];
long long s[229028];
vector<long long> l;
vector<long long> r;
signed main(){
cin>>n>>q;
for(int i = 1;i<=n;i++){
cin>>a[i];
}
for(int i = 1;i<=n;i++){
s[i] = a[i]+s[i-1];
}
long long tmp = 0,j;
for(int i = 1;i<=n;i++){
if(a[i] > 0){
r.emplace_back(i-1);
for(j = i;s[j-1] < s[i]&&j > tmp;j--){}
l.emplace_back(j);
tmp = r.back();
}
}
long long L,R,pos1,pos2,ans;
long long len = l.size();
for(int i = 1;i<=q;i++){
ans = 0;
cin>>L>>R;
L--;
R--;
pos1 = lower_bound(r.begin(),r.end(),L)-r.begin();
pos2 = upper_bound(r.begin(),r.end(),R)-r.begin();
if(pos1 == pos2){
cout<<0<<'\n';
continue;
}
if(r[pos2] == R){
pos2++;
}
if(l[pos1] <= L&&r[pos1] >= L&&r[pos1] <= R){
ans += r[pos1]-L+1;
}else if(l[pos1] >= L&&r[pos1] <= R){
ans += r[pos1]-l[pos1]+1;
}
for(int j = pos1+1;j<pos2;j++){
ans += r[j]-l[j]+1;
}
cout<<ans<<'\n';
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...