求助!为什么该写法是错的(样例可过)
查看原帖
求助!为什么该写法是错的(样例可过)
856459
yangjunhan1楼主2024/10/3 21:06
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=5e5+10;
int n,m,a[N],k,fl,fr;
struct ST{
    int v,mi,ma;
}t[N<<2];
struct qp{
    int ls,rs,L,R;
};
void pushup(int rt){
    t[rt].v=t[rt<<1].v+t[rt<<1|1].v;
    t[rt].mi=min(t[rt<<1].mi,t[rt<<1|1].mi);
    t[rt].ma=max(t[rt<<1].ma,t[rt<<1|1].ma);
}
void build(int rt,int l,int r){
    if(l==r){
        t[rt]={a[l],a[l],a[l]};
        return ;
    }
    int mid=l+r>>1;
    build(rt<<1,l,mid);
    build(rt<<1|1,mid+1,r);
    pushup(rt);
}
qp qry(int rt,int l,int r){
    if(fl<=l && r<=fr){
        if(t[rt].ma<=k){
            qp res={t[rt].v,0,r-l+1,0};
            return res;
        }
        if(t[rt].mi>k){
            qp res={0,t[rt].v,0,r-l+1};
            return res;
        }
    }
    int mid=l+r>>1;
    qp res1={0,0,0,0},res2={0,0,0,0},res;
    if(fl<=mid) res1=qry(rt<<1,l,mid);
    if(mid<fr)  res2=qry(rt<<1|1,mid+1,r);
    res={res2.ls+res1.ls,res1.rs+res2.rs,res1.L+res2.L,res1.R+res2.R};
    return res;
}
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=n;i++)   cin>>a[i];
    build(1,1,n);
    while(m--){
        cin>>fl>>fr>>k;
        qp ans=qry(1,1,n);
        //cout<<ans.ls<<" "<<ans.rs<<" "<<ans.L<<" "<<ans.R<<endl;
        cout<<ans.rs-ans.ls+((2*k+ans.L-1)*ans.L-(2*k+2*fr-2*fl-ans.R+1)*ans.R)/2<<endl;
    }
    return 0;
}
2024/10/3 21:06
加载中...