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 ...
随机推荐
- go循环
Go语言里的For循环语句 更多 0 golang package main import "fmt" func main() { sum := 0 for i := 0; i ...
- JavaScript设计模式-单例模式、模块模式(转载 学习中。。。。)
(转载地址:http://technicolor.iteye.com/blog/1409656) 之前在<JavaScript小特性-面向对象>里面介绍过JavaScript面向对象的特性 ...
- C++模板(基础)
本文转至:http://www.cnblogs.com/gw811/archive/2012/10/25/2738929.html C++模板 模板是C++支持参数化多态的工具,使用模板可以使用户为类 ...
- Mybatis3+Spring4+SpringMVC4 整合
首先在整合这个框架的时候,想想其一般的步骤是怎样的,先有个步骤之后,不至于在后面的搞混了,这样在整合的时候也比较清晰些. 然后我们就细细的一步一步来整合. 1 创建一个Web项目. 2 导入Myb ...
- 在linux上使用"scp"命令拷贝一个目录到另一台服务器的时候报"not a regular file"错误的解决办法
今天在linux命令行使用scp命令拷贝一个目录到另一台服务器的时候,报如下错误: [root@hadoop01 ~]# scp flume -r hadoop02:/root/apps flume: ...
- The Daligner Overlap Library
/************************************************************************************\ * * * Copyrig ...
- java,UDP协议简单实现
//UDP协议简单实现-----Serverpackage UDP; import java.net.DatagramPacket; import java.net.DatagramSocket; i ...
- linux 下 `dirname $0`
[`],学名叫“倒引号”, 如果被“倒引号”括起来, 表示里面需要执行的是命令.比如 `dirname $0`, 就表示需要执行 dirname $0 这个命令 [“”] , 被双引号括起来 ...
- aspcms网站访问出现3706错误, 错误描述:未找到提供程序。该程序可能未正确安装,解决的方法。
- 谈谈JPA-04-JPA的常用API
JPA相关接口/类: Persistence Persistence 类是用于获取 EntityManagerFactory 实例.该类包含一个名为 createEntityManagerFacto ...