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 ...
随机推荐
- 10个基于 Ruby on Rails 构建的顶级站点
本文系国内 ITOM 行业领军企业 OneAPM 工程师翻译整理自 Raviraj Hegde 的文章 Top Sites Built with Ruby on Rails. 就其本身而言,Ruby ...
- 中国海洋大学第四届朗讯杯高级组 A Rocky
http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2718&cid=1203 题意:给你一个m乘n的格子阵,从一边进去,直线往前走,如果前边有 ...
- 增加Android可用内存
In the development of TV applications, especially when dealing with images were more likely to feel ...
- Percona Xtrabackup备份mysql全库及指定数据库(完整备份与增量备份)
原文地址:http://www.tuicool.com/articles/RZRnq2 Xtrabackup简介 Percona XtraBackup是开源免费的MySQL数据库热备份软件,它能对In ...
- easyui源码翻译1.32--TreeGrid(树形表格)
前言 扩展自$.fn.datagrid.defaults.使用$.fn.treegrid.defaults重写默认值对象.下载该插件翻译源码 树形表格用于显示分层数据表格.它是基于数据表格.组合树控件 ...
- CSS学习笔记——定位position属性的学习
今天学习之前剩下的一个问题:CSS的position属性.首先归纳出和position相关的问题: position作为一个属性,它一共有哪几个属性值? position常用的属性值有哪几个?分别有什 ...
- JS中document.createElement()用法及注意事项
今天处理了一个日期选择器的ie和ff的兼容问题,本来这种情况就很难找错误,找了好久才把错误定位到js中创建元素的方法document.createElement(),这个方法在ie下支持这样创建元素 ...
- GPIO
一.什么是GPIO? 首先应该理解什么是GPIO.GPIO,英文全称为General-Purpose IO ports,也就是通用IO口.在嵌入式系统中常常有数量众多,但是结构却比较简单的 ...
- C# 日期转换为中文大写
/// <summary> /// 日期转换为中文大写 /// </summary> public class UpperConvert { public UpperConve ...
- Git branch (分支学习)
以前总结的一些git操作,分享在这里. Git 保存的不是文件差异或者变化量,而只是一系列文件快照. - 列出当前所有分支 git branch <--merge> | <--n ...