SPOJ - DQUERY 主席树求区间中不同数字的个数
2016-11-04 18:34
543 查看
传送门:SPOJ - DQUERY
题目大意
给定一个序列,求然后有q次查询求[L,R]区间中不同数字的个数解题思路
主席树模版类型题目,离散化,更新查询AC代码
#include <cstdio> #include <iostream> #include <map> using namespace std; const int MX = 1e5+5; const int N = MX*20; int n,q,tot; int A[MX]; int T ,lson ,rson ,sum ; int build(int l,int r) { int rt = tot++; sum[rt] = 0; int mid = (l+r)>>1; if(l!=r) { lson[rt] = build(l,mid); rson[rt] = build(mid+1,r); } return rt; } int update(int rt,int pos,int val) { int nrt = tot++; int tmp = nrt; int l=1,r=n; sum[nrt] = sum[rt] + val; while(l<r) { int mid = (l+r)>>1; if(pos<=mid) { lson[nrt] = tot++; rson[nrt] = rson[rt]; nrt = lson[nrt]; rt = lson[rt]; r = mid; } else { rson[nrt] = tot++; lson[nrt] = lson[rt]; nrt = rson[nrt]; rt = rson[rt]; l = mid+1; } sum[nrt] = sum[rt]+val; } return tmp; } int query(int rt,int pos) { int l= 1,r = n,ret = 0; while(pos>l) { int mid = (l+r)>>1; if(pos>mid) { l = mid+1; rt= rson[rt]; } else{ r = mid; ret += sum[rson[rt]]; rt = lson[rt]; } } return ret+sum[rt]; } int main() {freopen("in.txt","r",stdin); scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&A[i]); T[0] = build(1,n); map<int,int>mp; for(int i=1;i<=n;i++) { if(mp.find(A[i])==mp.end()) T[i] = update(T[i-1],i,1); else { int tmp = update(T[i-1],mp[A[i]],-1); T[i] = update(tmp,i,1); } mp[A[i]] = i; } scanf("%d",&q); while(q--) { int l,r; scanf("%d%d",&l,&r); printf("%d\n",query(T[r],l)); } return 0; }
相关文章推荐
- SPOJ3267 D-Query 树状数组离线操作 或 主席树 查询某一区间内有多少不同的数
- SPOJ-DQUERY - D-query (主席树 区间不同数个数)
- SPOJ DQUERY 区间内不同数的个数 主席树
- SPOJ DQUERY (主席树求区间不同数个数)
- SPOJ D-query 区间不同数的个数 [在线主席树 or 离线树状数组]
- SPOJ DQUERY - D-query(主席树 ,求区间不同的数个数)
- [spoj D-query] 主席树求区间不同数
- SPOJ D-query 主席树在线(求区间不同的数的个数)
- spoj DQUERY - D-query(区间不同数的个数 主席树 or BIT)
- SPOJ-DQUERY-主席树求区间不同数个数模板
- SPOJ DQUERY D-query(离线线段树,查区间不同数字个数)
- SPOJ - DQUERY 主席树求区间有多少个不同的数(模板)
- SPOJ DQUERY - D-query(主席树-区间不同数的个数)
- SPOJ DQUERY 求区间内不同数的个数 (主席树)
- spoj D-query 区间不同数个数 主席树||离线+树状数组
- SPOJ DQUERY 求区间内不同数的个数 主席树
- 【SPOJ 】 DQUERY 【莫队 - 区间几个不同数字】
- SPOJ DQUERY(树状数组离线处理 or 主席树 区间不同数个数)
- SPOJ:D-query(非常规主席树求区间不同数的个数)
- SPOJ D-query(区间不同的数的个数)