SPOJ-DQUERY-主席树求区间不同数个数模板
2015-08-06 22:44
489 查看
A - D-query
Time Limit:227MS Memory Limit:1572864KB 64bit IO Format:%lld
& %llu
SubmitStatusPracticeSPOJ
DQUERY
Appoint description:
Description
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.
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).
题目大意:求一个区间有多少数不相同。
思路;主席树用第i棵线段树表示右区间r因为第r棵线段树总共才插入1到r个数,然后l到r的区间不同数的个数就是第r棵线段树l到r的数的总和。
Time Limit:227MS Memory Limit:1572864KB 64bit IO Format:%lld
& %llu
SubmitStatusPracticeSPOJ
DQUERY
Appoint description:
Description
English | Vietnamese |
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
题目大意:求一个区间有多少数不相同。
思路;主席树用第i棵线段树表示右区间r因为第r棵线段树总共才插入1到r个数,然后l到r的区间不同数的个数就是第r棵线段树l到r的数的总和。
#include <cstdio> #include <cstring> #include <cmath> #include <queue> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std; const int maxn = 100005; int lson[maxn*30],rson[maxn*30],c[maxn*30],T[maxn]; int a[maxn],b[maxn],len,tot,vis[maxn],n; void hase(int k) { sort(b,b+k); len = unique(b,b+k) - b; } int get_hase(int k) { return (lower_bound(b,b+len,k) - b); } int build(int l,int r) { int root = tot++; c[root] = 0; if(l != r) { int mid = (l +r) >> 1; lson[root] = build(l,mid); rson[root] = build(mid + 1,r); } return root; } int insert1(int root,int pos,int val) { int newroot = tot++; int tmp = newroot; c[newroot] = c[root] + val; int l = 1, r = n; while(l < r) { int mid = (l + r) >> 1; if(pos <= mid) { lson[newroot] = tot++; rson[newroot] = rson[root]; newroot = lson[newroot]; root = lson[root]; r = mid; } else { lson[newroot] = lson[root]; rson[newroot] = tot++; newroot = rson[newroot]; root = rson[root]; l = mid +1; } c[newroot] = c[root] + val; } return tmp; } int A,B; int qurry(int root,int l, int r) { if(A<= l && r <= B) { return c[root]; } int mid = (l + r) >> 1; int ans = 0; if(A <= mid) ans += qurry(lson[root],l,mid); if(B > mid) ans += qurry(rson[root],mid + 1, r); return ans; } int main() { while(scanf("%d",&n) != EOF) { len = tot = 0; memset(vis,-1,sizeof(vis)); int i; for(i = 1; i <= n; i++) { scanf("%d",&a[i]); b[len++] = a[i]; } hase(len); T[0] = build(1,n); for(i = 1;i <= n; i++) { int tmp = T[i-1]; int vv = get_hase(a[i]); if(vis[vv] != -1) { tmp = insert1(T[i-1],vis[vv],-1); } T[i] = insert1(tmp,i,1); vis[vv] = i; } int m; scanf("%d",&m); while(m--) { int q,w; scanf("%d %d",&A,&w); B = n; printf("%d\n",qurry(T[w],1,n)); } } return 0; }
相关文章推荐
- “Error setting expression 'id' with value '[Ljava.lang.String;@e41d4a'”解决办法!
- hdoj 1242 Rescue [BFS]
- ui->setup(this); shortcut can't show
- iOS学习--UIScrollView 原理详解
- UE4信息交互-GetAllActorsOfClass遍历搜索
- 简约至上——交互设计四策略笔记
- 01-复杂度2. Maximum Subsequence Sum (25)
- HDU - 1711 Number Sequence KMP字符串匹配
- iOS 动画总结----UIView动画
- (素材源码)swanzhu学IOS(二)UI之_NSTimer
- 1242 Rescue【bfs】
- 1041. Be Unique (20)
- hdoj 1242 Rescue
- UE4 符号调试器
- [IOS]今天开始学UI---UIProgressView
- Round #311-Equivalent Strings**
- UE4 iOS游戏开发
- poj 1458 Common Subsequence(最大公共子序列)
- UE4 移动平台游戏开发
- UE4 iOS设备的兼容性