(转)hdu 3436Queue-jumpers--splay+离散化
http://acm.hdu.edu.cn/showproblem.php?pid=3436
题意:初始排列1到N,现在要你实现3种操作:
将x插入到队头去
询问x当前的位置
询问第x个位置上当前是谁.
分析:
下面用SplayTree来实现.不过依然要明白SplayTree提供的是N个房间,第i号房间里放的就是第i个人,各种操作不会变化房间的内容,变得只是房间之间的相对父子关系而已.
SplayTree需要 size,pre,ch 3种信息即可.
首先将1到n建立SPlayTree.
我们将根root节点的右儿子的左儿子位置称为关键位置.
对于top x操作:由于第x个人在x号房间里,先将x号房间旋转到根,删除根,在将最小的节点旋转到根,然后用x号房间替换最小的节点称为根.
对于Query x操作:直接将x+1号房间转到根节点,返回它左子树儿子个数即可.
对于Rank x 操作:直接用Get_Kth即可实现,找到第x+1位置的房间号.
不过这道题的N<=10^8,但是Q<=10^5,所以需要将数据离散化,对于所有top x命令,我们将所有区间离散化,然后依然第i个房间放的是顺序第i个区间,SplayTree的size数组表示节点r为根的树中所有区间包含的整数个数,num数组表示节点r(仅仅r节点)表示的区间所包含的数总数,也就是顺序第r个区间包含的数的总数.
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=+;
int N,Q,T;
int s[maxn],e[maxn],cnt;//表示区间
int p[maxn];//提取出来的单点数
char op[maxn][];//命令
int qnum[maxn];//命令参数
int bin(int x)
{
int l=,r=cnt;
while(l<=r)
{
int mid=(l+r)>>;
if(s[mid]<=x && x<=e[mid])
return mid;
else if(x< s[mid])
r=mid-;
else
l=mid+;
}
return -;
} int size[maxn];
int num[maxn];
int pre[maxn];
int ch[maxn][],root; void Treavel(int x)
{
if(x)
{
Treavel(ch[x][]); printf("节点 %2d: 左儿子 %2d 右儿子 %2d ",x,ch[x][],ch[x][]);
printf("size %2d num %2d pre %2d s %2d e %2d\n",size[x],num[x],pre[x],s[x],e[x]); Treavel(ch[x][]);
}
}
void DeBug()
{
printf("root:%d\n",root);
Treavel(root);
}
void Push_Up(int r)
{
size[r] = size[ch[r][]]+size[ch[r][]]+num[r];
}
void Rotate(int x,int kind)
{
int y=pre[x];
ch[y][kind^] = ch[x][kind];
pre[ch[x][kind]] = y;
if(pre[y])
ch[pre[y]][ch[pre[y]][] == y] = x;
pre[x]=pre[y];
ch[x][kind]=y;
pre[y]=x;
Push_Up(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 kind=ch[pre[y]][] == y;
if(ch[y][kind] == r)
{
Rotate(r,kind^);
Rotate(r,kind);
}
else
{
Rotate(y,kind);
Rotate(r,kind);
}
}
}
Push_Up(r);
if(goal==)
root=r;
}
void New_Node(int &r,int fa,int k)
{
r=k;
num[r]=size[r]=e[k]-s[k]+;
pre[r]=fa;
ch[r][]=ch[r][]=;
}
void Build(int &x,int l,int r,int fa)
{
if(l>r)
return;
int mid=(l+r)>>;
New_Node(x,fa,mid);
Build(ch[x][],l,mid-,x);
Build(ch[x][],mid+,r,x);
Push_Up(x);
}
void init()
{
root=;
pre[root]=;
ch[root][]=ch[root][]=;
size[root]=;
num[root]=;
Build(root,,cnt,);
}
int Get_Min(int r)
{
while(ch[r][]) r=ch[r][];
return r;
} //删除树根
void Delete()
{
if(ch[root][]== || ch[root][]==)
{
root = ch[root][]+ch[root][];
pre[root]=;
return ;
}
int k=Get_Min(ch[root][]);
Splay(k,root);
ch[k][]=ch[root][];
pre[ch[root][]]=k;
root=k;
pre[k]=;
Push_Up(root);
}
void Top(int x)
{
int r=bin(x);
Splay(r,);
Delete();
Splay(Get_Min(root),);
ch[r][]=;
ch[r][]=root;
pre[r]=;
pre[root]=r;
root=r;
Push_Up(r);
}
int Query(int x)
{
int r=bin(x);
Splay(r,);
return size[ch[r][]]+x-s[r]+;
}
int Rank(int x)
{
int r=root;
while()
{
//size[r]我之前写成了N,一直WA
if(size[ch[r][]] < x && size[r]-size[ch[r][]] >= x)
return s[r]-+x-size[ch[r][]];
else if(x<=size[ch[r][]])
r=ch[r][];
else
{
//这里的顺序千万别写反了,而且size[r]我之前写成了N,一直WA
x-=size[r]-size[ch[r][]];
r=ch[r][];
}
}
} //和上面那个Rank函数一样的功能,两个二选一,用一个即可
int Get_Rank(int r,int k)
{
int t = size[ch[r][]];
if(k <= t)
return Get_Rank(ch[r][],k);
else if(k <= t + num[r])
return s[r] + k - t - ;
else
return Get_Rank(ch[r][],k-t-num[r]);
} int main()
{
scanf("%d",&T);
for(int kase=;kase<=T;kase++)
{
scanf("%d%d",&N,&Q); int t=;
for(int i=;i<=Q;i++)
{
scanf("%s%d",op[i],&qnum[i]);
if(op[i][]=='T')
p[t++]=qnum[i];
}
p[t++]=;
p[t++]=N;
sort(p,p+t);
t=unique(p,p+t)-p;
cnt=;
for(int i=;i<t;i++)
{
if(i> && p[i]>p[i-]+)
{
cnt++;
s[cnt]=p[i-]+;
e[cnt]=p[i]-;
}
cnt++;
s[cnt]=e[cnt]=p[i];
}
init();
printf("Case %d:\n",kase);
for(int i=;i<=Q;i++)
{
if(i==)
{
int x=;
int y=;
}
if(op[i][]=='T')
Top(qnum[i]);
else if(op[i][]=='Q')
printf("%d\n",Query(qnum[i]));
else if(op[i][]=='R')
printf("%d\n",Rank(qnum[i]));
}
}
return ;
}
(转)hdu 3436Queue-jumpers--splay+离散化的更多相关文章
- HDU 5862 Counting Intersections(离散化+树状数组)
HDU 5862 Counting Intersections(离散化+树状数组) 题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 D ...
- hdu 5258 数长方形 离散化
数长方形 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5258 Des ...
- hdu 4358 Boring counting 离散化+dfs序+莫队算法
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4358 题意:以1为根节点含有N(N <= 1e5)个结点的树,每个节点有一个权值(weight ...
- HDU 5925 Coconuts 【离散化+BFS】 (2016CCPC东北地区大学生程序设计竞赛)
Coconuts Time Limit: 9000/4500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Su ...
- HDU 3634 City Planning (离散化)
City Planning Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- hdu 4444 Walk (离散化+建图+bfs+三维判重 好题)
Walk Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submi ...
- Coconuts HDU - 5925 (二维离散化求连通块的个数以及大小)
题目链接: D - Coconuts HDU - 5925 题目大意:首先是T组测试样例,然后给你n*m的矩阵,原先矩阵里面都是白色的点,然后再输入k个黑色的点.这k个黑色的点可能会使得原先白色的点 ...
- HDU 5233 Gunner II 离散化
题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5233 bc(中文):http://bestcoder.hdu.edu.cn/contests ...
- hdu 2475 BOX (splay)
版权声明:本文为博主原创文章,未经博主允许不得转载. hdu 2475 Splay树是一种神奇的东西... 题意: 有一些箱子,要么放在地上,要么放在某个箱子里面 . 现在有两种操作: (1) MOV ...
- HDU 4419 Colourful Rectangle --离散化+线段树扫描线
题意: 有三种颜色的矩形n个,不同颜色的矩形重叠会生成不同的颜色,总共有R,G,B,RG,RB,GB,RGB 7种颜色,问7种颜色每种颜色的面积. 解法: 很容易想到线段树扫描线求矩形面积并,但是如何 ...
随机推荐
- SpringMVC环境搭建——HelloWorld
1.新建Maven Web 工程: 2.添加相关的依赖包(Spring MVC.tomcat插件等),具体的pom.xml文件如下 <project xmlns="http://mav ...
- 基本的排序算法C++实现(插入排序,选择排序,冒泡排序,归并排序,快速排序,最大堆排序,希尔排序)
博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/8529525.html特别不喜欢那些随便转载别人的原创文章又不给 ...
- 结构体内嵌比较函数bool operator < (const node &x) const {}
直接看别人的链接 [http://www.cnblogs.com/ZERO-/p/9347296.html]
- 《Linux内核分析》第八周
<Linux内核分析>第八周 PART ONE 知识点总结 一.进程切换的关键代码switch_to 1.进程调度与进程调度的时机 (1)进程分类: I/O型(执行块,频繁) CPU型(大 ...
- sho
手工编程:hello world 全部用命令行工具和Notepad编辑器,用手工创建并编译一个C的命令行程序:hello world. public class Hello{ publ ...
- <构建之法>8,9,10章的读后感
第八章 这一章主要讲的是需求分析,主要介绍在客户需求五花八门的情况下,软件团队如何才能准确而全面地找到这些需求. 第九章 问题:我们现在怎样培养才能成为一名合格的PM呢? 第十章 问题:如果典型用户吴 ...
- SPRINT四则运算(第二天)
1.小组成员: 李豌湄:master 江丹仪:产品负责人 2.现状: a.已经下载APP分析他们的界面.优缺点和闪光点 b.已改进代码添加功能 3.任务认领: 完成任务的第一个模块: a.下载五个类 ...
- sap 最新财报以及云业务转型情况
SAP第四季度收入超预期 加码云转型启动重组计划 http://soft.zhiding.cn/software_zone/2019/0130/3115457.shtml 尽管第四季度超出收入预期,但 ...
- 其他数据库的restful方式
1. mysql 的 xmysql https://blog.csdn.net/dev_csdn/article/details/78480522 2. Oracle 的ORDS https://bl ...
- [日常工作]Oracle12cr2在日常工作中遇到的不兼容的问题
Oracle12c 数据库GS实例时需要使用新驱动,避免制单出现获取不到正确凭证编号内码的问题. Oracle12c 会产生大量的隐藏表,部分ddl语句会报错. Oracle12c 删除了VM_con ...