社区讨论

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 条回复,欢迎继续交流。

正在加载回复...