离散化+伸展树。

 /* 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. Highcharts在IE中不能一次性正常显示的一种解决办法

    由于客户要求必须在IE浏览器下兼容图表,故选用了兼容性较好的Highcharts.另外说一句,博主尝试过ichartjs.ECharts.YUI,兼容性都没有Highcharts给力(所有的兼容性问题 ...

  2. groupBy

    public List groupBy(List list,String flag,String... sortName) throws Exception{ Map<String,List&l ...

  3. ReactNative-----环境搭建(android)

    1.参考文档 http://reactnative.cn/docs/0.26/getting-started.html http://reactnative.cn/docs/0.26/running- ...

  4. 在js中window.open通过“post”传递参数

    在js中window.open通过“post”传递参数的步骤如下: 如:在A.jsp中 有一个js方法 winow.open,目标地址是 xx.do 1.在A.jsp建一个form,把要设置的值通过j ...

  5. 查内网虚拟机映射的公网IP

    1.访问ip138.com 2.curl ifconfig.me

  6. OpenCV(6)-腐蚀和膨胀

    腐蚀和膨胀属于形态学操作. 腐蚀和膨胀 腐蚀是指:将卷积核B滑过图像A,找出卷积核区域内最小像素值作为锚点像素值.这一操作可以扩大低像素值区域. 膨胀是指:将卷积核B滑过图像A,找出卷积核区域内最大像 ...

  7. open()函数

    STDOUT_FILENO            1 标准输入 STDIN_FILENO             0 标准输出 STDERR_FILENO         2 标准错误 在/proc目 ...

  8. 关于学习HTML5中自己犯的错误

    7.1写错了 siblings()这个函数写成了sibling,在jQuery中并没有这个函数的定义 在查找错误的过程中,自己也发现了一个学习jQuery的网站http://www.365mini.c ...

  9. webstorm快捷方式

    刚开始在使用webstrom的时候,不知道快捷方式,感觉自己把webstorm当做记事本使用,真的挺傻的,在朋友的指导下,原来webstorm有快捷方式 一.界面操作 快捷键 说明 ctrl+shif ...

  10. 网站开发常用jQuery插件总结(八)标签编辑插件Tagit

    一.Tagit插件功能 提高网站交互性,增加用户体验.至于其它的功能,还真没有.用一个input text就可以替换了它.但是text没有输入提示功能,而tagit拥有这个功能.官方示例如下图: 将关 ...