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 树状数组+离线/莫队算法 题意 有一串正数,求一定区间中有多少个不同的数 解题思路--树状数组 说明一下,树状数组开始全部是零. 首先,我们存下所有需要查询的区间,然后根据右 ...
随机推荐
- 笔记 《Effective Objective-C 2.0:编写高质量iOS与OS X代码的52个有效方法 》
阅读此书的笔记点: 此书目录即是对知识点最好的总结 第1章 熟悉Objective-C ---------------------------------------------- 第1条:了解Obj ...
- 谈谈HttpUrlConnection与DefaultHttpClient一些区别
HttpClient封装的很庞大,很复杂,你必须按照,他封装的思想去使用它,导致它很不灵活. 相比之下,HttpUrlConnection很轻巧,很方便,很灵活. HttpClient对于数据上面的封 ...
- 浅谈AsyncState与AsyncDelegate使用的异同
对于AsyncState来说,其MSDN的解释为:得到BeginInvoke方法的最后一个参数.而对于AsyncDelegate来说,其MSDN的解释为:得到异步调用的委托对象.也就是异步调用的委托源 ...
- $.get的重写
window.meng = window.meng || {}; (function () { function Get() { this.def = $.Deferred(); } Get.prot ...
- 5.4.1 Selenium2启动空浏览器
在Web自动化测试中,必须考虑不同浏览器对网站的兼容性测试,所以我们首先介绍如何用webDriver代码打开不同的浏览器. 本节介绍的是在Selenium2启动浏览器时,启动一个干净的没有任务插件及c ...
- Unique Paths II [LeetCode]
Follow up for "Unique Paths": Now consider if some obstacles are added to the grids. How m ...
- LOOPS(HDU 3853)
LOOPS Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 125536/65536 K (Java/Others)Total Sub ...
- / etc / init.d / iptables: line 268: restorecon: command not found
When I tried to restart iptables from vps , I got the following error. Iptables encountered such a p ...
- InitializeComponent System.StackOverflowException
因为一直重复调用了InitializeComponent,WPF报System.StackOverflowException错误,提示死循环似的调用.经过一阵排查得出下面结论: 避免在隐藏代码中使用O ...
- 在 Ubuntu 14.04/15.04 上配置 Node JS v4.0.0
大家好,Node.JS 4.0 发布了,这个流行的服务器端 JS 平台合并了 Node.js 和 io.js 的代码,4.0 版就是这两个项目结合的产物——现在合并为一个代码库.这次最主要的变化是 N ...