hdu 3874
求一个序列中全部数字的和,当中数值同样的仅仅能计算一次。
先储存全部的请求,然后依照它们的右边界排序,在查询的同一时候更新区间。这里事实上有一点点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的更多相关文章
- Necklace HDU - 3874 (线段树/树状数组 + 离线处理)
Necklace HDU - 3874 Mery has a beautiful necklace. The necklace is made up of N magic balls. Each b ...
- HDU 3874 Necklace 区间查询的离线操作
题目: http://acm.hdu.edu.cn/showproblem.php?pid=3874 对需要查询的区间按右端点排序,然后从左到右依次加入序列中的元素,同时更新,更新的方法是,把上一次出 ...
- HDU 3874 Necklace (树状数组 | 线段树 的离线处理)
Necklace Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total S ...
- hdu 3874 Necklace(bit树+事先对查询区间右端点排序)
Mery has a beautiful necklace. The necklace is made up of N magic balls. Each ball has a beautiful v ...
- hdu 3874 Necklace(线段树)
这道题目和我之前做过的一道3xian大牛出的题目很像,不过总的来说还是要简单一点儿. 计算区间内的值的时候如果两个值相等,只能计算其中一个. 这道题需要将所有的问题输入之后再计算,首先,对所有问题的右 ...
- HDU 3874 离线段树
在所有数字的统计范围,,对于重复统计只有一次 离线段树算法 排序终点坐标.然后再扫,反复交锋.把之前插入树行被删除 #include "stdio.h" #include &quo ...
- HDU 3874 Necklace
莫队算法. #include<cstdio> #include<cstring> #include<cmath> #include<queue> #in ...
- hdu 3874(树状数组)题解
Problem Description Mery has a beautiful necklace. The necklace is made up of N magic balls. Each ba ...
- HDU - 3874 Necklace (树状数组、离线处理)
题目链接:Necklace 题意: 给出一串珠子,每个珠子有它的value,现在给出n(n<=5e4)个珠子的value(1<=value<=1e6),现在给出m(1<=m&l ...
随机推荐
- MyBatis系列教程(六)-- 与Spring综合(Integrate with Spring)
其它工具或技术需要使用: 项目管理工具 : Maven 前台WEB图库:JSP 其他框架:Spring, Spring MVC 数据库 : Derby Maven的Web项目 Maven Depend ...
- [渣译文] SignalR 2.0 系列: SignalR 自托管主机
原文:[渣译文] SignalR 2.0 系列: SignalR 自托管主机 英文渣水平,大伙凑合着看吧…… 这是微软官方SignalR 2.0教程Getting Started with ASP.N ...
- UVA 11769 All Souls Night 的三维凸包要求的表面面积
主题链接:option=com_onlinejudge&Itemid=8&page=show_problem&problem=2869">点击打开链接 求给定的 ...
- Spark里边:Worker源代码分析和架构
首先由Spark图表理解Worker于Spark中的作用和地位: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYW56aHNvZnQ=/font/5a6L ...
- centos 彻底删除nodejs默认的安装文件
1> yum remove nodejs npm -y 2> cd /usr/local/lib 移除所有 node 和 node_modules目录 cd /usr/local/in ...
- 允许Ubuntu14.04"保存"屏幕亮度值
Ubuntu / Debian 该系统有一个共同的问题,也就是说,每个引导.系统会打开你的屏幕亮度调至最高值. 我很奇怪,为什么14.04这一问题的版本号依然不动. 但是,我们可以做一个脚本Ubunt ...
- 【转】Android内存机制分析2——分析APP内存使用情况
上面一篇文章说了Android应用运行在dalvik里面分配的堆和栈内存区别,以及程序中什么代码会在哪里运行.今天主要是讲解一下Android里面如何分析我们程序内存使用情况.以便后续可以分析我们程序 ...
- [WebView其中一项研究]:Web Apps基本介绍
今天,我们开始了解WebView,以及Web Apps发展,从主要内容Android实际的例子来解释正式文件和后续. (博客地址:http://blog.csdn.net/developer_jian ...
- SQLHlper意识
经过学习,通过线敲登录的三个例子,敲四行CRUD样品,因此,访问数据库多次,在这些链接库.打开都一样.只是不同的操作将针对不同的表进行.始学习面向对象的思想.当让要对这些不变的要内容要进行打包,提高代 ...
- Java读书笔记三(字符串)
1.介绍 本篇博客将对JAVA中的字符串类的基本知识进行介绍.主要字符串类的一些经常用法等内容. 2.字符串对象的创建 1.有两种形式.可是在开发中常常习惯于String 变量名的形式来进行操作. & ...