离散化+伸展树。

 /* 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. Asp.Net alert弹出提示信息的5种方法

    1.ClientScript.RegisterStartupScript(GetType(),"message","<script>alert('第一种方式, ...

  2. ios NSMethodSignature and NSInvocation 消息转发

    1.首先获取消息转发时连个函数内部具体内容 MARK:这里是拿[@"xxxxx" length]调用拿来举例说明 (lldb) po signature <NSMethodS ...

  3. 如何诊断oracle数据库运行缓慢或hang住的问题

    为了诊断oracle运行缓慢的问题首先要决定收集哪些论断信息,可以采取下面的诊断方法:1.数据库运行缓慢这个问题是常见还是在特定时间出现如果数据库运行缓慢是一个常见的问题那么可以在问题出现的时候收集这 ...

  4. Oracle 递归函数与等级

    --基数数据1 SELECT ID, mt.materialtypename, mt.parenttypeid FROM material_type mt; 使用递归还是与LEVEL 1 SELECT ...

  5. Ext.Net学习笔记09:Ext.Net Store的用法

    使用Handler处理分页 首先来创建一般处理程序,我命名为StoreHandler.ashx,然后它的处理过程代码如下: public void ProcessRequest(HttpContext ...

  6. UIView的frame和bounds区别

    UIView的frame和bounds区别 iOS中,大家肯定对view和frame都不陌生,我们设置view在父view中的位置和大小时,只需要设置frame就可以了. 可能大家也有查过网上的一些资 ...

  7. c#泛型方法重载

    这里存在普通的方法Foo和泛型方法Foo,如果直接调用: 则会自动优先匹配对应的非泛型方法.输出如下: 但需要注意的是,这一匹配过程是在编译过程进行的,所以如果是通过其它泛型间接调用.则只会调用对应的 ...

  8. 10.26_地图应用, OSC_doc文档集合,node-webkit

    (1)地图:关于电子地图的加载.展示方式,知乎上有篇文章写的很好:http://www.zhihu.com/question/21530085对于地图的导航距离计算呢?原理是什么? (2)node-w ...

  9. Linux下的另一个词典GoldenDict

    以前一直在用statdict,突然发现了一个好用的东西Goldendict. 转载丁香园上一篇文章:http://www.dxy.cn/bbs/topic/20455142 Goldendict 话说 ...

  10. HDU 5351 MZL's Border (规律,大数)

    [HDU 5351 MZL's Border]题意 定义字符串$f_1=b,f_2=a,f_i=f_{i-1}f_{i-2}$. 对$f_n$的长度为$m$的前缀$s$, 求最大的$k$满足$s[1] ...