两个题目都是求区间之内,不重复的数字之和,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 (线段树+离线询问)的更多相关文章

  1. HDU 4417 【线段树+离线处理】

    http://acm.hdu.edu.cn/showproblem.php?pid=4417 题意:找出给定区间内,有多少个数小于等于给定的数.用线段树维护的话会超时,要用到线段树的离线操作,对询问与 ...

  2. HDU 4638-Group(线段树+离线处理)

    题意: 给n个编号,m个查询每个查询l,r,求下标区间[l,r]中能分成标号连续的组数(一组内的标号是连续的) 分析: 我们认为初始,每个标号为一个组(线段树维护区间组数),从左向右扫序列,当前标号, ...

  3. hdu 4288 Coder (线段树+离线)

    题意: 刚开始有一个空集合.有三种操作: 1.往集合中加入一个集合中不存在的数 x 2.从集合中删除一个已经存在的数 x 3.计算集合的digest sum并输出.       digest sum求 ...

  4. 线段树+离线 hdu5654 xiaoxin and his watermelon candy

    传送门:点击打开链接 题意:一个三元组假设满足j=i+1,k=j+1,ai<=aj<=ak,那么就好的.如今告诉你序列.然后Q次询问.每次询问一个区间[l,r],问区间里有多少个三元组满足 ...

  5. 牛客练习赛53 E-老瞎眼pk小鲜肉(思维+线段树+离线)

    前言 听说是线段树离线查询?? 做题做着做着慢慢对离线操作有点感觉了,不过也还没参透,等再做些题目再来讨论离线.在线操作. 这题赛后看代码发现有人用的树状数组,$tql$.当然能用树状数组写的线段树也 ...

  6. hdu 4031 attack 线段树区间更新

    Attack Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others)Total Subm ...

  7. hdu 3016 dp+线段树

    Man Down Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  8. HDU 4417-Super Mario-线段树+离线

    Description Mario is world-famous plumber. His "burly" figure and amazing jumping ability ...

  9. HDU 3333 Turing Tree 线段树+离线处理

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3333 Turing Tree Time Limit: 6000/3000 MS (Java/Othe ...

随机推荐

  1. 对于 APM 用户的一次真实调查分析(下)

    一.前言 对 APM 用户的一次真实调查分析(上)中,我们主要聊到了现阶段国外 APM 行业对各个企业的渗透率.大部分使用 APM 工具的企业规模以及 APM 工具在用户心中的地位等问题,有兴趣的朋友 ...

  2. HDU 1754 I Hate It(线段树)

    点我看题目 题意  :又是一道中问题,我就不说题意了.... 思路 : 线段树,这道题跟1166差不多,改一些地方就差不多了. #include <iostream> #include & ...

  3. [string]Codeforces158C Cd and pwd commands

    题目链接 题意很清楚 和linux的语句是一样的 pwd输出路径 cd进入 ..回上一层目录 此题完全是string的应用 String的用法 vector<string> s; int ...

  4. [topcoder]SmartWordToy

    广度搜索BFS,要用Queue.还不是很熟,这道题帮助理清一些思绪了.其实这道题是求最短路径,所以BFS遇到第一个就可以返回了,所以后面有些现有大小和历史大小的判断可以省却. 过程中拿数组存step还 ...

  5. 到底DAO是什么?为什么要有它的存在?

    Data Access Object   数据访问接口,就是访问数据库方法的 interface 1. DAO用来封装Data Source的..就比如,Connection conn = DAOFa ...

  6. Android USB Host与HID通讯 (一)

    去年9月份来到现在的公司,接到新公司的第一个项目就是Android USB Host与HID通讯,当时也什么都不懂,就拿着google的api 开发指南 (http://developer.andro ...

  7. UAC新解(有非正常手段可以绕过)

    360第一次注册是需要弹,可是以后就不弹了开机自启动不弹框,开机自启动不弹框 服务是system权限再说一句,一般程序也不需要过UAC系统启动项白名单.UAC有一个白名单机制.还有UAC也可以通过wu ...

  8. MyGui 3.2.0(OpenGL平台)的编译(五篇文章)

    MyGui是一个用来创建用户图形界面的库,用于游戏和3D应用程序.这个库的主要目标是达到:快速.灵活.易用. 1.下载准备: 源代码:http://svn.code.sf.net/p/my-gui/c ...

  9. MFC浅析(7) CWnd类虚函数的调用时机、缺省实现

    CWnd类虚函数的调用时机.缺省实现 FMD(http://www.fmdstudio.net) 1. Create 2. PreCreateWindow 3. PreSubclassWindow 4 ...

  10. WCF - Consuming WCF Service

    WCF services allow other applications to access or consume them. A WCF service can be consumed by ma ...