Necklace

Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2083    Accepted Submission(s): 747

Problem Description
Mery has a beautiful necklace. The necklace is made up of N magic balls. Each ball has a beautiful value. The balls with the same beautiful value look the same, so if two or more balls have the same beautiful value, we just count it once. We define the beautiful value of some interval [x,y] as F(x,y). F(x,y) is calculated as the sum of the beautiful value from the xth ball to the yth ball and the same value is ONLY COUNTED ONCE. For example, if the necklace is 1 1 1 2 3 1, we have F(1,3)=1, F(2,4)=3, F(2,6)=6.

Now Mery thinks the necklace is too long. She plans to take some continuous part of the necklace to build a new one. She wants to know each of the beautiful value of M continuous parts of the necklace. She will give you M intervals [L,R] (1<=L<=R<=N) and you must tell her F(L,R) of them.

 
Input
The first line is T(T<=10), representing the number of test cases.
  For each case, the first line is a number N,1 <=N <=50000, indicating the number of the magic balls. The second line contains N non-negative integer numbers not greater 1000000, representing the beautiful value of the N balls. The third line has a number M, 1 <=M <=200000, meaning the nunber of the queries. Each of the next M lines contains L and R, the query.
 
Output
For each query, output a line contains an integer number, representing the result of the query.
 
Sample Input
2
6
1 2 3 4 3 5
3
1 2
3 5
2 6
6
1 1 1 2 3 5
3
1 1
2 4
3 5
 
Sample Output
3
7
14
1
3
6
 
Source
 
Recommend
lcy
 
  1. /*
  2. 题意为查找区间去重后的和
  3. 用树状数组离线处理
  4. 将所有查询以右端点从小到大排序
  5. 按此顺序边去重边查询
  6. 前面的去重就不会影响到后面的结果了
  7. */
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm> using namespace std; const int N=;
const int M=; struct node{
int l,r;
int id;
}q[M]; int n,m,val[N],pre[N],loc[];
long long arr[N],res[M]; int lowbit(int x){
return x&(-x);
} void update(int i,int x){
while(i<=n){
arr[i]+=x;
i+=lowbit(i);
}
} long long Sum(int i){
long long ans=;
while(i>){
ans+=arr[i];
i-=lowbit(i);
}
return ans;
} bool cmp(node a,node b){
return a.r<b.r;
} int main(){ //freopen("input.txt","r",stdin); int t;
scanf("%d",&t);
while(t--){
memset(arr,,sizeof(arr));
memset(loc,-,sizeof(loc));
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d",&val[i]);
pre[i]=loc[val[i]];
loc[val[i]]=i;
update(i,val[i]);
}
scanf("%d",&m);
for(int i=;i<=m;i++){
scanf("%d%d",&q[i].l,&q[i].r);
q[i].id=i;
}
sort(q+,q++m,cmp);
int r=;
for(int i=;i<=m;i++){
for(int j=r+;j<=q[i].r;j++)
if(pre[j]!=-)
update(pre[j],-val[j]);
r=q[i].r;
res[q[i].id]=Sum(q[i].r)-Sum(q[i].l-);
}
for(int i=;i<=m;i++)
printf("%I64d\n",res[i]);
}
return ;
}

线段树:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map> using namespace std; const int N=; //#define L(rt) (rt<<1)
//#define R(rt) (rt<<1|1) #define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1 struct Tree{
int l,r;
int id;
}q[N<<]; map<int,int> mp;
int n,m,a[N];
long long sum[N<<],res[N<<]; void PushUp(int rt){
sum[rt]=sum[rt<<]+sum[rt<<|];
} void update(int id,int val,int l,int r,int rt){
if(l==r){
sum[rt]+=val;
return ;
}
int mid=(l+r)>>;
if(id<=mid)
update(id,val,lson);
else
update(id,val,rson);
PushUp(rt);
} long long query(int L,int R,int l,int r,int rt){
if(L<=l && R>=r)
return sum[rt];
int mid=(l+r)>>;
long long ans=;
if(L<=mid)
ans+=query(L,R,lson);
if(R>mid)
ans+=query(L,R,rson);
return ans;
} int cmp(Tree a,Tree b){
return a.r<b.r;
} int main(){ //freopen("input.txt","r",stdin); int t;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
scanf("%d",&m);
for(int i=;i<=m;i++){
scanf("%d%d",&q[i].l,&q[i].r);
q[i].id=i;
}
sort(q+,q++m,cmp);
mp.clear();
memset(sum,,sizeof(sum));
int r=;
for(int i=;i<=m;i++){
for(int j=r+;j<=q[i].r;j++){
if(mp[a[j]])
update(mp[a[j]],-a[j],,n,);
update(j,a[j],,n,);
mp[a[j]]=j;
r=q[i].r;
}
res[q[i].id]=query(q[i].l,q[i].r,,n,);
}
for(int i=;i<=m;i++)
printf("%I64d\n",res[i]);
}
return ;
}

