离散化+伸展树。

 /* 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. C#微信公众号开发 -- (五)自定义菜单创建

    公众号中,底部都是有自己定义的功能按钮,通过点击某个按钮来实现指定的业务逻辑操作. 下面就来说说这些按钮是怎样放到微信公众平台的,还是先来看看微信的官方解释: 请注意: 1.自定义菜单最多包括3个一级 ...

  2. EasyUI兼容IE问题

    上网搜了下,发现说明白的解决方案不多,于是记录了一下: 根本原因是JQuery的版本造成IE8及以下兼容的问题,(由于EasyUI是基于JQuery框架的,而JQuery貌似从2013年为了简洁代码, ...

  3. objective-c在Xcode中@property相关参数的解释

    objective-c在其对象拥有成员变量时,我们为了保持代码的封装,会将成员变量设置为@protected,并为成员变量编写setter和getter方法. 如: @interface Person ...

  4. java 环境变量配置

    1.我的电脑 2.属性 3.高级 4.环境变量 5.新建 6.JAVA_HOME: C:\Program Files (x86)\Java 7.CLASSPATH: .;%JAVA_HOME%\;%J ...

  5. JSON.parse 函数应用 (复制备忘)

    JSON.parse 函数 JSON.parse 函数 (JavaScript) 将 JavaScript 对象表示法 (JSON) 字符串转换为对象. 语法 JSON.parse(text [, r ...

  6. scrapy, 自带命令行调用工具.

    #-*- coding:utf-8 -*- from scrapy import cmdline cmdline.execute("scrapy crawl dmoz".split ...

  7. PAT_1040 有几个PAT

    问题描述: 字符串APPAPT中包含了两个单词“PAT”,其中第一个PAT是第2位(P),第4位(A),第6位(T):第二个PAT是第3位(P),第4位(A),第6位(T). 现给定字符串,问一共可以 ...

  8. 颜色空间转换 cvtColor()[OpenCV 笔记13]

    void cvtColor(InputArray src, OutputArray dst, ) src: 输入图像 dst: 输出图像 code: 颜色空间转换标识符 OpenCV2的CV_前缀宏命 ...

  9. 暑假集训(1)第三弹 -----Dungeon Master(Poj2251)

    Description You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is co ...

  10. Q105971:Converting a Regular GUID to a Compressed GUID

    Quote from:  http://flexerasoftware.force.com/articles/en_US/INFO/Q105971 Synopsis   The Windows Ins ...