SPOJ DQUERY D-query(莫队基础题)

题目链接:http://www.spoj.com/problems/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.

Input

  • Line 1: n (1 ≤ n ≤ 30000).
  • Line 2: n numbers a1, a2, ..., an (1 ≤ ai ≤ 106).
  • Line 3: q (1 ≤ q ≤ 200000), the number of d-queries.
  • In the next q lines, each line contains 2 numbers i, j representing a d-query (1 ≤ i ≤ j ≤ n).

Output

  • For each d-query (i, j), print the number of distinct elements in the subsequence ai, ai+1, ..., aj in a single line.

Example

Input
5
1 1 2 1 3
3
1 5
2 4
3 5

Output
3
2
3 题意:给定一个序列,询问m次,每次求出区间 [ L,R ] 不同数字出现的次数。题解:莫队模板题
 1 #include <cmath>
 2 #include <cstdio>
 3 #include <algorithm>
 4 using namespace std;
 5
 6 const int N=1e6+10;
 7 struct node{
 8     int l,r,id;
 9 }Q[N];
10
11 int a[N],ans[N],cnt[N],BLOCK;
12 bool cmp(node x,node y){
13     if(x.l/BLOCK==y.l/BLOCK) return x.r<y.r;
14     return x.l/BLOCK<y.l/BLOCK;
15 }
16
17 int n,m,Ans=0;
18
19 void add(int x){
20     cnt[a[x]]++;
21     if(cnt[a[x]]==1) Ans++;
22 }
23
24 void del(int x){
25     cnt[a[x]]--;
26     if(cnt[a[x]]==0) Ans--;
27 }
28
29 int main(){
30     scanf("%d",&n);
31     BLOCK=sqrt(n);
32     for(int i=1;i<=n;i++){
33         scanf("%d",&a[i]);
34     }
35     scanf("%d",&m);
36     for(int i=1;i<=m;i++){
37         scanf("%d%d",&Q[i].l,&Q[i].r);
38         Q[i].id=i;
39     }
40     sort(Q+1,Q+1+m,cmp);
41     int L=1,R=0;
42     for(int i=1;i<=m;i++){
43         while(L<Q[i].l){
44             del(L);
45             L++;
46         }
47         while(L>Q[i].l){
48             L--;
49             add(L);
50         }
51         while(R<Q[i].r){
52             R++;
53             add(R);
54         }
55         while(R>Q[i].r){
56             del(R);
57             R--;
58         }
59         ans[Q[i].id]=Ans;
60     }
61     for(int i=1;i<=m;i++)
62     printf("%d\n",ans[i]);
63     return 0;
64 }

原文地址:https://www.cnblogs.com/Leonard-/p/8460401.html

时间: 2024-11-09 09:33:49

SPOJ DQUERY D-query(莫队基础题)的相关文章

[SDOI2009][bzoj1878] HH的项链 [莫队模板题]

题面: 传送门 思路: 就是一道莫队的模板题目...... 开一个1000000的数组记录每个数出现的次数,然后每次从1到0或者从0到1更新答案 莫队讲解看这里:莫队 Code: 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 inline int

[luoguP1972] [SDOI2009]HH的项链(莫队)

传送门 莫队基础题,适合我这种初学者. 莫队是离线算法,通常不带修改,时间复杂度为 O(n√n) 我们要先保证通过 [ l , r ] 求得 [ l , r + 1 ] , [ l , r - 1 ] , [ l - 1 , r ] , [ l + 1 , r ] 的效率是O(1)的 对于莫队的理解,移步远航休息栈 ——代码 1 #include <cmath> 2 #include <cstdio> 3 #include <iostream> 4 #include &

莫队算法入门

