离散化+伸展树。

 /* 3436 */
#include <iostream>
#include <string>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#include <deque>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstring>
#include <climits>
#include <cctype>
#include <cassert>
#include <functional>
#include <iterator>
#include <iomanip>
using namespace std;
//#pragma comment(linker,"/STACK:102400000,1024000") #define sti set<int>
#define stpii set<pair<int, int> >
#define mpii map<int,int>
#define vi vector<int>
#define pii pair<int,int>
#define vpii vector<pair<int,int> >
#define rep(i, a, n) for (int i=a;i<n;++i)
#define per(i, a, n) for (int i=n-1;i>=a;--i)
#define clr clear
#define pb push_back
#define mp make_pair
#define fir first
#define sec second
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
#define lson l, mid, rt<<1
#define rson mid+1, r, rt<<1|1
#define grandlson ch[ch[root][1]][0] typedef struct {
char c;
int x;
} Cmd; const int maxq = 1e5+;
const int maxn = 3e5+;
int pre[maxn], ch[maxn][], s[maxn], key[maxn], pos[maxn];
int arr[maxn], cnt[maxn];
int b[maxn], e[maxn];
int tot, root, n, m;
Cmd cmd[maxq]; int search(int x) {
int l = , r = m - , mid;
int ret = -; while (l <= r) {
mid = (l + r) >> ;
if (b[mid]<=x && x<=e[mid])
return mid;
if (e[mid] < x) {
l = mid + ;
} else {
r = mid - ;
}
} return ret;
} void newNode(int& r, int k, int fa) {
r = tot++;
pre[r] = fa;
ch[r][] = ch[r][] = ;
key[r] = k;
pos[k] = r;
s[r] = cnt[r] = e[k] - b[k] + ;
} void PushUp(int r) {
s[r] = s[ch[r][]] + s[ch[r][]] + cnt[r];
} void Build(int& rt, int l, int r, int fa) {
if (l > r) return; int mid = (l + r) >>; newNode(rt, mid, fa);
Build(ch[rt][], l, mid-, rt);
Build(ch[rt][], mid+, r, rt);
PushUp(rt);
} void Rotate(int x, int d) {
int y = pre[x];
ch[y][d^] = ch[x][d];
pre[ch[x][d]] = y;
if (pre[y])
ch[pre[y]][ch[pre[y]][]==y] = x;
pre[x] = pre[y];
ch[x][d] = y;
pre[y] = x;
PushUp(y);
} void Splay(int r, int goal) {
while (pre[r] != goal) {
if (pre[pre[r]] == goal) {
Rotate(r, ch[pre[r]][]==r);
} else {
int y = pre[r];
int d = (ch[pre[y]][] == y);
if (ch[y][d] == r) {
Rotate(r, d^);
Rotate(r, d);
} else {
Rotate(y, d);
Rotate(r, d);
}
}
}
PushUp(r);
if (goal == )
root = r;
} void Insert(int& r, int k, int fa) {
if (r == ) {
newNode(r, k, fa);
return ;
}
Insert(ch[r][], k, r);
PushUp(r);
} int getMin(int r) {
while (ch[r][]) {
r = ch[r][];
}
return r;
} int kth(int r, int k) {
int sz = s[ch[r][]]; if (k <= sz)
return kth(ch[r][], k);
else if (k <= sz+cnt[r])
return b[key[r]] + k - sz - ;
else
return kth(ch[r][], k-sz-cnt[r]);
} int Rank(int x) {
return kth(root, x);
} int Query(int x) {
int k = search(x);
int p = pos[k]; Splay(p, );
return s[ch[root][]] + ;
} void Delete() {
int k = getMin(ch[root][]); Splay(k, root);
ch[ch[root][]][] = ch[root][];
root = ch[root][];
pre[ch[root][]] = root;
pre[root] = ;
PushUp(root);
} void top(int x) {
int k = search(x);
int p = pos[k]; Splay(p, );
if (ch[root][]== || ch[root][]==) {
root = ch[root][] + ch[root][];
pre[root] = ;
} else {
Delete();
}
Insert(root, k, );
Splay(pos[k], );
} void inorder(int rt) {
if (rt == ) return ; inorder(ch[rt][]);
printf("rt = %2d: lson = %2d, rson = %2d, fa = %2d, size = %2d, key = %2d, num = %2d \n",
rt, ch[rt][], ch[rt][], pre[rt], s[rt], key[rt], cnt[rt]);
inorder(ch[rt][]);
} void init() {
root = tot = ;
ch[root][] = ch[root][] = s[root] = pre[root] = cnt[root] = key[root] = ;
tot = ;
Build(root, , m-, );
#ifndef ONLINE_JUDGE
// inorder(root);
#endif
} int main() {
ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif int t, q;
int l, x;
int ans;
char event[]; scanf("%d", &t);
rep(tt, , t+) {
printf("Case %d:\n", tt);
scanf("%d %d", &n, &q);
l = ;
arr[l++] = ;
rep(i, , q) {
scanf("%s %d", event, &cmd[i].x);
if (event[] != 'R')
arr[l++] = cmd[i].x;
cmd[i].c = event[];
}
arr[l++] = n;
sort(arr, arr+l); m = ;
rep(i, , l) {
if (arr[i] != arr[i-]) {
if (arr[i]-arr[i-] > ) {
b[m] = arr[i-] + ;
e[m] = arr[i] - ;
++m;
}
b[m] = e[m] = arr[i];
++m;
}
} init();
rep(i, , q) {
if (cmd[i].c == 'T') {
top(cmd[i].x);
} else if (cmd[i].c == 'Q') {
ans = Query(cmd[i].x);
printf("%d\n", ans);
} else {
ans = Rank(cmd[i].x);
printf("%d\n", ans);
}
#ifndef ONLINE_JUDGE
printf("iteration [%d]:\n", i);
inorder(root);
#endif
}
} #ifndef ONLINE_JUDGE
printf("time = %d.\n", (int)clock());
#endif return ;
}

