HDU 3333 & 3874 (线段树+离线询问)
两个题目都是求区间之内,不重复的数字之和,3333需要离散化处理.................
调试了一下午........说多了都是泪...........
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <map>
#include <queue>
#include <climits>//形如INT_MAX一类的
#define MAX 51111
#define INF 0x7FFFFFFF
#define L(x) x<<1
#define R(x) x<<1|1
//#pragma comment(linker, "/STACK:36777216") ///传说中的外挂
using namespace std; inline void RD(int &ret) {
char c;
do {
c = getchar();
} while(c < '0' || c > '9') ;
ret = c - '0';
while((c=getchar()) >= '0' && c <= '9')
ret = ret * 10 + ( c - '0' );
} inline void OT(int a) {
if(a >= 10)OT(a / 10) ;
putchar(a % 10 + '0') ;
} struct node {
int l,r,mid,cover;
__int64 sum;
} tree[MAX*4]; int n,m;
int a[MAX],va[MAX],pos[MAX],tmp[MAX];
__int64 ans[111111 * 2]; struct Node {
int l,r;
int id;
} qes[111111 * 2]; void init() {
memset(va,0,sizeof(va));
}
int search(int l,int r,int x) {
int mid;
while(l <= r) {
mid = (l+r) >> 1;
if(pos[mid] == x) return mid;
else if(pos[mid] > x) r = mid -1;
else l = mid + 1;
}
} void up(int num) {
tree[num].sum = tree[L(num)].sum + tree[R(num)].sum;
} void build(int l,int r,int num) {
tree[num].l = l;
tree[num].r = r;
tree[num].mid = (l+r) >> 1;
tree[num].cover = 0;
tree[num].sum = 0;
if(l == r) {
tree[num].sum = va[l];
return ;
}
build(l,tree[num].mid,L(num));
build(tree[num].mid + 1,r,R(num));
up(num);
} void update(int l,int x,int color) {
if(tree[x].l == tree[x].r) {
tree[x].sum += color;
return ;
}
if(l > tree[x].mid) update(l,R(x),color);
else update(l,L(x),color);
up(x);
} __int64 query(int l,int r,int num) {
if(l == tree[num].l && tree[num].r == r) {
return tree[num].sum;
}
if(r <= tree[num].mid) {
return query(l,r,L(num));
} else if(l > tree[num].mid) {
return query(l,r,R(num));
} else {
return query(l,tree[num].mid,L(num)) + query(tree[num].mid+1,r,R(num));
}
} bool cmp(const Node &a,const Node &b) {
if(a.r == b.r) return a.l < b.l;
return a.r < b.r;
} bool cmp2(const int &a, const int &b) {
return a < b;
}
int main() {
int T;
cin >> T;
while(T --) {
init();
RD(n);
int t = 1;
for(int i=1; i<=n; i++) {
RD(a[i]);
tmp[i] = a[i];
}
sort(tmp+1,tmp+1+n,cmp2);
pos[1] = tmp[1];
for(int i=2; i<=n; i++) {
if(tmp[i] != tmp[i-1]) {
pos[++t] = tmp[i];
}
}
build(1,n,1);
RD(m);
for(int i=1; i<=m; i++) {
RD(qes[i].l);
RD(qes[i].r);
qes[i].id = i;
}
sort(qes+1,qes+1+m,cmp);
int order = 1;
for(int i=1; i<=m; i++) {
while(qes[i].r >= order) {
int id = search(1,t,a[order]);
int ps = va[id];
if( ps != 0) update(ps,1,-a[order]);
va[id] = order;
update(va[id],1,a[order]);
order ++;
}
ans[qes[i].id] = query(qes[i].l,qes[i].r,1);
}
for(int i=1; i<=m; i++) {
printf("%I64d\n",ans[i]);
}
}
return 0;
}
HDU 3333 & 3874 (线段树+离线询问)的更多相关文章
- HDU 4417 【线段树+离线处理】
http://acm.hdu.edu.cn/showproblem.php?pid=4417 题意:找出给定区间内,有多少个数小于等于给定的数.用线段树维护的话会超时,要用到线段树的离线操作,对询问与 ...
- HDU 4638-Group(线段树+离线处理)
题意: 给n个编号,m个查询每个查询l,r,求下标区间[l,r]中能分成标号连续的组数(一组内的标号是连续的) 分析: 我们认为初始,每个标号为一个组(线段树维护区间组数),从左向右扫序列,当前标号, ...
- hdu 4288 Coder (线段树+离线)
题意: 刚开始有一个空集合.有三种操作: 1.往集合中加入一个集合中不存在的数 x 2.从集合中删除一个已经存在的数 x 3.计算集合的digest sum并输出. digest sum求 ...
- 线段树+离线 hdu5654 xiaoxin and his watermelon candy
传送门:点击打开链接 题意:一个三元组假设满足j=i+1,k=j+1,ai<=aj<=ak,那么就好的.如今告诉你序列.然后Q次询问.每次询问一个区间[l,r],问区间里有多少个三元组满足 ...
- 牛客练习赛53 E-老瞎眼pk小鲜肉(思维+线段树+离线)
前言 听说是线段树离线查询?? 做题做着做着慢慢对离线操作有点感觉了,不过也还没参透,等再做些题目再来讨论离线.在线操作. 这题赛后看代码发现有人用的树状数组,$tql$.当然能用树状数组写的线段树也 ...
- hdu 4031 attack 线段树区间更新
Attack Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others)Total Subm ...
- hdu 3016 dp+线段树
Man Down Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- HDU 4417-Super Mario-线段树+离线
Description Mario is world-famous plumber. His "burly" figure and amazing jumping ability ...
- HDU 3333 Turing Tree 线段树+离线处理
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3333 Turing Tree Time Limit: 6000/3000 MS (Java/Othe ...
随机推荐
- Jmeter 执行java脚本结束时提示:he JVM should have exitted but did not
使用jmeter执行java协议测试结束时会提示:he JVM should have exitted but did not ,jmeter2.11以后的可以 通过设置: jmeteren ...
- Android 在AlertDialog里添加布局控件
android里很多时候需要在弹出的AlertDialog里有自己的控件,填写信息,比如弹出一个登陆对话框 那么首先你就要创建这么一个布局的inputphonenum.xml文件了 <?xml ...
- 如何配置Java环境
下载JDK并安装 搜索JDK,官网立马就出来了,下载之后个人觉得毕竟开发,毕竟这东西不大,C盘稳一点,安装在C盘可以的 配置 右键打开计算机->属性->高级系统设置->高级-> ...
- C++中的类所占内存空间总结
C++中的类所占内存空间总结 最近在复习c++的一些基础,感觉这篇文章很不错,转载来,大家看看! 类所占内存的大小是由成员变量(静态变量除外)决定的,成员函数(这是笼统的说,后面会细说)是不计算 ...
- 解决 android.view.ViewGroup$LayoutParams cannot be cast to android.widget.AbsListView$LayoutParams
错误日志1: 06-13 10:55:50.410: E/KVLog(1129): Error info:java.lang.ClassCastException: android.widget.Li ...
- [Bhatia.Matrix Analysis.Solutions to Exercises and Problems]ExI.1.1
Given any $k$-tupel of linearly independent vectors $X$ as above, there exists a $k$-tuple $Y$ biort ...
- lightoj 1004
很水的一个dp #include<cstdio> #include<iostream> #include<cstring> #include<algorith ...
- PLS-00306:错误解决思路 - OracleHelper 执行Oracle函数的坑
如果你是像我一样初次使用Net+Oracle的结合,我想你会跟我一样,有很大的概率碰到这个问题 ==================================================== ...
- [SCOI2009]游戏
Time Limit: 1 Sec Memory Limit: 162 MB Description windy学会了一种游戏.对于1到N这N个数字,都有唯一且不同的1到N的数字与之对应.最开始wi ...
- 【原】Scala学习资料
Scala是基于JVM的一种通用函数式也是面向对象编程语言,能和Java.C#等主流的编程语言无缝融合. 下面给大家推荐一些Scala的学习资料,序号靠前的重要性比较高. 1.Scala初学指南 (1 ...