此题的大意思说有一串珠子,每个珠子都有自己的欣赏值value,现在给你一串珠子每个的欣赏值,并给出一些询问,查询某个区间内部总欣赏值是多少,但是有一个约定就是如果这个区间内部有两个珠子的欣赏值是一样的,那么他们就视为一个。

其实也就是求某个区间内部不同的数的和。

这里学到了一个比较好的方法,那就是离线操作。根据我的理解,离线操作就是为了解决在询问中所遇到的矛盾的,它在本题上的实现就是先将查询排序,比如按照每个查询的右端点的升序排序,这样的话每次查询一个区间的时候,我们就把它的右端点到上一个查询的右端点之间且在之前已经出现过了相同价值的点删除掉,这样的话就可以保证对后面的查询不会有影响。

具体实现就是用一个last[]数组保存每一个value值最初出现的位置,再用一个Right保存上次扫描的区间的右端点(初始化为1,下图中的R表示),每次查询一个区间的和时,先按照Right到这个区间右端点扫描一遍,如果当中有一个value值上次出现的位置不在它自己的位置时,如下图第2个1之前出现的位置L[1]=1,那么我们就把第一个1从树状数组里面去掉,然后同时更新L[1]为当前位置L[1]=2.这样一来当前的1之前就可以保证没有重复的1。而且下次找到另外一个1时,也只会删除位置为2的1.

同时我们还要更新Right值为当前区间的右端点(因为之前区间已经没有重复的了)

aaarticlea/png;base64,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" alt="" width="597" height="245" />

同时,由于是按照右端点的升序排列,所以可能会用到之前的1或者不用,用的话同样保证了只有1个1,所以这样排序是对的

 #include <stdio.h>
#include <string.h>
#include <algorithm>
#define mem(a) memset(a,0,sizeof(a))
#define MAX(a , b) ((a) > (b) ? (a) : (b))
using namespace std; struct QUERY
{
int a,b;
int index;
}query[];
__int64 c[], ans[];
int last[], value[], N, M, T; int cmp(QUERY x, QUERY y)
{
return x.b < y.b;
} int lowbit(int x)
{
return x & (-x);
} __int64 getSum(int k)
{
__int64 sum = ;
while(k>=)
{
sum += c[k];
k -= lowbit(k);
}
return sum;
} void edit(int k, int val)
{
while(k<=N)
{
c[k] += val;
k += lowbit(k);
}
} int main()
{
while(~scanf("%d", &T))while(T--)
{
mem(query); mem(c);
mem(last); mem(ans);
mem(value);
scanf("%d", &N);
for(int i=;i<=N;i++)
{
scanf("%d", &value[i]);
edit(i, value[i]);
if(!last[value[i]]) last[value[i]] = i;
}
scanf("%d", &M);
for(int i=;i<=M;i++)
{
scanf("%d%d", &query[i].a, &query[i].b);
query[i].index = i;
}
sort(query+, query+M+, cmp);
int lastRight = ;
for(int i = ; i <= M; i ++)
{
for(int j = lastRight; j <= query[i].b; j ++)
{
if(last[value[j]] != j)
{
edit(last[value[j]], -value[j]);
last[value[j]] = j;
}
}
lastRight = query[i].b;
ans[query[i].index] = getSum(query[i].b) - getSum(query[i].a-);
}
for(int i=;i<=M;i++)
{
printf("%I64d\n", ans[i]);
}
}
return ;
}

