SPOJ3267--D-query (树状数组离线操作)
2014-11-20 13:39
302 查看
题意查询区间 [l,r]内有多少个不同的数字
先把所有询问按 右端点进行排序,然后离线操作。如果该位置的数字 已经出现过那么把前一个位置-1,当前位置+1。扫一遍输出。
此题主席树也可以做。
先把所有询问按 右端点进行排序,然后离线操作。如果该位置的数字 已经出现过那么把前一个位置-1,当前位置+1。扫一遍输出。
#include <cstdio> #include <string> #include <vector> #include <cstdlib> #include <cstring> #include <algorithm> using namespace std; const int maxq = 2e5+10; const int maxn = 3e4+10; int last[1000050]; int n,m,c[maxn],ans[200005]; struct Node { int l,r,ans,idx; bool operator < (const Node &rhs)const { return r < rhs.r || (r == rhs.r && l < rhs.l); } }Q[maxq]; int lowbit(int x) { return x & -x; } void add(int x,int d) { while (x <= maxn) { c[x] += d; x += lowbit(x); } } int sum(int x) { int ans = 0; while (x) { ans += c[x]; x -= lowbit(x); } return ans; } int a[maxq]; int main(void) { #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif while (~scanf ("%d",&n)) { memset(c,0,sizeof(c)); memset(last,-1,sizeof(last)); for (int i = 2; i <= n+1; i++) scanf ("%d",a+i); scanf ("%d",&m); for (int i = 0; i < m; i++) { Q[i].idx = i; scanf ("%d%d",&Q[i].l,&Q[i].r); Q[i].l++,Q[i].r++; } sort(Q,Q+m); int pre = 2; for (int i = 0; i < m; i++) { for(int j = pre; j <= Q[i].r; j++) { if (~last[a[j]]) { add(last[a[j]],-1); add(j,1); } else { add(j,1); } last[a[j]] = j; } ans[Q[i].idx] = sum(Q[i].r) - sum(Q[i].l - 1); pre = Q[i].r+1; } for (int i = 0; i < m; i++) printf("%d\n",ans[i]); } return 0; }
此题主席树也可以做。
相关文章推荐
- SPOJ3267 D-query 离线+树状数组 在线主席树
- SPOJ 3267(DQUERY) D-query 【主席树】【离线树状数组】
- SPOJ3267 D-Query 树状数组离线操作 或 主席树 查询某一区间内有多少不同的数
- SPOJ DQUERY(树状数组离线处理 or 主席树 区间不同数个数)
- SPOJ 3267: DQUERY 树状数组,离线算法
- spoj D-query 区间不同数个数 主席树||离线+树状数组
- SPOJ D-query 区间不同数的个数 [在线主席树 or 离线树状数组]
- [SPOJ DQUERY] D-query(树状数组,离线)
- hdu 3333 Turing Tree(树状数组离线操作)
- crf 的数数 (树状数组 离线操作)
- hdu 3333(树状数组 + 离线操作)
- [区间GCD预处理 树状数组 离线] HDU 5869 Different GCD Subarray Query
- D-query SPOJ - DQUERY (树状数组离线预处理||主席树)
- HDU 3874 Necklace(树状数组的离线操作)
- hdu-5869 Different GCD Subarray Query gcd预处理 + 树状数组 + 离线
- ZOJ 4008 Yet Another Tree Query Problem 树状数组 离线处理
- bzoj 1878 SDOI2009树状数组 离线操作
- SPOJ DQUERY (离线数状数组||在线主席树)
- HDU 4358 Boring counting(树状数组离线操作+欧拉序列)
- HDU 3874 Necklace(树状数组的离线操作)