求助,开 O2 AC,不开20
查看原帖
求助,开 O2 AC,不开20
926650
Oracle_zyz楼主2024/10/1 12:37

代码:

#include<bits/stdc++.h>
using namespace std;

#define PII pair<int,int>
typedef long long LL;
typedef unsigned long long ULL;
LL read() {
    char c=getchar(); LL sum=0,flag=1;
    while(c<'0'||c>'9') {if(c=='-') flag=-1; c=getchar();}
    while(c>='0'&&c<='9') {sum=sum*10+c-'0'; c=getchar();}
    return sum*flag;
}

const int N=5e5+10,M=1e6+10;
int n,m,d,q;
LL a[N],b[N];
int nxt[70],p[70];
struct node {
    int id,l,r;
}s[M];
int tr[N];
int ans[M];

int cmp(node x,node y) {
    return x.l<y.l;
}

int lowbit(int x) {
    return x&(-x);
}

void modify(int nd,int x) {
    if(!nd) return ;
    for(int i=nd;i<=n;i+=lowbit(i)) tr[i]+=x;
}

int query(int nd) {
    int ans=0;
    for(int i=nd;i;i-=lowbit(i)) ans+=tr[i];
    return ans;
}

int main(){
    n=read(); m=read(); d=read(); q=read();
    for(int i=1;i<=n;i++) a[i]=read();
    map<LL,int> pd;
    for(int i=1;i<=m;i++) {
        b[i]=read();
        pd[b[i]]=1;
    }
    sort(b+1,b+1+m);
    for(int i=m;i>=1;i--) {
        LL x=b[i];
        while(x) {
            x/=d; if(pd[x]) {b[i]=-1; break;}
        }
    }
    map<LL,int> id;    
    for(int i=1;i<=m;i++) if(b[i]!=-1) id[b[i]]=i;
    for(int i=n;i>=1;i--) {
        if(id.count(a[i])) a[i]=id[a[i]];
        else {
            while(a[i]) {
                a[i]/=d;
                if(id.count(a[i])) {a[i]=id[a[i]];break;}
            }            
        }
        nxt[i]=p[a[i]]; p[a[i]]=i;
    }
    for(int i=1;i<=n;i++) if(p[a[i]]==i&&a[i]) modify(i,1);
    for(int i=1;i<=q;i++) {
        int l=read(),r=read();
        s[i]={i,l,r};
    }
    sort(s+1,s+1+q,cmp);
    int np=0;
    for(int i=1;i<=q;i++) {
        while(np<s[i].l) {
            if(a[np]) {
                modify(np,-1);
                modify(nxt[np],1);
            }
            np++;
        }
        ans[s[i].id]=query(s[i].r)-query(s[i].l-1);
    }

    for(int i=1;i<=q;i++) cout<<ans[i]<<endl;

    return 0;
}
/*
离线树状数组即可
移动左端点
*/
2024/10/1 12:37
加载中...