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 ...
随机推荐
- cs ip 通过jmp转移命令间接赋值。无法直接对其赋值。
jmp 寄存器 命令 对IP间接赋值.
- SQLite入门与分析(五)---Page Cache之并发控制
写在前面:本节主要谈谈SQLite的锁机制,SQLite是基于锁来实现并发控制的,所以本节的内容实际上是属于事务处理的,但是SQLite的锁机制实现非常的简单而巧妙,所以在这里单独讨论一下.如果真正理 ...
- 169. Majority Element
题目: Given an array of size n, find the majority element. The majority element is the element that ap ...
- Tomcat部署(转)
首先说说tomcat的几种部署方法: 1.将应用文件夹或war文件塞到tomcat安装目录下的webapps子目录下,这样tomcat启动的时候会将webapps目录下的文件夹或war内容当成应用部署 ...
- bzoj3039
经典题目不多说 ..,..] of longint; l,r:..] of longint; i,j,n,m,ans:longint; x:char; function max ...
- UVA_11468_Substring_(AC自动机+概率动态规划)
描述 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...
- google官方提供的编译android源码的环境初始化,Initializing a Build Environment
原文网址:http://source.android.com/source/initializing.html Initializing a Build Environment IN THIS DOC ...
- Google Chrome中的高性能网络(一)
以下内容是"The Performance of Open Source Applications" (POSA)的草稿, 也是The Architecture of Open S ...
- servlet读取cookie问题
String sessionid = request.getSession().getId(); // 取得当前的session id ckSessionid = new Cookie("s ...
- javascript 关于cookie的操作
<script language=javascript> //获得coolie 的值 function cookie(name){ var cookieArray=document.coo ...