解题思路:这道题和之前的题一样,查找[l,r]区间内不重复数字的和。可以利用离线算法,实际上离线算法为了解决在查找时出现的矛盾,因为每次询问的区间大小不同,如果单独处理的话可能会对之后的查询有影响,所以离线算法帮助我们把要查询的区间先按照右端点进行排序,因为在处理更靠右的区间时,比它小的区间肯定是已经得到的不重复的数了,所以不会影响到后面的查找。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;const int M = 200005;
const int N = 50005;
struct Query
{int l,r,id;bool operator < (Query a){return r < a.r;}
}q[M];
int n,m,size;
int tree[N<<1],arr[N],tmp[N],last[N],ans[M];int lowbit(int x)
{return x & -x;
}void update(int x,int d)
{for(int i = x; i <= n; i += lowbit(i))tree[i] += d;
}int getsum(int x)
{int sum = 0;for(int i = x; i > 0; i -= lowbit(i))sum += tree[i];return sum;
}int bisearch(int val)
{int l = 1, r = size, mid;while(l <= r){mid = (l + r) >> 1;if(tmp[mid] == val) return mid;else if(tmp[mid] > val)r = mid - 1;else l = mid + 1;}
}int main()
{int t;cin >> t;while(t--){cin >> n;for(int i = 1; i <= n; i++){cin >> arr[i];tmp[i] = arr[i];}cin >> m;for(int i = 1; i <= m; i++){cin >> q[i].l >> q[i].r;q[i].id = i;}sort(tmp+1,tmp+1+n);sort(q+1,q+1+m);//离散化size = 1;for(int i = 2; i <= n; i++)if(tmp[i] != tmp[i-1])tmp[++size] = tmp[i];memset(tree,0,sizeof(tree));memset(last,0,sizeof(last));int idx = 1;for(int i = 1; i <= n; i++){int x = bisearch(arr[i]);if(last[x])update(last[x],-arr[i]);update(i,arr[i]);last[x] = i;while(q[idx].r == i && idx <= m){ans[q[idx].id] = getsum(q[idx].r) - getsum(q[idx].l - 1);idx++;}}for(int i = 1; i <= m; i++)cout << ans[i] << endl;}return 0;
}

hdu 3874(树状数组+离线算法)相关推荐

  1. hdu 4417(树状数组+离线算法)

    解题思路:这道题要求某区间内比h小的个数,其实这里可以类似于树状数组求逆序数那样.关键是如何转换成树状数组的模型,这才是本题的难点. 我们首先分析,如果知道h在该区间的哪个位置,那么剩下的就很好做了. ...

  2. hdu 3333 树状数组+离线处理

    思路:既然要求的是不同的元素的和,那么我们可以想办法让每个值在区间中只出现一次,于是想到了离线的算法:将查询按照右端点排序,位置在右端点之前的元素都插入到树状数组中,对于已经出现过的值,我们要先删除( ...

  3. HDU 4358 树状数组+思路

    http://acm.hdu.edu.cn/showproblem.php?pid=4358 如图所示,当k==3时,如果我们扫描到红线所在的位置. 则符合条件的区间就是从红线到两条紫线所包含的区间( ...

  4. hdu 4991(树状数组优化dp)

    Ordered Subsequence Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  5. Sereja and Brackets CodeForces - 380C (树状数组+离线)

    Sereja and Brackets 题目链接: CodeForces - 380C Sereja has a bracket sequence s1, s2, ..., *s**n, or, in ...

  6. Weak Pair HDU - 5877 树状数组+离散化+DFS遍历

    题意 给我们一颗有根有向树 以及每个点得权值a[1]~a[n] 需要我们求出在这颗树种有多少对满足以下两个条件的pair (1)u是v的祖先节点 (2)a[u]*a[v]<= k N<=1 ...

  7. hdu 1166 树状数组解

    树状数组解决   (关于树状数组参考大佬的博客https://www.cnblogs.com/hsd-/p/6139376.html) 然后就很好理解这题了,代码附上 /*hdu 1166 单点修改, ...

  8. SPOJ D-query 树状数组离线 求区间内不同数字的个数

    Given a sequence of n numbers a1, a2, -, an and a number of d-queries. A d-query is a pair (i, j) (1 ...

  9. 2019 南京 网络赛 B (二维偏序,树状数组离线)

    题意: 给出一N*N的蛇形矩阵,具体位置元素值不给你,自己找规律,然后给你M个 有效位置,P次查询,每次查询一个子矩阵中有效元素的权值和,该权值和等于对于 每个有效元素,模10拆分后相加得到的和.(注 ...

最新文章

  1. ubuntu10.10---用Apache+mod_wsgi部署python程序
  2. SAP HANA是什么
  3. 使用 trait 时报PHP Parse error: syntax error, unexpected 'use' (T_USE) 这个错误
  4. 【编程开发】Python隐藏属性——使用双下划线标识私有属性,外部不可直接访问...
  5. 1010 Radix (25 分)【难度: 难 / 知识点: 二分查找】
  6. 天池 在线编程 输入流
  7. 信息学奥赛一本通(1022:整型与布尔型的转换)
  8. RHEL5简单的引导故障解决
  9. 如何在一个元素上有多个CSS过渡?
  10. 软件测试web和app,软件测试如何快速进阶?过来人科普Web与App测试5大区别!
  11. sphinx mysql实时搜素_【原创】sphinx实时索引的配置及实际应用、实例
  12. 2022-2028年中国旅游演艺行业市场现状分析及发展前景展望报告
  13. gggggggggggggggggdsfdsf
  14. mysql中 创建函数失败_Mysql创建函数出错
  15. 【机器学习】初学理论知识
  16. 嵌入式 LINUX 应用开发
  17. 状态代码255 必须重启服务器,kubelet服务启动失败,错误代码255
  18. JS: 火星坐标gcj02、百度坐标bd09II、WGS84坐标相互转换及墨卡托转经纬度百度墨卡托bd09mc
  19. C# 六种方案打印PDF文档
  20. php用什么服务器系统时间格式,php中时间戳和日期格式的转换

热门文章

  1. 直播预告丨如何用 A/B 测试做好一场页面布局试验?
  2. 「神策 2020 数据驱动用户大会」开幕在即,10 月 13-14 日,八城联动·北京场,带你一起见证数据的力量!
  3. Java高级架构之FastDFS分布式文件集群
  4. 在大数据里:Hadoop可能是你的救命稻草
  5. 破解前端面试系列(3):如何搞定纸上代码环节?
  6. SCI论文写作中的注意事项
  7. linux下安装php的swoole扩展模块(安装后php加载不出来?)
  8. 【Minimum Depth of Binary Tree】cpp
  9. Ctrl+Alt组合键在VMware虚拟机中如何使用
  10. Linux下SSH使用rsa认证方式省去输入密码