题目大意:

询问区间内不同种类的数的数值之和

这里逐个添加最后在线查询,会因为相同的数在区间内导致冲突

我们总是希望之后添加的数不会影响前面,那么我们就在添加到第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 树状数组离线查询的更多相关文章

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

    http://acm.hdu.edu.cn/showproblem.php?pid=3333 不错的题,想了非常久不知道怎么处理,并且答案没看懂,然后找个样例模拟下别人的代码立即懂了---以后看不懂的 ...

  2. HDU 4630 No Pain No Game 树状数组+离线查询

    思路参考 这里. #include <cstdio> #include <cstring> #include <cstdlib> #include <algo ...

  3. hdu 3333(树状数组 + 离线操作)

    Turing Tree Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  4. hdu 1556 树状数组+点查询

    树状数组 N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一 ...

  5. bzoj 2743 树状数组离线查询

    我们按照询问的右端点排序,然后对于每一个位置,记录同颜色 上一个出现的位置,每次将上上位置出现的+1,上次出现的-1,然后 用树状数组维护就好了 /************************** ...

  6. 【树状数组+离线查询】HDU 3333 Turing Tree

    https://www.bnuoj.com/v3/contest_show.php?cid=9149#problem/H [题意] 给定一个数组,查询任意区间内不同数字之和. (n<=30000 ...

  7. Turing Tree HDU - 3333 (树状数组,离线求区间元素种类数)

    After inventing Turing Tree, 3xian always felt boring when solving problems about intervals, because ...

  8. hdu 3333 树状数组

    思路:定义一个map容器用来记录数ai上次出现的位置.将查询区间按右边界升序进行排序,当插入第i个数ai时,pre[ai]+1---->i的区间就会多一个不同的数,其值就是ai,那么可以用upd ...

  9. SPOJ DQUERY树状数组离线or主席树

    D-query Time Limit: 227MS   Memory Limit: 1572864KB   64bit IO Format: %lld & %llu Submit Status ...

随机推荐

  1. Linux命令(1) - 查看内存使用情况: free -hm

    使用"free -hm"命令查看linux服务器的内存使用状况,其中-h表示人性化显示,-m表示将内存显示为M:

  2. Open-falon监控安装过程

    Open-falon监控安装过程   具体参考:   http://book.open-falcon.org/zh/quick_install/prepare.html 1. 安装ntp.vim编辑器 ...

  3. C# 给软件加注册码功能

    为自己写的程序加一个注册功能吧.生成的机器号是根据CPU和硬盘号来的,根据自己的需求改成是否是随机生成. 代码直接粘贴到新建类覆盖原代码就能直接用了. using System; using Syst ...

  4. canvas调节视频颜色

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 自己动手做jQuery插件

    前言:这种东西随意可以在网上收到,这里我还是只是记下自己的见解和领. 第一种方式 (function ($) { $.extend({ sayHello: function (name) { aler ...

  6. Tiny语法分析器(递归下降分析法实现)

    递归规约规则是这样的 program→stmt-sequence stmt-sequence→stmt-sequence;statement|statement statement→if-stmt|r ...

  7. Spring注释与简化配置

      在Spring 2.5及以后的版本中,提供了注释和命名空间来简化Spring的配置.下面是一些常用配置分享. 1.@Autowired注释   以前给一个Bean配置属性时,Bean必须配置< ...

  8. 三级菜单---zhufeng

    <!doctype html><html><head><meta charset="utf-8"><title>无标题文 ...

  9. ios基础篇(十)——UINavgationController的使用(一)UIBarButtonItem的添加

    UINavigationController又被成为导航控制器,继承自UIViewController,以栈的方式管理所控制的视图控制器,下面就详细说一下UINavigationController的 ...

  10. [转]Visual Studio 2010 单元测试目录

    Visual Studio 2010 单元测试共分七个部分: 普通单元测试.顺序单元测试.压力测试,Generic测试.数据库测试.UI界面测试和Web性能测试. 这个系列的博客实例程序可以在下面的链 ...