关于莫队效率
查看原帖
关于莫队效率
567739
Sellaris楼主2022/3/6 11:40

RT.为什么我打的这个莫队的板子又慢又烂。是我哪里写错了吗?求助大佬

///*****Sellaris*****///
//#pragma once
//#pragma GCC optimize(2)
//#pragma GCC optimize(3)
//#define _USE_MINGW_ANSI_STDIO 1
#include <bits/stdc++.h>
//#include <bits/extc++.h>
#define ll long long
using namespace std;
//using namespace __gnu_pbds;
const int maxn=1e6+10;
//__gnu_pbds::tree <ll,null_type,less<ll>,rb_tree_tag,tree_order_statistics_node_update> TREE ;
inline int read(){
    register int ret=0,f=1;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
    while(isdigit(ch)){ret=ret*10+ch-'0';ch=getchar();}
    return ret*f; //x=(x<<1)+(x<<3)+(ch^48);
}
int n,m,a[maxn];
int s,cur;
int ans[maxn],num[maxn];
struct query{
    int l,r,bel,id;
}q[maxn];
inline bool cmp(query a,query b){
    if(a.bel==b.bel) { return (a.r<b.r); }
    return (a.bel<b.bel) ;
}
inline void add(int p){
    num[p]++;
    if(num[p]==1) cur++;
    return;
}
inline void del(int p){
    num[p]--;
    if(num[p]==0) cur--;
    return;
}
signed main(){
    //std::ios::sync_with_stdio(false);std::cin.tie(NULL);std::cout.tie(NULL);
    //freopen(in.txt,r,stdin);freopen(out.txt,w,stdout);
    n=read();
    for(int i=1;i<=n;i++) a[i]=read();
    m=read();s=sqrt(n);
    for(int i=1;i<=m;i++){
        q[i].l=read();
        q[i].r=read();
        q[i].bel=(q[i].r-1)/s+1;
        q[i].id=i;
    }
    std::sort(q+1,q+1+m,cmp);
 
    int l=1,r=0;
    for(int i=1;i<=m;i++){
        while(l<q[i].l) del(a[l++]);
        while(l>q[i].l) add(a[--l]);
        while(r<q[i].r) add(a[++r]);
        while(r>q[i].r) del(a[r--]);
        ans[q[i].id]=cur;
    }
    for(int i=1;i<=m;i++){
        printf("%d\n",ans[i]);
    }
    return 0;
} 
2022/3/6 11:40
加载中...