HDU 3874 Necklace (树状数组 | 线段树 的离线处理)的更多相关文章

  1. 树状数组 && 线段树应用 -- 求逆序数

    参考:算法学习(二)——树状数组求逆序数 .线段树或树状数组求逆序数(附例题) 应用树状数组 || 线段树求逆序数是一种很巧妙的技巧,这个技巧的关键在于如何把原来单纯的求区间和操作转换为 求小于等于a ...

  2. hdu1394(枚举/树状数组/线段树单点更新&区间求和)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:给出一个循环数组,求其逆序对最少为多少: 思路:对于逆序对: 交换两个相邻数,逆序数 +1 ...

  3. 洛谷P2414 阿狸的打字机 [NOI2011] AC自动机+树状数组/线段树

    正解:AC自动机+树状数组/线段树 解题报告: 传送门! 这道题,首先想到暴力思路还是不难的,首先看到y有那么多个,菜鸡如我还不怎么会可持久化之类的,那就直接排个序什么的然后按顺序做就好,这样听说有7 ...

  4. hdu 1166:敌兵布阵(树状数组 / 线段树,入门练习题)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  5. hdu 5147 Sequence II【树状数组/线段树】

    Sequence IITime Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...

  6. hdu 3966 Aragorn's Story(树链剖分+树状数组/线段树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3966 题意: 给出一棵树,并给定各个点权的值,然后有3种操作: I C1 C2 K: 把C1与C2的路 ...

  7. hdu 1166 敌兵布阵——(区间和)树状数组/线段树

    pid=1166">here:http://acm.hdu.edu.cn/showproblem.php?pid=1166 Input 第一行一个整数T.表示有T组数据. 每组数据第一 ...

  8. HDU 1166 敌兵布阵 树状数组||线段树

    http://acm.hdu.edu.cn/showproblem.php?pid=1166 题目大意: 给定n个数的区间N<=50000,还有Q个询问(Q<=40000)求区间和. 每个 ...

  9. HDU 3303 Harmony Forever 前缀和+树状数组||线段树

    Problem Description We believe that every inhabitant of this universe eventually will find a way to ...

  10. hdu 1166 树状数组(线段树)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

随机推荐

  1. Linux查看当前目录下文件夹和文件的大小

    File参数实际上是一个目录,就要报告该目录内的所有文件.如果没有提供 File参数,du命令使用当前目录内的文件. 如果File参数是一个目录,那么报告的块的数量就是分配到目录中文件以及分配到目录自 ...

  2. vb6 实现奇门遁甲起局排盘、格局分析概要

    为了感谢博客园提供场地写博客,我将在周末有空时候,围绕奇门遁甲,涉及到奇门遁甲学习过程的方方面面的问题,写一些文章展开叙述!

  3. 关于hr标签兼容个浏览器的代码

    hr标签,相信大家都能熟悉,我们一般用它来产生横线的效果.我们可以对它定义“颜色”.“高度”.“宽度”.“边框”等样式. 在此只讨论“颜色”和“边框”对于不同版本浏览器的兼容性. 颜色: 火狐.IE7 ...

  4. Zabbix_server.conf 的性能调优

    Zabbix安装完成后,模板里面有一个Template App Zabbix Server,添加到zabbix服务器里. 过个一两天,查看以下的图表(在Graphs里面). Zabbix cache ...

  5. Zabbix3.0+CentOS7.0+MariaDB5.5监视服务器安装

    本次安装采用: Centos7.0 Zabbix3.0 MariaDB5.5 -------------------  2012/12/2更新 最新的Centos7.1或者Redhat7.1版本在最后 ...

  6. DIV与SPAN的区别

    DIV 和 SPAN 元素最大的特点是默认都没有对元素内的对象进行任何格式化渲染.主要用于应用样式表(共同点). 两者最明显的区别在于DIV是块元素,而SPAN是行内元素(也译作内嵌元素). 详解:1 ...

  7. 46 个非常有用的 PHP 代码片段

    在编写代码的时候有个神奇的工具总是好的!下面这里收集了 40+ PHP 代码片段,可以帮助你开发 PHP 项目. 这些 PHP 片段对于 PHP 初学者也非常有帮助,非常容易学习,让我们开始学习吧- ...

  8. Mac OS X上用CoreCLR运行一个真正的.NET控制台程序

    这个真正的控制台程序来自corefxlab,名叫CoreClrHelloWorld,是一个跨平台的.NET控制台演示程序,可以显示微软.Linux.苹果的logo. CoreClrHelloWorld ...

  9. 理解 Soap

    http://www.cnblogs.com/yhuang/archive/2012/04/04/share_storm.html 自己也写了下: using System; using System ...

  10. SRS文档 王倩倩 201303014004

    设计阶段 Spec 图书管理系统functional spec:软件功能说明书, 主要用来说明软件的外部功能, 和用户的交互情况 (把软件当作一个黑盒子).从用户的角度描述软件产品的功能, 输入,输出 ...