Talk about 莫队 莫队算法,是莫涛dalao发明的一个神奇的优化暴力算法,它使用看似很simple的指针移动操作以及分块的思想来将复杂度优化至\(O(n\sqrt n)\) 莫队的基本思想也很简单: 离线操作,在后面会提到我们通过排序来降低复杂度 设之前我们以及求出了区间\([l,r]\)的答案,那么我们考虑如何快速转移到\([l+1,r],[l-1,r],[l,r-1],[l,r+1]\) 每一次利用之前的信息跳动指针即可得出答案 不过如果是这样的话,只要出题人把数据造坑一点,让你\

莫队算法小结(Markdown版)

wtf,最近挖坑有点小多啊,没办法>_<容我先把糖果公园A了再来写这个吧= =看看今天能不能A掉 好吧,我承认我第二天才把糖果公园A掉>_<下面把这篇小结补上 首先众所周知的是莫队算法是要把询问先按左端点属于的块排序,再按右端点排序 复杂度就先不证了,有兴趣的同学可以自己YY下或者查阅资料 下面举几个例子详细说明 1.小Z的袜子 Description: 给定一个序列m个询问 每次询问: 区间中选两个数,两个数相等的概率 若概率为0则输出01 仔细观察发现,令x表示x这个值出现的次

D. Powerful array 莫队算法或者说块状数组 其实都是有点优化的暴力

莫队算法就是优化的暴力算法.莫队算法是要把询问先按左端点属于的块排序,再按右端点排序.只是预先知道了所有的询问.可以合理的组织计算每个询问的顺序以此来降低复杂度. D. Powerful array 典型的莫队算法题 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 #include

莫队算法小结

唔,想有更加舒爽的阅读体验请移步http://mlz000.logdown.com/posts/252433-mo-algorithm-summary 首先众所周知的是莫队算法是要把询问先按左端点属于的块排序,再按右端点排序 复杂度就先不证了,有兴趣的同学可以自己YY下或者查阅资料 下面举几个例子详细说明 1.小Z的袜子 Description: 给定一个序列m询问 每次询问: 区间中选两个数,两个数相等的概率 若概率为则输出0/1 仔细观察发现,令x表示x个值出现的次数,则每次询问[l,r]区

【WC2013】 糖果公园 - 树上莫队

[问题描述] Candyland 有一座糖果公园,公园里不仅有美丽的风景.好玩的游乐项目,还有许多免费糖果的发放点,这引来了许多贪吃的小朋友来糖果公园游玩.糖果公园的结构十分奇特,它由 n 个游览点构成,每个游览点都有一个糖果发放处,我们可以依次将游览点编号为 1 至 n.有 n – 1 条 双向道路 连接着这些游览点,并且整个糖果公园都是 连通的 ,即从任何一个游览点出发都可以通过这些道路到达公园里的所有其它游览点.糖果公园所发放的糖果种类非常丰富,总共有 m 种,它们的编号依次为 1至 m.

【国家集训队】 数颜色 - 莫队

题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P Col 把第P支画笔替换为颜色Col. 为了满足墨墨的要求,你知道你需要干什么了吗? 输入输出格式 输入格式: 第1行两个整数N,M,分别代表初始画笔的数量以及墨墨会做的事情的个数. 第2行N个整数,分别代表初始画笔排中第i支画笔的颜色. 第3行到第2+M行,每行分别代表墨墨会做的一件事

【BZOJ4540】【HNOI2016】序列(莫队)

[BZOJ4540][HNOI2016]序列(莫队) 题面 BZOJ 洛谷 Description 给定长度为n的序列:a1,a2,-,an,记为a[1:n].类似地,a[l:r](1≤l≤r≤N)是指序列:al,al+1,-,ar- 1,ar.若1≤l≤s≤t≤r≤n,则称a[s:t]是a[l:r]的子序列.现在有q个询问,每个询问给定两个数l和r,1≤l≤r ≤n,求a[l:r]的不同子序列的最小值之和.例如,给定序列5,2,4,1,3,询问给定的两个数为1和3,那么a[1:3]有 6个子序