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 ...
随机推荐
- 写你自己struts1框架
前言 文本 它们的定义Struts1 commons-digester.jar解析XML 实现XML标签到对象的转换 1.依据目标XML的结构定义解析规则文件 參照rule.xml 2.创建集合对象接 ...
- nodejs显现events.js:72抛出错误
随着人们开始学习,我用nodejs过程中遇到如下列错误执行: events.js:72 throw er; // Unhandled 'error' event ^ Error: listen EAD ...
- C语言标准库函数qsort具体解释
1 函数简单介绍 功 能: 使用高速排序例程进行排序 头文件:stdlib.h 用 法: void qsort(void *base,int nelem,int width,int (*fcmp)(c ...
- Linux互斥和同步应用程序(四):posix互斥信号和同步
[版权声明:尊重原创.转载请保留源:blog.csdn.net/shallnet 要么 .../gentleliu,文章仅供学习交流,请勿用于商业用途] 在前面讲共享内 ...
- App如何选择移动广告平台,开发者2 - 移动变现模式分析
开发人员社区的上述分析.它可能无法覆盖全部,但是,每一个开发者都需要根据自己的特点变现模式选择.继App流动性模式做了全面的分析. 游戏.广告.电商是互联网的三种变现模式,移植到移动互联网也相同适用. ...
- Cordova探险系列(一个)
最早接触PhoneGap平台是在1年多之前,可以使用HTML.CSS和JavaScript跨平台来编写Android或者IOS设备程序.而且应用的核心代码不须要多少改动就行移植.确实让我感觉的到它应该 ...
- Socket方法LAN多线程文件传输
1.思维:为了实现各种文件的大小可以被发送和接收的,它可以被设置为发送和接收缓冲器环.并记录文件的位置读取,假设读入缓冲区的字节的特定数目大于缓冲区的大小较小.然后该文件被发送,退出发送周期,关闭连接 ...
- 基于android 社会的app短信分享 发送回调事件的实现
摘要 前一段时间.由于项目的需要,采用ShareSDK该共享功能.其中包含 短信股吧.和呼叫系统,以分享要与成功处理服务器交互的消息后,(我不在乎在这里,收到.仅仅关心发出去了).可是ShareSDk ...
- Android应用公布的准备——生成渠道包
我们须要使用一个变量标明该app的渠道.通常我们能够在manifest中的application节点下声明.例如以下. <meta-data android:name="CHANNEL ...
- 阿里云OSS Multipart Upload上传实例
原来是用的PutObject()方式上传文件的,但是当文件比较大的时候,总是报一个对方强制关闭连接导致上传失败.PS:公司的网比较渣,10MB的文件都传不上去,搜了下,说使用Multipart Upl ...