HDU 3333 树状数组离线查询
题目大意:
询问区间内不同种类的数的数值之和
这里逐个添加最后在线查询,会因为相同的数在区间内导致冲突
我们总是希望之后添加的数不会影响前面,那么我们就在添加到第i个数的时候,把所有在1~i 的区间的询问全部处理完成即可
对于之前的冲突,我们可以不断记录上一次冲突的位置,给当前的前缀和添加一个当前的val
对于上一次之前的前缀和要减去那个val就不会产生冲突了(之所以离线也是因为这个地方,如果后面的数添加完成,那么之前可能减去那个位置的数就导致区间查询出错)
所以将询问区间优先右排序就行了
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <map>
using namespace std; #define LL long long
#define lowbit(x) x&(-x)
#define M 100010
#define N 30005
char s[];
int n , m , a[N];
LL sum[N] ;
map<int ,int> mp; struct Query{
int l , r , id;
bool operator<(const Query &m) const{
return r<m.r || (r==m.r&&l<m.l);
}
}qu[M]; LL rec[M]; void add(int x , int v)
{
while(x<=n){
sum[x] = sum[x]+v ;
x+=lowbit(x);
}
} LL query(int x){
LL ret = ;
while(x>) ret = ret+sum[x] , x-=lowbit(x);
return ret;
} int main()
{
//freopen("in.txt" , "r" , stdin);
int T ;
scanf("%d" , &T);
while(T--){
scanf("%d" , &n);
memset(sum , , sizeof(sum));
for(int i= ; i<=n ; i++)
scanf("%d" , &a[i]); scanf("%d" , &m);
for(int i= ; i<m ; i++){
int l , r;
scanf("%d%d" , &l , &r);
qu[i] = (Query){l , r , i};
}
sort(qu , qu+m);
int cur = ;
mp.clear();
for(int i= ; i<=n ; i++){
if(mp.find(a[i]) == mp.end()){
add(i , a[i]);
mp.insert(make_pair(a[i] , i));
}else{
add(i , a[i]);
add(mp[a[i]] , -a[i]);
mp[a[i]] = i;
}
while(qu[cur].r == i){
rec[qu[cur].id] = query(qu[cur].r)-query(qu[cur].l-);
cur++;
}
}
for(int i= ; i<m ; i++) printf("%I64d\n" , rec[i]);
}
return ;
}
HDU 3333 树状数组离线查询的更多相关文章
- hdu 3333 树状数组+离线处理
http://acm.hdu.edu.cn/showproblem.php?pid=3333 不错的题,想了非常久不知道怎么处理,并且答案没看懂,然后找个样例模拟下别人的代码立即懂了---以后看不懂的 ...
- HDU 4630 No Pain No Game 树状数组+离线查询
思路参考 这里. #include <cstdio> #include <cstring> #include <cstdlib> #include <algo ...
- hdu 3333(树状数组 + 离线操作)
Turing Tree Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- hdu 1556 树状数组+点查询
树状数组 N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一 ...
- bzoj 2743 树状数组离线查询
我们按照询问的右端点排序,然后对于每一个位置,记录同颜色 上一个出现的位置,每次将上上位置出现的+1,上次出现的-1,然后 用树状数组维护就好了 /************************** ...
- 【树状数组+离线查询】HDU 3333 Turing Tree
https://www.bnuoj.com/v3/contest_show.php?cid=9149#problem/H [题意] 给定一个数组,查询任意区间内不同数字之和. (n<=30000 ...
- Turing Tree HDU - 3333 (树状数组,离线求区间元素种类数)
After inventing Turing Tree, 3xian always felt boring when solving problems about intervals, because ...
- hdu 3333 树状数组
思路:定义一个map容器用来记录数ai上次出现的位置.将查询区间按右边界升序进行排序,当插入第i个数ai时,pre[ai]+1---->i的区间就会多一个不同的数,其值就是ai,那么可以用upd ...
- SPOJ DQUERY树状数组离线or主席树
D-query Time Limit: 227MS Memory Limit: 1572864KB 64bit IO Format: %lld & %llu Submit Status ...
随机推荐
- Android 设置进度条背景
Android 设置进度条背景 直接上代码 <ProgressBar android:id="@+id/progressBar" android:layout_width=& ...
- ajax跨域jsonp
<!DOCTYPE html><html lang="zh-CN"><head> <meta charset="UTF-8&qu ...
- [css]【转载】CSS样式分离之再分离
原文链接:http://www.zhangxinxu.com/wordpress/2010/07/css%E6%A0%B7%E5%BC%8F%E5%88%86%E7%A6%BB%E4%B9%8B%E5 ...
- java 文件操作
1.按行读取 File file = new File(“your path”); BufferedReader reader = null; try { //System.out.println(& ...
- PostgreSQL 8.1 中文文档(转)
PostgreSQL 8.1 中文文档(转) http://www.php100.com/manual/PostgreSQL8/ 或者点击下面链接 PostgreSQL 8.1 中文文档
- C#_List转换成DataTable
/// <summary> /// 讲list集合转换成datatable /// </summary> /// <param name="list" ...
- Python设计模式之单例模式
1.由于语言的特性不同,设计模式的实现方式和实现难度也会不同 2.有的模式已经在语言内置了,比如迭代器模式. 3.单例模式可以直接用模块级变量来实现 4.普通工厂模式可以直接通过传入"类名& ...
- DRUPAL点滴
1 admin/config/user-interface/xxx在hook_menu里定义这样一个path,就会在configuration界面看到xxx的链接 2 $news_items = db ...
- COM组件(ATL篇)
目录 第1章创建进程内组件 1 1.1 目标 1 1.2 创建项目 3 1.2.1 VC++6.0 3 1.2.2 VC++2010 5 1.3 增加COM类 6 ...
- 求质数算法的N种境界[1] - 试除法和初级筛法
★引子 前天,俺在<俺的招聘经验[4]:通过笔试答题能看出啥?>一文,以"求质数"作为例子,介绍了一些考察应聘者的经验.由于本文没有政治敏感内容,顺便就转贴到俺在CSD ...