调!!
查看原帖
调!!
553871
JMxxxx楼主2025/7/22 11:34
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=4e6;
int a[N],b[N];
struct node{
    bool m[100];
    int l,r;
}tree[N<<2];
set<int>nowb;
int nowa[N];
void pushup(int x)
{
    for(int i=0;i<70;i++)tree[x].m[i]=0;
    for(int i=0;i<70;i++)tree[x].m[i]=tree[x<<1].m[i]|tree[x<<1|1].m[i];
}
void build(int x,int l,int r)
{
    tree[x].l=l;
    tree[x].r=r;
    if(l==r)
    {
        if(nowa[l]) tree[x].m[nowa[l]]=1;
        return;
    }
    int mid=l+(r-l)/2;
    build(x<<1,l,mid);
    build(x<<1|1,mid+1,r);
    pushup(x);
}
bool ans[N];
void ask(int x,int l,int r)
{
    if(l<=tree[x].l&&r>=tree[x].r)
    {
        for(int i=0;i<70;i++)ans[i]|=tree[x].m[i];
        return;
    }
    int mid=tree[x].l+(tree[x].r-tree[x].l)/2;
    if(l<=mid)ask(x<<1,l,r);
    if(r>mid)ask(x<<1|1,l,r);
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int n,m,d,p;cin>>n>>m>>d>>p;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=m;i++)cin>>b[i];
    sort(b+1,b+1+m);
    for(int i=m;i>=1;i--)
    {
        int res=b[i];
        while(b[i]!=0)
        {
            for(int j=i-1;j>=1;j--)
            {
                if(b[i]==b[j])
                {
                    res=b[j];
                }
            }
            b[i]/=d;
        }
        nowb.insert(res);
    }
    m=0;
    for(auto num:nowb)b[++m]=num;
    for(int i=1;i<=n;i++)
    {
        int tmp=a[i];
        while(tmp!=0)
        {
            for(int j=1;j<=m;j++)
            {
                if(b[j]==tmp)
                {
                    nowa[i]=b[j];
                    break;
                }
            }
            if(nowa[i])break;
            tmp/=d;
        }
    }
    build(1,1,n);
    while(p--)
    {
        memset(ans,0,sizeof(ans));
        int x,y;cin>>x>>y;
        ask(1,x,y);
        int res=0;
        for(int i=1;i<=m;i++)if(ans[b[i]])res++;
        cout<<res<<"\n";
    }
    return 0;
}
2025/7/22 11:34
加载中...