【树状数组+离线查询】HDU 3333 Turing Tree
https://www.bnuoj.com/v3/contest_show.php?cid=9149#problem/H
【题意】
给定一个数组,查询任意区间内不同数字之和。
(n<=30000,Q<=100000,每个数字<=1 000 000 000)
【思路】
要算任意区间内不同数字之和,如果我们从左到右依次处理,每次只保留最右边出现的数字,处理以当前数字为右端点的查询,就能做到“不同数字之和”,即不重不漏。因此我们要离线处理查询,按记录每个数作为右端点的所有查询区间。这里要用到vector记录固定右端点后每个所有查询区间的左端点和查询ID,要用map或unorderd_map记录每个数之前出现的位置(要把那个位置的删掉)
【Accepted】
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#include<unordered_map>
using namespace std;
const int maxn=1e5+;
typedef long long ll;
int n,m;
vector<pair<int,int> > p[maxn];
map<ll,int> pre; ll tree[maxn];
ll a[maxn];
ll ans[maxn];
void init()
{
memset(ans,,sizeof(ans));
for(int i=;i<=n;i++)
{
tree[i]=0LL;
}
pre.clear();
}
int lowbit(int x)
{
return x&(-x);
}
void add(int k,ll x)
{
while(k<=n)
{
tree[k]+=x;
k+=lowbit(k);
}
} ll query(int k)
{
ll res=0LL;
while(k)
{
res+=tree[k];
k-=lowbit(k);
}
return res;
}
ll query(int l,int r)
{
return query(r)-query(l-);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
init();
for(int i=;i<=n;i++)
{
cin>>a[i];
p[i].clear();
}
scanf("%d",&m);
int u,v;
for(int i=;i<=m;i++)
{
scanf("%d%d",&u,&v);
p[v].push_back(make_pair(u,i));
}
for(int i=;i<=n;i++)
{
if(pre.count(a[i]))
{
add(pre[a[i]],-a[i]);
}
pre[a[i]]=i;
add(i,a[i]);
int sz=p[i].size();
for(int k=;k<sz;k++)
{
ans[p[i][k].second]=query(p[i][k].first,i);
}
}
for(int i=;i<=m;i++)
{
cout<<ans[i]<<endl;
}
}
return ;
}
【树状数组+离线查询】HDU 3333 Turing Tree的更多相关文章
- HDU 4630 No Pain No Game 树状数组+离线查询
思路参考 这里. #include <cstdio> #include <cstring> #include <cstdlib> #include <algo ...
- bzoj 2743 树状数组离线查询
我们按照询问的右端点排序,然后对于每一个位置,记录同颜色 上一个出现的位置,每次将上上位置出现的+1,上次出现的-1,然后 用树状数组维护就好了 /************************** ...
- HDU 3333 树状数组离线查询
题目大意: 询问区间内不同种类的数的数值之和 这里逐个添加最后在线查询,会因为相同的数在区间内导致冲突 我们总是希望之后添加的数不会影响前面,那么我们就在添加到第i个数的时候,把所有在1~i 的区间的 ...
- SPOJ DQUERY树状数组离线or主席树
D-query Time Limit: 227MS Memory Limit: 1572864KB 64bit IO Format: %lld & %llu Submit Status ...
- Necklace HDU - 3874 (线段树/树状数组 + 离线处理)
Necklace HDU - 3874 Mery has a beautiful necklace. The necklace is made up of N magic balls. Each b ...
- 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]< ...
- D-query SPOJ 树状数组+离线
D-query SPOJ 树状数组+离线/莫队算法 题意 有一串正数,求一定区间中有多少个不同的数 解题思路--树状数组 说明一下,树状数组开始全部是零. 首先,我们存下所有需要查询的区间,然后根据右 ...
- HDU 3333 - Turing Tree (树状数组+离线处理+哈希+贪心)
题意:给一个数组,每次查询输出区间内不重复数字的和. 这是3xian教主的题. 用前缀和的思想可以轻易求得区间的和,但是对于重复数字这点很难处理.在线很难下手,考虑离线处理. 将所有查询区间从右端点由 ...
- HDU 3333 Turing Tree 离线 线段树/树状数组 区间求和单点修改
题意: 给一个数列,一些询问,问你$[l,r]$之间不同的数字之和 题解: 11年多校的题,现在属于"人尽皆知傻逼题" 核心思想在于: 对于一个询问$[x,R]$ 无论$x$是什么 ...
随机推荐
- Java中的流(2)字节流-InputStream和OutputStream
字节流的两个顶层类是抽象类:InputStream和OutputStream 1. OutputStream void write(int b) 往流中写一个字节b void write(byte b ...
- jsp声明周期
https://www.w3cschool.cn/jsp/jsp-life-cycle.html 几点注意: jsp初始化期: 容器载入jsp文件后,它会在为请求提供任何服务前调用jspinit()方 ...
- 179 Largest Number 把数组排成最大的数
给定一个非负整数的列表,重新排列它们的顺序把他们组成一个最大的整数.例如,给定 [3, 30, 34, 5, 9],最大的组成数是 9534330.注意: 结果可能非常大,所以您需要返回一个字符串而不 ...
- git免密码
法1: git config --global credential.helper store 这样就自动储存密码 法2: 使用ssh访问(https:// 改成 ssh://)
- AngularJS入门 & 分页 & CRUD示例
一.AngularJS 简介 AngularJS 诞生于2009年,由Misko Hevery 等人创建,后为Google所收购.是一款优秀的前端JS框架,已经被用于Google的多款产品当中. ...
- SQL Server中行列转置方法
PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P ...
- js 类似于移动端购物车删除,左移动删除
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- c Xcode has incompatible definitions in different translations units
解决方案: build > setting enable module 改为No
- lua 之 and or not
and是与运算,返回值如下 如果前者为false或者nil,则返回前者,否则后者 A and B 类似如下语句 if not A then return A else return B end 总结: ...
- opencv笔记
加载图像: OpenCV支持图像格式Windows位图(bmp),便携式图像格式(pbm,pgm,ppm)和Sun光栅(sr,ras). Mat image = imread( imageName, ...