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 ...
随机推荐
- Linux命令(1) - 查看内存使用情况: free -hm
使用"free -hm"命令查看linux服务器的内存使用状况,其中-h表示人性化显示,-m表示将内存显示为M:
- Open-falon监控安装过程
Open-falon监控安装过程 具体参考: http://book.open-falcon.org/zh/quick_install/prepare.html 1. 安装ntp.vim编辑器 ...
- C# 给软件加注册码功能
为自己写的程序加一个注册功能吧.生成的机器号是根据CPU和硬盘号来的,根据自己的需求改成是否是随机生成. 代码直接粘贴到新建类覆盖原代码就能直接用了. using System; using Syst ...
- canvas调节视频颜色
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 自己动手做jQuery插件
前言:这种东西随意可以在网上收到,这里我还是只是记下自己的见解和领. 第一种方式 (function ($) { $.extend({ sayHello: function (name) { aler ...
- Tiny语法分析器(递归下降分析法实现)
递归规约规则是这样的 program→stmt-sequence stmt-sequence→stmt-sequence;statement|statement statement→if-stmt|r ...
- Spring注释与简化配置
在Spring 2.5及以后的版本中,提供了注释和命名空间来简化Spring的配置.下面是一些常用配置分享. 1.@Autowired注释 以前给一个Bean配置属性时,Bean必须配置< ...
- 三级菜单---zhufeng
<!doctype html><html><head><meta charset="utf-8"><title>无标题文 ...
- ios基础篇(十)——UINavgationController的使用(一)UIBarButtonItem的添加
UINavigationController又被成为导航控制器,继承自UIViewController,以栈的方式管理所控制的视图控制器,下面就详细说一下UINavigationController的 ...
- [转]Visual Studio 2010 单元测试目录
Visual Studio 2010 单元测试共分七个部分: 普通单元测试.顺序单元测试.压力测试,Generic测试.数据库测试.UI界面测试和Web性能测试. 这个系列的博客实例程序可以在下面的链 ...