莫队算法

莫队算法

莫队算法文档

DQUERY

Given a sequence of n numbers a1, a2, …, an and a number of d-queries. A d-query is a pair (i, j) (1 ≤ i ≤ j ≤ n). For each d-query (i, j), you have to return the number of distinct elements in the subsequence ai, ai+1, …, aj.

解法

离线修改查询次序,莫队。 之前写的挫,看到这个写的比较好。

代码

#include<cstdio>
#include<algorithm>

using namespace std;

const int SIZE = 300005;
const int CSIZE = 1000005;
const int BLOCK = 555;

int cnt[CSIZE], a[SIZE], res[SIZE], ans;

struct node {
    int L, R, i;
} q[SIZE];

bool cmp(const node &x, const node &y) {
    if(x.L/BLOCK != y.L/BLOCK) return x.L/BLOCK < y.L/BLOCK;
    return x.R < y.R;
}

void add(int pos) {
    cnt[a[pos]]++;
    if(cnt[a[pos]] == 1) ans++;
}

void remove(int pos) {
    cnt[a[pos]]--;
    if(!cnt[a[pos]]) ans--;
}

int main() {
    int N;
    scanf("%d",&N);
    for(int i = 1; i <= N; i++) scanf("%d",&a[i]);
    int Q;
    scanf("%d",&Q);
    for(int i = 1; i <= Q; i++) {
        scanf("%d%d",&q[i].L, &q[i].R);
        q[i].i = i;
    }
    sort(q + 1, q + 1 + Q, cmp);
    int l = 1, r = 1;
    for(int i = 1; i <= Q; i++) {
        int L = q[i].L, R = q[i].R;
        while(l < L) remove(l++);
        while(l > L) add((l--) - 1);
        while(r <= R) add(r++);
        while(r > R+1) remove((r--) - 1);
        res[q[i].i] = ans;
    }
    for(int i = 1; i <= Q; i++) printf("%d\n",res[i]);

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值