树状数组这个真心想了好久,还是没想出来 %%% www.cppblog.com/Yuan/archive/2010/08/18/123871.html

树状数组求前缀和大于等于k的最大值,第一次看到这种方法,很神奇,就是没看懂= =

二分也是可以求的,不过感觉会慢一些……

思路就是把所有没有询问到的数压缩

例如如果n等于10 值询问到了 2, 7 大概是这样的

【1,2】【3,4,5,6,7】【8,9,10】

  1                2                          3

分成3块,最多分为q块,实现离散化。

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std; const int N = ;
int op[N], a[N], b[N], p[N], no[N];
int n, q; struct BIT {
int arr[N];
int n;
int sum(int p) {
int ans = ;
while (p) {
ans += arr[p];
p -= lowbit(p);
}
return ans;
}
void add(int p, int v) {
while (p <= n) {
arr[p] += v;
p += lowbit(p);
}
}
int find(int k) { //在数组中找第一个大于等于k的位置
int pos = , cnt = ;
for (int i = ; i >= ; --i) {
pos += (<<i);
if (pos >= n || cnt + arr[pos] >= k) pos -= (<<i);
else cnt += arr[pos];
}
return pos+;
}
void init(int n) {
this->n = n;
memset(arr, , sizeof arr);
}
int lowbit(int x) {
return x&-x;
}
} bit; int main()
{
//freopen("in.txt", "r", stdin);
int T, cas = ;
scanf("%d", &T);
while (T--) {
printf("Case %d:\n", ++cas);
scanf("%d%d", &n, &q);
char ch[];
int idx = ;
for (int i = ; i <= q; ++i) {
scanf("%s%d", ch, &a[i]);
if (*ch == 'T') op[i] = ;
else if (*ch == 'Q') op[i] = ;
else op[i] = ;
if (op[i] < ) b[++idx] = a[i];
}
b[++idx] = n;
sort(b+, b++idx);
n = unique(b+, b++idx) - b - ;
bit.init(*q);
for (int i = ; i <= n; ++i) {
bit.add(q+i, b[i]-b[i-]);
no[q+i] = b[i]; // no[i] 数组i处的编号 原编号!!
p[i] = q+i; // p[i] 编号为i的位置
}
int top = q;
for (int i = ; i <= q; ++i) {
if (op[i] == ) {
int x = lower_bound(b+, b++n, a[i]) - b;
bit.add(p[x], -); // 要把x挪到顶端 p[x]位置的数字个数减少一个
no[p[x]]--; // x走了 剩下的是x-1
p[x] = top; // x的位置变成了top
bit.add(top, ); // top位置有一个数字x +1
no[top] = a[i];
top--;
} else if (op[i] == ) {
int x = lower_bound(b+, b++n, a[i]) - b;
printf("%d\n", bit.sum( p[ x ] ));
} else {
int pos = bit.find(a[i]);
int sp = bit.sum(pos);
if (sp == a[i]) printf("%d\n", no[pos]);
else printf("%d\n", no[pos]-(sp-a[i]));
}
}
}
return ;
}

Splay 再补……

HDU 3436--Queue-jumpers (树状数组 or Splay Tree)的更多相关文章

  1. HDU 1541.Stars-一维树状数组(详解)

    树状数组,学长很早之前讲过,最近才重视起来,enmmmm... 树状数组(Binary Indexed Tree(B.I.T), Fenwick Tree)是一个查询和修改复杂度都为log(n)的数据 ...

  2. HDU - 1541 Stars 【树状数组】

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1541 题意 求每个等级的星星有多少个 当前这个星星的左下角 有多少个 星星 它的等级就是多少 和它同一 ...

  3. HDU 3333 | Codeforces 703D 树状数组、离散化

    HDU 3333:http://acm.hdu.edu.cn/showproblem.php?pid=3333 这两个题是类似的,都是离线处理查询,对每次查询的区间的右端点进行排序.这里我们需要离散化 ...

  4. hdu-5493 Queue(二分+树状数组)

    题目链接: Queue Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  5. hdu 4267 多维树状数组

    题意:有一个序列 "1 a b k c" means adding c to each of Ai which satisfies a <= i <= b and (i ...

  6. HDU 4777 Rabbit Kingdom 树状数组

    分析:找到每一个点的左边离他最近的不互质数,记录下标(L数组),右边一样如此(R数组),预处理 这个过程需要分解质因数O(n*sqrt(n)) 然后离线,按照区间右端点排序 然后扫一遍,对于当前拍好顺 ...

  7. HDU 6348 序列计数 (树状数组 + DP)

    序列计数 Time Limit: 4500/4000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Subm ...

  8. HDU 4325 Flowers(树状数组+离散化)

    http://acm.hdu.edu.cn/showproblem.php?pid=4325 题意:给出n个区间和m个询问,每个询问为一个x,问有多少个区间包含了x. 思路: 因为数据量比较多,所以需 ...

  9. hdu 5775 Bubble Sort 树状数组

    Bubble Sort 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5775 Description P is a permutation of t ...

随机推荐

  1. c/c++ define用法

    define,无参宏定义的一般形式为:#define 标识符 字符串 外文名 define 词条范围 计算机专业用语 无参一般形式 #define 标识符 字符串 带参一般形式 #define 宏名( ...

  2. 分析函数调用关系图(call graph)的几种方法

    绘制函数调用关系图对理解大型程序大有帮助.我想大家都有过一边读源码(并在头脑中维护一个调用栈),一边在纸上画函数调用关系,然后整理成图的经历.如果运气好一点,借助调试器的单步跟踪功能和call sta ...

  3. javascript数据变量类型判断(JS变量是否是数组,是否是函数的判断)

    function isArray(o) { return Object.prototype.toString.apply(o) === “[object Array]”;}function isFun ...

  4. Maven学习总结(四)——Maven核心概念

    一.Maven坐标 1.1.什么是坐标? 在平面几何中坐标(x,y)可以标识平面中唯一的一点. 1.2.Maven坐标主要组成 groupId:组织标识(包名) artifactId:项目名称 ver ...

  5. POJ2533——Longest Ordered Subsequence(简单的DP)

    Longest Ordered Subsequence DescriptionA numeric sequence of ai is ordered if a1 < a2 < ... &l ...

  6. Flash Media Server 5.0 (FMS)注册码

    flash media server 4.5 及最新 flash media server 5.0 注册码 防止图片打不开时: Name:tam/CORE Serial:1652-5580-8001- ...

  7. 1019.Line Painting(线段树 离散化)

    1019 离散化都忘记怎么写了 注意两个端点 离散化后用线段树更新区间 混色为-1  黑为2  白为1  因为N不大 最后直接循环标记这一段的颜色查找 #include <iostream> ...

  8. 基于邻接矩阵的深度优先搜索(DFS)

    题目:http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2107&cid=1186 #include<stdio.h> #incl ...

  9. 西南科技大学第十届ACM程序设计竞赛题解

    A.德州扑克 B. 我恨11(1089) 问题描述 11是一个孤独的数字,小明十分讨厌这个数字,因此如果哪个数字中出现了11或者该数字是11的倍数,他同样讨厌这个数字.现在问题来了,在闭区间[L,R] ...

  10. Wiz开发 定时器的使用与处理

    这只是一些代码片段,由于Wiz开发的资料实在不多,而且内容都不够新. 这里的代码主要参考Tools.Timer这个插件,但是由于内部实现的很多变化,Tools.Timer这个插件基本上已经无法使用了. ...