wa 7疑问
查看原帖
wa 7疑问
647514
youngr楼主2023/11/16 20:33

虽然已经过了但不知道为什么那么调QAQ

// LUOGU_RID: 135434796
#include<bits/stdc++.h>

const int N=100010;

int n,m,k;
int a[N],t[N];
long long pre[N];
struct Query{
    int l,r,id;
}q[N];
int block;
int get(int x){return (x-1)/block+1;}
bool cmp1(const Query &a,const Query &b){
    int al=get(a.l),bl=get(b.l);
    if(al!=bl)return al<bl;
    if(al&1)return a.r<b.r;
    return a.r>b.r;
}
int askl[N],askr[N],val[N];
int cnt[N*4];

long long res=0;

void addl(int pos){
    res+=cnt[askl[pos]];
    cnt[val[pos]]+=1;
}

void addr(int pos){
    res+=cnt[askr[pos]];
    cnt[val[pos]]+=1;
}

void dell(int pos){
    cnt[val[pos]]-=1;
    res-=cnt[askl[pos]];
}

void delr(int pos){
    cnt[val[pos]]-=1;
    res-=cnt[askr[pos]];
}

long long ans[N];
int main(){
    std::ios::sync_with_stdio(false),std::cin.tie(nullptr);

    std::vector<long long>nums;
    nums.emplace_back(0);
    nums.emplace_back(-k);
    nums.emplace_back(k);
    std::cin>>n>>k;
    for(int i=1;i<=n;++i)std::cin>>t[i];
    for(int i=1;i<=n;++i)std::cin>>a[i];
    for(int i=1;i<=n;++i){
        pre[i]=(long long)a[i]*(t[i]==1?1:-1);
        pre[i]+=pre[i-1];
        nums.emplace_back(pre[i]);
        nums.emplace_back(pre[i]-k);
        nums.emplace_back(pre[i]+k);
    }
    std::sort(nums.begin(),nums.end());
    nums.erase(std::unique(nums.begin(),nums.end()),nums.end());
    for(int i=0;i<=n;++i)val[i]=std::lower_bound(nums.begin(),nums.end(),pre[i])-nums.begin();
    for(int i=0;i<=n;++i)askl[i]=std::lower_bound(nums.begin(),nums.end(),pre[i]+k)-nums.begin();
    for(int i=0;i<=n;++i)askr[i]=std::lower_bound(nums.begin(),nums.end(),pre[i]-k)-nums.begin();
    std::cin>>m;
    for(int i=1;i<=m;++i){
        std::cin>>q[i].l>>q[i].r;
        q[i].id=i;
    }
    block=std::sqrt(n);
    std::sort(q+1,q+1+m,cmp1);

    int L=1,R=0;
    for(int i=1;i<=m;++i){
        int l=q[i].l-1,r=q[i].r,id=q[i].id;
        while(L>l)addl(--L);
        while(R<r)addr(++R);
        while(L<l)dell(L++);
        while(R>r)delr(R--);
        ans[id]=res;
    }

    for(int i=1;i<=m;++i)std::cout<<ans[i]<<'\n';

    return 0;
}

把

    for(int i=0;i<=n;++i)val[i]=std::lower_bound(nums.begin(),nums.end(),pre[i])-nums.begin();
    for(int i=0;i<=n;++i)askl[i]=std::lower_bound(nums.begin(),nums.end(),pre[i]+k)-nums.begin();
    for(int i=0;i<=n;++i)askr[i]=std::lower_bound(nums.begin(),nums.end(),pre[i]-k)-nums.begin();

改成

    for(int i=0;i<=n;++i)val[i]=std::lower_bound(nums.begin(),nums.end(),pre[i])-nums.begin()+1;
    for(int i=0;i<=n;++i)askl[i]=std::lower_bound(nums.begin(),nums.end(),pre[i]+k)-nums.begin()+1;
    for(int i=0;i<=n;++i)askr[i]=std::lower_bound(nums.begin(),nums.end(),pre[i]-k)-nums.begin()+1;

就过了

2023/11/16 20:33
加载中...