博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 1890 Robotic Sort splaytree+懒惰标记
阅读量:6243 次
发布时间:2019-06-22

本文共 879 字,大约阅读时间需要 2 分钟。

 给一个长度为N(N<10,000)的数列,每次选取值最小的元素并翻转前面的数列,然后删除这个元素。请在每次操作之前输出这个最小元素的位置。

这里的splay应用是:放弃了元素之间的优先级,完全模拟一个数组(像笛卡尔树那样)
    要解决一些问题:
        1. 如何查找元素最小的元素? 记录最小值? NO! 数列的数组下标和splay的下标是一样的!!!!
        2. 如何翻转一个区间? 先把这个区间“抽”出来,然后在这个区间的代表节点上加一个标记,传递标记的时候就旋转左右子树。
        3. 如何删除节点? 找到节点的前驱与后继,然后通过splay前驱与后继把这个节点“抽”出来。
        4. 如何在向上splay的时候传递懒惰标记? 看我之前一篇题解吧! 在splay之前更新所有的父亲节点!
1 #include 
2 #include
3 #include
4 #include
5 using namespace std; 6 #define inf (1<<29) 7 const int maxn = 100010; 8 int n , splaysz; 9 struct node {10 int p,chd[2],sz,flag;11 node (int P=0) {12 chd[0]=chd[1]=0;sz=0;13 p = P; flag = 0;14 }15 }tree[maxn];16 struct sample {17 int id , v;18 bool operator < (sample b) const {19 return v==b.v?id

 

转载于:https://www.cnblogs.com/tobec/p/3252763.html

你可能感兴趣的文章
Scrum 项目 4.0-5.0-约教网站开发(一)
查看>>
CSS3变形transform 2D初级了解
查看>>
uva 11806 Cheerleaders (容斥)
查看>>
[HAOI2012]音量调节
查看>>
week07 codelab02 C72
查看>>
ubuntu系统备份与还原
查看>>
人无股权不富
查看>>
JavaScript屏蔽Backspace键
查看>>
dom4j的安装
查看>>
graphical Layout调大一点
查看>>
Python中使用lambda函数
查看>>
句柄类的应用中减少重复编译的方法
查看>>
dj cookie与session 2
查看>>
协程和异步io
查看>>
Java流程控制
查看>>
去除重复的邮箱
查看>>
杭电1018-Big Number(大数)
查看>>
java调用com组件将office文件转换成pdf
查看>>
LINQ To SQL在N层应用程序中的CUD操作、批量删除、批量更新
查看>>
JQuery zTree v3.2和demo
查看>>