蒟蒻求助莫队
查看原帖
蒟蒻求助莫队
368884
sunrise1024楼主2022/5/10 13:52

rt,这道题TLE了,求大佬帮忙看看

#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,tune=native")
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
char buf[1<<21],*p1=buf,*p2=buf,obuf[1<<23],*O=obuf;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
void print(long long x) {
    if(x>9) print(x/10);
    *O++=x%10+'0';
}
inline int read(){
   int s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
const int MAXN=1e5+5;
int n,m,l=1,r,kc;
ll sum[MAXN],an,ans[MAXN],a1[MAXN],a2[MAXN],k,s[MAXN][3];
vector<ll> ls;
ll ma[MAXN<<2];
int getid(ll x){return lower_bound(ls.begin(),ls.end(),x)-ls.begin()+1;}
struct qu{
    int l,r,lc,rc,id;
}q[MAXN];
bool cmp(qu x,qu y){
    return x.lc!=y.lc?x.lc<y.lc:x.lc&1?x.rc<y.rc:x.rc>y.rc;
}
int main(){
    n=read(),k=read();
    ls.push_back(0);
    ls.push_back(k);
    ls.push_back(-k);
    for(int i=1;i<=n;++i)a1[i]=read();
    for(int i=1;i<=n;++i){
        a2[i]=read();
        if(a1[i]==1){
            sum[i]=sum[i-1]+a2[i];
        }
        else{
            sum[i]=sum[i-1]-a2[i];
        }
        ls.push_back(sum[i]);
        ls.push_back(sum[i]+k);
        ls.push_back(sum[i]-k);
    }
    sort(ls.begin(),ls.end());
    ls.erase(unique(ls.begin(),ls.end()),ls.end());
    for(int i=0;i<=n;++i){
        s[i][0]=getid(sum[i]-k);
        s[i][1]=getid(sum[i]);
        s[i][2]=getid(sum[i]+k);
    }
    kc=400;
    m=read();
    for(int i=1;i<=m;++i){
        q[i].l=read();
        q[i].r=read();
        q[i].l--;
        q[i].lc=l/kc;
        q[i].rc=r/kc;
        q[i].id=i;
    }
    sort(q+1,q+m+1,cmp);
    for(int i=1;i<=m;++i){
        while(l>q[i].l){
            l--;
            an+=ma[s[l][2]];
            ma[s[l][1]]++;
        }
        while(r<q[i].r){
            r++;
            an+=ma[s[r][0]];
            ma[s[r][1]]++;
        }
        while(l<q[i].l){
            ma[s[l][1]]--;
            an-=ma[s[l][2]];
            l++;
        }
        while(r>q[i].r){
            ma[s[r][1]]--;
            an-=ma[s[r][0]];
            r--;
        }
        ans[q[i].id]=an;
    }
    for(int i=1;i<=m;++i)printf("%lld\n",ans[i]);
    //while(1);
    return 0;
}
2022/5/10 13:52
加载中...