【HDOJ】3436 Queue-jumpers的更多相关文章

  1. 【POJ3481】【splay】Double Queue

    Description The new founded Balkan Investment Group Bank (BIG-Bank) opened a new office in Bucharest ...

  2. 【LeetCode】队列 queue(共8题)

    [346]Moving Average from Data Stream [353]Design Snake Game [363]Max Sum of Rectangle No Larger Than ...

  3. 【HDOJ】【3415】Max Sum of Max-K-sub-sequence

    DP/单调队列优化 呃……环形链求最大k子段和. 首先拆环为链求前缀和…… 然后单调队列吧<_<,裸题没啥好说的…… WA:为毛手写队列就会挂,必须用STL的deque?(写挂自己弱……s ...

  4. 【HDOJ】1297 Children’s Queue

    递推,最近发现自己做递推的题总是没有思路.下周多练习.对于f(n)可以在第n个位置为男生,此时共有f(n-1)种情况:若在第n个位置为女生,因此第n-1个位置也必须为女生.此时有两种情况,一种情况是在 ...

  5. 【HDOJ】1908 Double Queue

    双端队列+二分. #include <cstdio> #define MAXN 1000005 typedef struct { int id; int p; } node_st; nod ...

  6. 【HDOJ】4729 An Easy Problem for Elfness

    其实是求树上的路径间的数据第K大的题目.果断主席树 + LCA.初始流量是这条路径上的最小值.若a<=b,显然直接为s->t建立pipe可以使流量最优:否则,对[0, 10**4]二分得到 ...

  7. 【HDOJ】【3530】Subsequence

    DP/单调队列优化 题解:http://www.cnblogs.com/yymore/archive/2011/06/22/2087553.html 引用: 首先我们要明确几件事情 1.假设我们现在知 ...

  8. 【HDOJ】5632 Rikka with Array

    1. 题目描述$A[i]$表示二级制表示的$i$的数字之和.求$1 \le i < j \le n$并且$A[i]>A[j]$的$(i,j)$的总对数. 2. 基本思路$n \le 10^ ...

  9. 【HDOJ】4579 Random Walk

    1. 题目描述一个人沿着一条长度为n个链行走,给出了每秒钟由i到j的概率($i,j \in [1,n]$).求从1开始走到n个时间的期望. 2. 基本思路显然是个DP.公式推导也相当容易.不妨设$dp ...

随机推荐

  1. html-----007

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. 将表单数据转化为json数据

    /** * 将Form表单转成符合后台要求的json格式数据 * @param frm form表单Id * * @return json格式的数据 */function getFormJson(fr ...

  3. Mysql笔记【3】-SQL约束

    SQL 约束 约束用于限制加入表的数据的类型. 可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句). 我们将主要探讨以下几种约 ...

  4. ubuntu svn安装测试

    本机环境 :ubuntu 12.4 LTS desktop 1 sudo apt-get install  subversion  #安装svn 2  sudo mkdir   /home/lzj/s ...

  5. 【收集整理】Linux下的目录讲解

    Linux下的目录介绍:在Linux系统中,一切东西都是存放在一个唯一的“虚拟文件系统”中的,这个“虚拟文件系统”是树状的结构以一个根目录开始.以文件来表示所有逻辑实体和非逻辑实体,逻辑实体指文件和目 ...

  6. [CLR VIA C#] chapter2 building,packaging,deploying, and administering

    今天整理一下 assembly, 总感觉第一章 到 第三章 没怎么仔细看, 导致后面作者说前面说过的, 我就心里不舒服, 前面3章很干很涩, 好好啃啃, 先作一些简单笔记, 最后再来 整体整理, 反正 ...

  7. php访问控制

    访问控制 访问控制通过关键字public,protected和private来实现.被定义为公有的类成员可以在任何地方被访问.被定义为受保护的类成员则可以被其自身以及其子类和父类访问.被定义为私有的类 ...

  8. YII2数据库操作出现类似Database Exception – yii\db\Exception SQLSTATE

    yii2安装后,连接数据库,必须要安装pdo_mysql扩展

  9. php缓存相关

    在php运行期间,php引擎要对php源码进行处理,(词法分析,语法分析等)然后生成opcode. 然后再运行.在这个阶段可以把opcode缓存起来,当下次需要运行这段程序的时候,就避免了再次 进行词 ...

  10. Activity与WindowManagerService服务的连接过程分析

    Activity组件与WindowManagerService服务之间的连接模型如下图所示: 1. Activity组件 -> WindowManagerService的连接 Activity会 ...