离散化+伸展树。

 /* 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. SqlServer2008误操作数据(delete或者update)后恢复数据

    实际工作中,有时会直接在数据库中操作数据,比如对数据进行delete或者update操作,当进行这些操作的时候,如果没有加上where条件或者where条件不合理,那么导致的结果可想而知,如果操作的又 ...

  2. _In_ 是什么意思

    函数参数类型前 _In_代表什么     在visual C++中属于SAL批注,是为了编译系统在分析代码时发现缺陷用的   表示是一个输入参数.可以定义一个_In_的宏,这个宏什么都不做, 就是形如 ...

  3. 各种排序算法及c语言实现

    插入排序O(n^2) 冒泡排序 O(n^2) 选择排序 O(n^2) 快速排序 O(n log n) 堆排序 O(n log n) 归并排序 O(n log n) 希尔排序 O(n^1.25) 1.插 ...

  4. 漫话JavaScript与异步·第一话——异步:何处惹尘埃

    自JavaScript诞生之日起,频繁与异步打交道便是这门语言的使命,并为此衍生出了许多设计和理念.因此,深入理解异步的概念对于前端工程师来说极为重要. 什么是异步? 程序是分"块" ...

  5. Leaflet交流

    GIS科研网 Leaflet交流 谢绝转载 http://www.3sbase.com欢迎加群交流  108299288 http://www.3sbase.com/3sbase/webgistest ...

  6. Linux系统的启动流程以及做个小小的Linux

    内核的作用     进程管理:进程间切换     内存管理:内存空间分割为内核空间和用户空间     IO管理:对底层硬件的使用必须由内来实现,不能由用户空间进程来实现     文件系统管理     ...

  7. JavaWeb用户登录功能的实现

    大四快毕业了,3年多的时间中,乱七八糟得学了一大堆,想趁找工作之前把所学的东西整理一遍,所以就尝试着做一个完整的JavaWeb系统,这几天试着做了一个用户登录的功能,分享给大家,肯定有很多不完善的地方 ...

  8. absolute独立使用之下拉框最佳实践

              说明:传统的做法是给外部盒子relative定位,再给弹出框absolute定位,而这里我们将absolute独立使用 html <div class="searc ...

  9. jQuery插件综合应用(一)注册

    一.介绍 注册和登录是每个稍微有点规模的网站就应该有的功能.登陆功能与注册功能类似,也比注册功能要简单些.所以本文就以注册来说明jQuery插件的应用. jQuery插件的使用非常简单,如果只按照jQ ...

  10. 『奇葩问题集锦』Cannot find module 'webpack/lib/node/NodeTemplatePlugin'

    第一步:npm config get prefix ,获取输出path“C:\Users\jaxGu\AppData\Roaming\npm”加上"\node_modules"用于 ...