HDU3874Necklace(树状数组+离线操作)的更多相关文章

  1. HDU---4417Super Mario 树状数组 离线操作

    题意:给定 n个数,查询 位置L R内 小于x的数有多少个. 对于某一次查询 把所有比x小的数 ”的位置“ 都加入到树状数组中,然后sum(R)-sum(L-1)就是答案,q次查询就要离线操作了,按高 ...

  2. HDU 4630 No Pain No Game 树状数组+离线操作

    题意:给一串数字,每次查询[L,R]中两个数的gcd的最大值. 解法:容易知道,要使取两个数让gcd最大,这两个数最好是倍数关系,所以处理出每个数的所有倍数,两两间根据倍数关系形成一条线段,值为该数. ...

  3. Codeforces 369E Valera and Queries --树状数组+离线操作

    题意:给一些线段,然后给m个查询,每次查询都给出一些点,问有多少条线段包含这个点集中的一个或多个点 解法:直接离线以点为基准和以线段为基准都不好处理,“正难则反”,我们试着求有多少线段是不包含某个查询 ...

  4. bzoj 1878 SDOI2009树状数组 离线操作

    本来想写2120的,结果想起来了这个 我们先对于询问左端点排序,用树状数组存区间字母个数,对于每种字母, 第一次出现的位置记录为1,剩下的记录为0,然后记录下,每种颜色 后面第一个和他相同颜色的位置 ...

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

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

  6. SPOJ3267--D-query (树状数组离线操作)

    题意查询区间 [l,r]内有多少个不同的数字 先把所有询问按 右端点进行排序,然后离线操作.如果该位置的数字 已经出现过那么把前一个位置-1,当前位置+1.扫一遍输出. #include <cs ...

  7. 【树状数组】Bzoj1878[SDOI2009] HH的项链

    Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此, 他的项链变 ...

  8. Necklace(树状数组+离线操作)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3874 Necklace Time Limit: 15000/5000 MS (Java/Others) ...

  9. bzoj3529(莫比乌斯反演+离线+树状数组)

    在你以为理解mobus的时候,苦苦想通过化简公式来降低复杂度时,这题又打了我一巴掌. 看来我并没有理解到acmicpc比赛的宗旨啊. 这么多次查询可以考虑离线操作,使用树状数组单点更新. /***** ...

随机推荐

  1. 51nod1189 阶乘分数

    (x-n!)(y-n!)=n!2 ans=t[n]+1.t表示的是n!2的小于n!的约数个数.n!2=p1a1*p2a2*p3a3...t[n]=(a1+1)*(a2+1)...-1 /2; 2对于n ...

  2. 使用Spring Session做分布式会话管理

    在Web项目开发中,会话管理是一个很重要的部分,用于存储与用户相关的数据.通常是由符合session规范的容器来负责存储管理,也就是一旦容器关闭,重启会导致会话失效.因此打造一个高可用性的系统,必须将 ...

  3. POJ 2069 Super Star

    模拟退火. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm& ...

  4. 20160129.CCPP体系详解(0008天)

    程序片段(01):函数.c+call.c+测试.cpp 内容概要:函数 ///函数.c #include <stdio.h> #include <stdlib.h> //01. ...

  5. id to load is required for loading----id被要求加载exception

    表示id主键 没有找到,可能是数据库中的主键设置了not null 而你没有给予主键 还有就是没有传递主键到 数据库中

  6. 定时任务处理-Quartz

    Quartz Scheduler,定时任务 Quartz是一个作业调度系统(a job scheduling system),负责在约定的时间到达时执行(或通知)其他软件控制.是一个Java的定时任务 ...

  7. Java中Enum枚举的使用

    三种不同的用法 注意项: 1.在switch中使用枚举能使代码的可读性更强.   2.如果要自定义方法,那么必须在enum实例序列的最后添加分号.而且Java要求必须先定义enum实例.   3.所有 ...

  8. JVM——垃圾收集算法

    1.标记-清除算法 最基础的收集算法,如其名,算法为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象. 两个不足: 1)效率问题,标记和清除两个过程的效率 ...

  9. Yii: 设置数据翻页

    一种方法是使用CPagination处理翻页需要的数据如:总数据项数,每页数据项数,当前页,然后在视图中使用CBasePager来绘制. 控制器动作的代码示范: function actionInde ...

  10. 一个DataTable赋值给另一个DataTable的常用方法

    DataView view = new DataView();view.Table = DataTableA;view.RowFilter = "itemType = 'book'" ...