hdu 3333(树状数组 + 离线操作)
Turing Tree
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3847 Accepted Submission(s): 1306
Now given a sequence of N numbers A1, A2, ..., AN and a number of Queries(i, j) (1≤i≤j≤N). For each Query(i, j), you are to caculate the sum of distinct values in the subsequence Ai, Ai+1, ..., Aj.
For each case, the input format will be like this:
* Line 1: N (1 ≤ N ≤ 30,000).
* Line 2: N integers A1, A2, ..., AN (0 ≤ Ai ≤ 1,000,000,000).
* Line 3: Q (1 ≤ Q ≤ 100,000), the number of Queries.
* Next Q lines: each line contains 2 integers i, j representing a Query (1 ≤ i ≤ j ≤ N).
3
1 1 4
2
1 2
2 3
5
1 1 2 1 3
3
1 5
2 4
3 5
5
6
3
6
题目描述: 求给定一个序列中某段子区间的相异数的和。
要求相异数的和,那就把相同的数去掉就行,可是由于查询的区间不确定,假设要查被删数之前包含被删数的区间的和,就不好办了。
所以我们首先读入所有的查询,然后在建立树状数组的过程中可以一次回答以i结尾的数之前的所有查询,如果有重复的就删掉,
因为比i小的以它结尾所有的查询都存下。由于要按顺序输出它的结果,所以我们给每个查询操作编号,又由于要从小到大回答以i结尾
的所有查询,所以我们采用一个结构体,成员变量分别是L,R,ID;以R来对结构体排序,将结果存入map<int,int > s;
s[ID]中,采用二维数组浪费空间,采用map进行映射.
最后一点要注意的是c数组的大小要是n的最大值×4;
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
#include <algorithm>
#include <map>
#define maxn 55555*4
#define LL long long
#define inf 0x3f3f3f3f3f3f3f3f3f3f
#define lowbit(x) x & (-x)
using namespace std;
//int visit[maxn];
//int VISIT[maxn];
map <LL,LL > visit;
map <LL ,LL > VISIT;
LL A[maxn];
int n,cnt;
struct node
{
int L,R,id;
};
node Q[maxn];
LL c[maxn];
LL ans[maxn];
void init()
{
memset(c,,sizeof(c));
//memset(visit,0,sizeof(visit));
//memset(VISIT,0,sizeof(VISIT));
visit.clear();
VISIT.clear();
cnt=;
}
LL sum(int x)
{
LL ret=;
while(x>)
{
ret+=c[x];
x-=(x&(-x) );
}
return ret;
}
void add(int x,LL d)
{
while(x<=n)
{
c[x]+=d;
x+=(x& (-x) );
}
}
void solve()
{
for(int i=;i<=n;i++)
{
if(visit[A[i]]!=)
{
add(visit[A[i]],-A[i]);
}
visit[A[i]]=i;
add(i,A[i]);
if(VISIT[i]!=)
{
for(int j=;j<=VISIT[i];j++)
{
cnt++;
ans[Q[cnt].id]=sum(Q[cnt].R)-sum(Q[cnt].L-);
//printf("%lld\n",ans[Q[cnt].id]);
}
}
}
}
bool cmp(node a,node b)
{
if(a.R==b.R)
return a.L<b.L;
else
return a.R<b.R;
}
int main()
{
//freopen("test.txt","r",stdin);
int t,q;
scanf("%d",&t);
while(t--)
{
init();
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%lld",&A[i]);
scanf("%d",&q);
for(int i=;i<=q;i++)
{
scanf("%d%d",&Q[i].L,&Q[i].R);
Q[i].id=i;
// printf("%d\n",Q[i].id);
++VISIT[Q[i].R];
}
sort(Q+,Q+q+,cmp); /* for(int i=1;i<=q;i++)
{
printf("%d\n",Q[i].id);
}*/
solve();
for(int i=;i<=q;i++)
{
printf("%lld\n",ans[i]);
} }
return ;
}
hdu 3333(树状数组 + 离线操作)的更多相关文章
- hdu 3333 树状数组+离线处理
http://acm.hdu.edu.cn/showproblem.php?pid=3333 不错的题,想了非常久不知道怎么处理,并且答案没看懂,然后找个样例模拟下别人的代码立即懂了---以后看不懂的 ...
- HDU 3333 树状数组离线查询
题目大意: 询问区间内不同种类的数的数值之和 这里逐个添加最后在线查询,会因为相同的数在区间内导致冲突 我们总是希望之后添加的数不会影响前面,那么我们就在添加到第i个数的时候,把所有在1~i 的区间的 ...
- hdu 3333 树状数组
思路:定义一个map容器用来记录数ai上次出现的位置.将查询区间按右边界升序进行排序,当插入第i个数ai时,pre[ai]+1---->i的区间就会多一个不同的数,其值就是ai,那么可以用upd ...
- Turing Tree HDU - 3333 (树状数组,离线求区间元素种类数)
After inventing Turing Tree, 3xian always felt boring when solving problems about intervals, because ...
- hdu 4638 树状数组 区间内连续区间的个数(尽可能长)
Group Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- hdu 4777 树状数组+合数分解
Rabbit Kingdom Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- HDU 4630 No Pain No Game 树状数组+离线操作
题意:给一串数字,每次查询[L,R]中两个数的gcd的最大值. 解法:容易知道,要使取两个数让gcd最大,这两个数最好是倍数关系,所以处理出每个数的所有倍数,两两间根据倍数关系形成一条线段,值为该数. ...
- HDU 2852 (树状数组+无序第K小)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2852 题目大意:操作①:往盒子里放一个数.操作②:从盒子里扔掉一个数.操作③:查询盒子里大于a的第K小 ...
- HDU 4911 (树状数组+逆序数)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4911 题目大意:最多可以交换K次,就最小逆序对数 解题思路: 逆序数定理,当逆序对数大于0时,若ak ...
随机推荐
- WebApi下载附件文件
WebApi下载附件文件 1. [RoutePrefix("down")] public class FilesController : ApiController { [GET( ...
- Windows的Java_HOME环境变更配置
Windows的Java_HOME环境变更配置 一般会配置三个环境变更: 1.系统变量 变量名JAVA_HOME 变量值=安装目录,如:C:\Program Files (x86)\Java\jdk ...
- msp430项目编程24
msp430中项目---MMC接口 1.串行通信工作原理 2.串行通信协议 3.代码(显示部分) 4.代码(功能实现) 5.项目总结 msp430项目编程 msp430入门学习
- 动态规划:Ignatius and the Princess IV
#include<stdio.h> #include<string.h> #include<math.h> int main() { _int64 n,a; whi ...
- Topcoder SRM 657DIV2
前言: 像我这样一直在DIV2的弱菜..不知道说什么了. A:一定判断有8个‘R’,每行 每列只有一个 B题:大概是 int E,int EM,int M,int MH,int H 然后EM可以给值 ...
- jfree-生成xy图
需要导入的包: import org.jfree.chart.*; import org.jfree.chart.plot.PlotOrientation; import org.jfree.data ...
- 中间件序列TDATASET为BUFFER演示代码
procedure SendStream(const AStream: TStream);var Buffer: array[0..4095] of Byte; // 每包最大4K StartPos, ...
- HDOJ 5384 Danganronpa AC自己主动机
AC自己主动机裸题 Danganronpa Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java ...
- JSP中过滤器的设置
JSP中过滤器的设置 package com.filter; import java.io.IOException; import java.net.URLDecoder; import java.u ...
- Hibernate之三态篇
一.概况 (一)瞬时状态(暂时态) 在对象中假设对象刚被创建但没有被持久化的话就是瞬时态 特点: (1) 不和 Session 实例关联 (2)在数据库中没有和瞬时对象关联的记录 (二)持久状态 持久 ...