招笑莫队小丑求调
查看原帖
招笑莫队小丑求调
704275
无名之雾楼主2025/2/3 23:10
#include<bits/stdc++.h>
using namespace std;
#define int long long
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;
}
inline void write(int x){
    if(x==0){putchar('0');return;}
    int len=0,k1=x,c[10005];
    if(k1<0)k1=-k1,putchar('-');
    while(k1)c[len++]=k1%10+'0',k1/=10;
    while(len--)putchar(c[len]);
}
const int N=1e6+5;
int a[N],cnt[N],pos[N],cnt23[N],cnt42[N],ans[N];
struct ask{
    int l,r,id;
    bool operator <(const ask &x)const{
        if(pos[l]!=pos[x.l])return pos[l]<pos[x.l];
        if(pos[l]&1)return r<x.r;return r>x.r;
    }
}q[N];
struct sqrt{
    int ans=0;
    void l_del(int x){
        cnt[a[x]]--;ans-=cnt23[a[x]/2];
        if(a[x]%4==0)cnt42[a[x]/4*3]-=cnt[a[x]/2];
        if(a[x]%2==0)cnt23[a[x]*2]-=cnt[a[x]/2*3];
    }
    void l_add(int x){
        cnt[a[x]]++;ans+=cnt23[a[x]/2];
        if(a[x]%4==0)cnt42[a[x]/4*3]+=cnt[a[x]/2];
        if(a[x]%2==0)cnt23[a[x]*2]+=cnt[a[x]/2*3];
    }
    void r_del(int x){
        cnt[a[x]]--;ans-=cnt42[a[x]];
        if(a[x]%2==0)cnt42[a[x]/2*3]-=cnt[a[x]*2];
        if(a[x]%3==0)cnt23[a[x]/3*4]-=cnt[a[x]/3*2];
    }  
    void r_add(int x){
        cnt[a[x]]++;ans+=cnt42[a[x]];
        if(a[x]%2==0)cnt42[a[x]/2*3]+=cnt[a[x]*2];
        if(a[x]%3==0)cnt23[a[x]/3*4]+=cnt[a[x]/3*2];
    }
}ds;
signed main(){
    int n=read(),m=read(),b=sqrt(n),l=1,r=0;
    for(int i=1;i<=n;i++)a[i]=read(),pos[i]=(i-1)/b+1;
    for(int i=1;i<=m;i++)q[i]={read(),read(),i};sort(q+1,q+m+1);
    for(int i=1;i<=m;i++){
        while(l<q[i].l)ds.l_del(l++);
        while(l>q[i].l)ds.l_add(--l);
        while(r>q[i].r)ds.r_del(r--);
        while(r<q[i].r)ds.r_add(++r);
        ans[q[i].id]=ds.ans;
    }
    for(int i=1;i<=m;i++)cout<<ans[i]<<"\n";
    return 0;
}

无法啊通过样例但是瞪了一年感觉没问题。

2025/2/3 23:10
加载中...