D-query SPOJ - DQUERY(莫队)统计不同数的数量
Posted qldabiaoge
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了D-query SPOJ - 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
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long LL; 4 const int maxn = 2e6 + 10; 5 int n, m, L, R, sz, a[maxn]; 6 int sum[maxn], ans, ANS[maxn]; 7 struct node { 8 int l, r, id; 9 node() {} 10 node(int l, int r, int id): l(l), r(r), id(id) {} 11 bool operator <(const node & a)const { 12 if (l / sz == a.l / sz) return r < a.r; 13 return l < a.l; 14 } 15 } qu[maxn]; 16 void add(int x) { 17 if (sum[a[x]] == 0) ans++; 18 sum[a[x]]++; 19 } 20 void del(int x) { 21 sum[a[x]]--; 22 if (sum[a[x]] == 0) ans--; 23 } 24 int main() { 25 scanf("%d", &n); 26 for (int i = 1 ; i <= n ; i++) 27 scanf("%d", &a[i]); 28 scanf("%d", &m); 29 for (int i = 1 ; i <= m ; i++) { 30 scanf("%d%d", &qu[i].l, &qu[i].r); 31 qu[i].id = i; 32 } 33 sz = (int)sqrt(n); 34 sort(qu + 1, qu + m + 1); 35 L = 1, R = 0; 36 for (int i = 1 ; i <= m ; i++) { 37 while(L > qu[i].l) add(--L); 38 while(R < qu[i].r) add(++R); 39 while(L < qu[i].l) del(L++); 40 while(R > qu[i].r) del(R--); 41 ANS[qu[i].id] = ans; 42 } 43 for (int i = 1 ; i <= m ; i++) 44 printf("%d ", ANS[i]); 45 return 0; 46 }
以上是关于D-query SPOJ - DQUERY(莫队)统计不同数的数量的主要内容,如果未能解决你的问题,请参考以下文章