HDU 3333 - Turing Tree (树状数组+离线处理+哈希+贪心)
题意:给一个数组,每次查询输出区间内不重复数字的和。
这是3xian教主的题。
用前缀和的思想可以轻易求得区间的和,但是对于重复数字这点很难处理。在线很难下手,考虑离线处理。
将所有查询区间从右端点由小到大排序,遍历数组中的每个数字,每次将该数字上次出现位置的值在树状数组中改为0,再记录当前位置,在树状数组中修改为当前的数值。这样可以保证在接下来的查询中该数字只出现了一次。这是贪心的思想,只保留最可能被以后区间查询的位置。如果当前位置是某个查询区间的右端点,这时候就可以查询了。最后再根据查询区间的编号排序输出即可了。
注意树状数组查询0位置会出现死循环。
HDU上long long 需要使用I64d。
#include <iostream> #include <cstdio> #include <cstring> #include <vector> #include <map> #include <algorithm> #define ll long long #define MAXN 100005 using namespace std; int n; map<int,int> pos; struct Segment { int num,left,right; ll ans; Segment(,,):num(a),left(b),right(c) { ans=; } bool operator <(const Segment &p) const { return right<p.right; } }; bool cmp(Segment a,Segment b) { return a.num<b.num; } struct BIT { ll dat[MAXN]; int lowbit(int x) { return -x&x; } void clear() { memset(dat,,sizeof(dat)); } void add(int x,ll val) { while(x<=n) { dat[x]+=val; x+=lowbit(x); } } ll sum(int x) { ll s=; ) { s+=dat[x]; x-=lowbit(x); } return s; } void modify(int x,ll val) { ) return ; ll t=sum(x)-sum(x-); add(x,-t+val); } }; int arr[MAXN]; vector<Segment> vec; BIT tree; int main() { int T; scanf("%d",&T); while(T--) { scanf("%d",&n); pos.clear(); ; i<=n; ++i) scanf("%d",&arr[i]); int q; scanf("%d",&q); vec.clear(); ; i<=q; ++i) { int x,y; scanf("%d%d",&x,&y); vec.push_back(Segment (i,x,y)); } sort(vec.begin(),vec.end()); tree.clear(); ,j=; i<=n&&j<vec.size(); ++i) { tree.modify(pos[arr[i]],); tree.modify(i,arr[i]); pos[arr[i]]=i; while(j<vec.size()&&i==vec[j].right) { vec[j].ans=tree.sum(vec[j].right)-tree.sum(vec[j].left-); j++; } } sort(vec.begin(),vec.end(),cmp); ; i<vec.size(); ++i) printf("%I64d\n",vec[i].ans); } ; }
HDU 3333 - Turing Tree (树状数组+离线处理+哈希+贪心)的更多相关文章
- HDU 3333 Turing Tree --树状数组+离线处理
题意:统计一段序列[L,R]的和,重复元素只算一次. 解法:容易看出在线做很难处理重复的情况,干脆全部讲查询读进来,然后将查询根据右端点排个序,然后离散化数据以后就可以操作了. 每次读入一个数,如果这 ...
- HDU 3333 Turing Tree (树状数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3333 题意就是询问区间不同数字的和. 比较经典的树状数组应用. //#pragma comment(l ...
- HDU3333 Turing Tree 树状数组+离线处理
Turing Tree Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU 3333 | Codeforces 703D 树状数组、离散化
HDU 3333:http://acm.hdu.edu.cn/showproblem.php?pid=3333 这两个题是类似的,都是离线处理查询,对每次查询的区间的右端点进行排序.这里我们需要离散化 ...
- Necklace HDU - 3874 (线段树/树状数组 + 离线处理)
Necklace HDU - 3874 Mery has a beautiful necklace. The necklace is made up of N magic balls. Each b ...
- HDU 3874 Necklace (树状数组 | 线段树 的离线处理)
Necklace Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total S ...
- 2016 Multi-University Training Contest 5 1012 World is Exploding 树状数组+离线化
http://acm.hdu.edu.cn/showproblem.php?pid=5792 1012 World is Exploding 题意:选四个数,满足a<b and A[a]< ...
- SPOJ DQUERY树状数组离线or主席树
D-query Time Limit: 227MS Memory Limit: 1572864KB 64bit IO Format: %lld & %llu Submit Status ...
- D-query SPOJ 树状数组+离线
D-query SPOJ 树状数组+离线/莫队算法 题意 有一串正数,求一定区间中有多少个不同的数 解题思路--树状数组 说明一下,树状数组开始全部是零. 首先,我们存下所有需要查询的区间,然后根据右 ...
随机推荐
- Eclipse 配置Tomcat
1.Eclipse EE 配置Tomcat Eclipse EE 主要用于Java Web开发和J2EE项目开发.Eclipse EE中配置Tomcat比较简单,新建一个Tomcat Server即可 ...
- hdu 1072 Nightmare (bfs+优先队列)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1072 Description Ignatius had a nightmare last night. H ...
- python中的binascii
import binascii as B s = 'abcde' h = B.b2a_hex(s) # 字符串转16进制 '6162636465' h = B.hexlify(s) # 作用同上 s ...
- android 模拟器 使用键盘的配置
1 打开 android Manageer , 克隆一个设备 2.
- poj-------(2240)Arbitrage(最短路)
Arbitrage Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15640 Accepted: 6563 Descri ...
- iOS开发UIScrollView的底层实现
起始 做开发也有一段时间了,经历了第一次完成项目的激动,也经历了天天调用系统的API的枯燥,于是就有了探索底层实现的想法. 关于scrollView的思考 在iOS开发中我们会大量用到scrollVi ...
- Android MotionEvent事件响应机制
在android中,事件主要包括点击.长按.拖曳.滑动等操作,这些构成了Android的事件响应,总体来说,所有的事件都由如下三个部分作为基础构成: 按下(action_down),移动(action ...
- Objective-C:@class和#import
@class和#import是OC中引用一个类的两种方式,其区别在于: #import相当于把被引用文件的内容拷贝到目标文件,这会包含被引用类的所有信息,包括被引用类的变量和方法(会降低编译性能 ): ...
- 网页 console的使用
通过按下回车键会触发执行命令,而有时候我们需要执行的逻辑比较复杂,需要多行才可以完成,可以通过点击“shift+回车键”来实现换行. 在console中,可以实现对按钮的监控.比如此时按钮的文本值为“ ...
- [示例]NSEnumerator-使用枚举类型实现数组的逆序输出
代码: #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepo ...