求一个序列中全部数字的和,当中数值同样的仅仅能计算一次。

先储存全部的请求,然后依照它们的右边界排序,在查询的同一时候更新区间。这里事实上有一点点DP的味道,在它进行某个查询之前,保证全部的反复数字(除去最后一个)都被删除光了,而且有不能影响其它查询,所以呢,仅仅能从近期的那个操作进行计算。1次query就可以

#include<iostream>
#include<stdio.h>
#include<string>
#include<string.h>
#include<algorithm>
#include<vector> using namespace std; const int maxn = 50050;
const int maxm = 200050;
vector<int> vec;
__int64 res[maxm];
__int64 ans;
int pre[1000050]; void init()
{
vec.clear();
vec.push_back(0);
memset(pre, 0, sizeof(pre));
} struct line{
int left, right, id;
bool operator<(const line &y)const
{
return right < y.right;
}
}q[maxm]; struct node{
int left, right;
__int64 sum;
int mid(){
return (left+right)/2;
}
}tree[maxn*4]; void buildTree(int left, int right, int rt)
{
tree[rt].left = left;
tree[rt].right = right;
if(left == right){
int a;
scanf("%d", &a);
vec.push_back(a);
return ;
}
int mid = tree[rt].mid();
buildTree(left, mid, rt<<1);
buildTree(mid+1, right, rt<<1|1);
tree[rt].sum = tree[rt<<1].sum + tree[rt<<1|1].sum;
} void update(int left, int right, int rt, int pos, int add)
{
if(left == right){
tree[rt].sum = add;
return ;
}
int mid = tree[rt].mid();
if(pos <= mid)
update(left, mid, rt<<1, pos, add);
if(pos > mid)
update(mid+1, right, rt<<1|1, pos, add);
tree[rt].sum = tree[rt<<1].sum + tree[rt<<1|1].sum;
} void query(int left, int right, int rt, int L, int R)
{
if(L <= left && R >= right){
ans += tree[rt].sum;
return ;
}
int mid = tree[rt].mid();
if(L <= mid)
query(left, mid, rt<<1, L, R);
if(R > mid)
query(mid+1, right, rt<<1|1, L, R);
} int main()
{
int T, M, N;
scanf("%d", &T);
while(T --)
{
scanf("%d", &N); init();
buildTree(1, N, 1); scanf("%d", &M);
for(int i = 1; i <= M; i ++)
{
scanf("%d%d", &q[i].left, &q[i].right);
q[i].id = i;
}
sort(q+1, q+M+1);//排序是从index=1開始的M个数 int qn = 0;
for(int i = 1; i <= N && qn <=M; i ++)
{
if(pre[vec[i]] != 0){
update(1, N, 1, pre[vec[i]], 0);
}
update(1, N, 1, i, vec[i]);
while(qn <= M && q[qn].right <= i){
ans = 0;
if(q[qn].right == i){
query(1, N, 1, q[qn].left, q[qn].right);
res[q[qn].id] = ans;
}
qn ++;
}
pre[vec[i]] = i;
}
for(int i = 1; i <= M; i ++) printf("%I64d\n", res[i]);
} return 0;
}

hdu 3874的更多相关文章

  1. Necklace HDU - 3874 (线段树/树状数组 + 离线处理)

    Necklace HDU - 3874  Mery has a beautiful necklace. The necklace is made up of N magic balls. Each b ...

  2. HDU 3874 Necklace 区间查询的离线操作

    题目: http://acm.hdu.edu.cn/showproblem.php?pid=3874 对需要查询的区间按右端点排序,然后从左到右依次加入序列中的元素,同时更新,更新的方法是,把上一次出 ...

  3. HDU 3874 Necklace (树状数组 | 线段树 的离线处理)

    Necklace Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total S ...

  4. hdu 3874 Necklace(bit树+事先对查询区间右端点排序)

    Mery has a beautiful necklace. The necklace is made up of N magic balls. Each ball has a beautiful v ...

  5. hdu 3874 Necklace(线段树)

    这道题目和我之前做过的一道3xian大牛出的题目很像,不过总的来说还是要简单一点儿. 计算区间内的值的时候如果两个值相等,只能计算其中一个. 这道题需要将所有的问题输入之后再计算,首先,对所有问题的右 ...

  6. HDU 3874 离线段树

    在所有数字的统计范围,,对于重复统计只有一次 离线段树算法 排序终点坐标.然后再扫,反复交锋.把之前插入树行被删除 #include "stdio.h" #include &quo ...

  7. HDU 3874 Necklace

    莫队算法. #include<cstdio> #include<cstring> #include<cmath> #include<queue> #in ...

  8. hdu 3874(树状数组)题解

    Problem Description Mery has a beautiful necklace. The necklace is made up of N magic balls. Each ba ...

  9. HDU - 3874 Necklace (树状数组、离线处理)

    题目链接:Necklace 题意: 给出一串珠子,每个珠子有它的value,现在给出n(n<=5e4)个珠子的value(1<=value<=1e6),现在给出m(1<=m&l ...

随机推荐

  1. Windows下效率必备软件

    AutoHotKey: 神器!神器!神器!当然也得看使用者咯(^__^) 嘻嘻…… Listary: 本地搜索神器,当然还有别的作用,More&More. Launchy : 快速启动安装的应 ...

  2. PowerDesigner 为sql生成凝视

    在使用pd时发现生成的语句中没有行凝视,这样就得手动来加这些凝视,后来在网上找了一些方法.确实得到了解决,分享一下. 在Database-->edit Current DBMS... 设置dbm ...

  3. yate.conf

    但档案.粘贴下面的例子.不解释!除去非常灵活!只保留sip电话! [general] ; General settings for the operation of Yate ; modload: b ...

  4. 怎样用C#代码管理SharePoint解决方式

    怎样用C#代码管理SharePoint解决方式         本文我们将了解怎样用代码管理SharePoint解决方式.我们使用server端对象模型抽取解决方式.         SharePoi ...

  5. hdu 1575 Tr A(矩阵高速电源输入)

    Tr A Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  6. webstorm创建nodejs + express + jade 的web 项目

    webstorm创建nodejs + express + jade 的web 项目 前简单了解过nodejs,觉得用nodejs来做个网站也太麻烦了,要自己拼html的字符串返回,这能做网站嘛? 最近 ...

  7. sql 中获取最后生成的标识值 IDENT_CURRENT ,@@IDENTITY ,SCOPE_IDENTITY 的用法和区别

    原文:sql 中获取最后生成的标识值 IDENT_CURRENT ,@@IDENTITY ,SCOPE_IDENTITY 的用法和区别 IDENT_CURRENT 返回为任何会话和任何作用域中的指定表 ...

  8. iOS中通讯录电话号码空格问题

    今天在读取通讯录的时候,读取到的手机号码格式为* (***) ***-****的,乍看下,数字中间有空格."-".(.)的非数字字符. 然后我就打算替换这些非数字字符,结果替换完, ...

  9. MapReduce 规划 系列的12 使用Hadoop Streaming技术集成newLISP文字

    本文example6环境与前Hadoop 1.x异,于Hadoop 2.x环境测试. 功能与前面相同的日志处理程序. 第一newLISP文字,游玩mapper任务.于stdin读取文本数据,将did由 ...

  10. java 生产者消费者问题 并发问题的解决(转)

    引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图 ...