Splay初步【bzoj1503】

做了一道水题,把bzoj1503用Splay重新写了一下。

  1 #include <bits/stdc++.h>
  2 #define rep(i, a, b) for (int i = a; i <= b; i++)
  3 #define REP(i, a, b) for (int i = a; i < b; i++)
  4 #define drep(i, a, b) for (int i = a; i >= b; i--)
  5 #define mp make_pair
  6 #define pb push_back
  7 #define clr(x) memset(x, 0, sizeof(x))
  8 #define xx first
  9 #define yy second
 10 using namespace std;
 11 typedef long long i64;
 12 typedef pair<int, int> pii;
 13 const int inf = ~0U >> 1;
 14 const i64 INF = ~0ULL >> 1;
 15 //***************************
 16  
 17 struct node {
 18     node *pre, *s[2];
 19     int key, size, mul;
 20     node() { pre = s[0] = s[1] = 0; size = mul = 1; }
 21     node(int _key) :key(_key) { pre = s[0] = s[1] = 0; size = mul = 1; }
 22     bool getlr() { return pre->s[1] == this; }
 23     node *link(int w, node *p) { s[w] = p; if (p) p->pre = this; return this; }
 24     void update() { size = mul + (s[0] ? s[0]->size : 0) + (s[1] ? s[1]->size : 0); }
 25 } *root;
 26 void rot(node* p) {
 27     node *q = p->pre->pre;
 28     p->getlr() ? p->link(0, p->pre->link(1, p->s[0])) : p->link(1, p->pre->link(0, p->s[1]));
 29     p->pre->update();
 30     if (q) q->link(q->s[1] == p->pre, p);
 31     else { p->pre = 0; root = p; }
 32 }
 33 void splay(node *p, node *tar) {
 34     while (p->pre != tar && p->pre->pre != tar)
 35         p->getlr() == p->pre->getlr() ? (rot(p->pre), rot(p)) : (rot(p), rot(p));
 36     if (p->pre) rot(p);
 37     p->update();
 38 }
 39 void insrt(int k) {
 40     node *p = root, *q = NULL;
 41     while (p) {
 42         q = p; 
 43         if (k > p->key) p = p->s[1];
 44         else if (k < p->key) p = p->s[0];
 45         else break;
 46     }
 47     if (!p) {p = new node(k);
 48         if (!q) { root = p; return; }
 49         q->link(q->key < k, p); q->update(); splay(p, 0);
 50     }
 51     else { p->mul++; splay(p, 0); }
 52 }
 53 node *findkth(int x) {
 54     node *p = root;
 55     node *t;
 56     while (1) {
 57         int w = (p->s[0] ? p->s[0]->size : 0);
 58         if (x <= w) t = p->s[0];
 59         else if (x > w + p->mul) { x -= w + p->mul; t = p->s[1]; }
 60         else break;
 61         p = t;
 62     }
 63     splay(p, 0); return p;
 64 }
 65  
 66 node *find(node *p, int x) {
 67     if (p->key < x) return find(p->s[1], x);
 68     else if (p->key > x) return find(p->s[0], x);
 69     else return p;
 70 }
 71  
 72 int main() {
 73     int ori(0);
 74     int n, m;
 75     scanf("%d%d", &n, &m);
 76     int tot(0);
 77     char op[5]; int x;
 78     while (n--) {
 79         scanf("%s%d", op, &x);
 80         if (op[0] == 'I') {
 81             if (x >= m) {
 82                 ori++;
 83                 insrt(x - tot);
 84             }
 85         }
 86         else if (op[0] == 'A') tot += x;
 87         else if (op[0] == 'S') {
 88             tot -= x;
 89             insrt(m - tot - 1);
 90             splay(find(root, m - tot - 1), 0);
 91             root = root->s[1];
 92             if (root) root->pre = 0;
 93         }
 94         else if (op[0] == 'F') {
 95             if (!root || x > root->size) puts("-1");
 96             else printf("%d\n", findkth(root->size - x + 1)->key + tot);
 97         }
 98     }
 99     printf("%d\n", ori - (root ? root->size : 0));
100     return 0;
101 }
View Code

 

转载于:https://www.cnblogs.com/y7070/p/5018974.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/471339.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

原生html5时间组件,JFinal遇到了原生Html5时间组件格式转换问题怎么处理?

今天JBolt种子用户群里有人提问&#xff0c;JFinal针对原生Html5的日期时间选择组件的格式转换支持有问题&#xff0c;报错。于是我在JBolt的Demo中加入了这些去测试一下&#xff0c;这里使用的都是原生Html组件。Input type“text”默认就是一个简单的单行文本输入框。如果修改…

LeetCode 2131. 连接两字母单词得到的最长回文串

文章目录1. 题目2. 解题1. 题目 给你一个字符串数组 words 。words 中每个元素都是一个包含 两个 小写英文字母的单词。 请你从 words 中选择一些元素并按 任意顺序 连接它们&#xff0c;并得到一个 尽可能长的回文串 。每个元素 至多 只能使用一次。 请你返回你能得到的最长…

LeetCode 2132. 用邮票贴满网格图(DP/二维差分)

文章目录1. 题目2. 解题1. 题目 给你一个 m x n 的二进制矩阵 grid &#xff0c;每个格子要么为 0 &#xff08;空&#xff09;要么为 1 &#xff08;被占据&#xff09;。 给你邮票的尺寸为 stampHeight x stampWidth 。我们想将邮票贴进二进制矩阵中&#xff0c;且满足以下…

blue html中转换,BlueFox Free PDF to HTML Converter(PDF文件转换软件)

BlueFox Free PDF to HTML Converter是一款pdf文件转换软件&#xff0c;能直接查看PDF文件和对PDF文件进行编辑&#xff0c;支持批量进行转换&#xff0c;使用非常方便&#xff0c;操作简单&#xff0c;有需要可以下载。软件特色通过将PDF转换为HTML网页&#xff0c;您的网站访…

二、前端pink老师的CSS定位学习笔记(超详细,简单易懂)

定位(position) 1. CSS 布局的三种机制 网页布局的核心 —— 就是用 CSS 来摆放盒子位置。 CSS 提供了 3 种机制来设置盒子的摆放位置&#xff0c;分别是普通流、浮动和定位&#xff0c;其中&#xff1a; 普通流&#xff08;标准流&#xff09; 浮动 让盒子从普通流中浮起来 …

LeetCode 2133. 检查是否每一行每一列都包含全部整数

文章目录1. 题目2. 解题1. 题目 对一个大小为 n x n 的矩阵而言&#xff0c;如果其每一行和每一列都包含从 1 到 n 的 全部 整数&#xff08;含 1 和 n&#xff09;&#xff0c;则认为该矩阵是一个 有效 矩阵。 给你一个大小为 n x n 的整数矩阵 matrix &#xff0c;请你判断…

上传图片自动加水印html,html5上传多个文件并添加水印 实例源码

【实例简介】【实例截图】【核心代码】html5上传多个文件并添加水印body{font-size:12px;}a{text-decoration:none;}a,a:after{-webkit-transition:all 0.3s;-moz-transition:all 0.3s;transition:all 0.3s;}a.btn i{display:block;width:100%;height:100%;position:relative;z…

LoadRunner培训初级教程

一 LoadRunner简介 1.1 Loadrunner介绍 LoadRunner 是 HP Mercury Interactive用来测试应用程序性能的工具 LoadRunner 通过模拟一个多用户并行工作的环境来对应用程序进行负载测试。通过使用最少的硬件资源&#xff0c;这些虚拟用户提供一致的、可重复并可度量的负载&#xf…

android model 设计,Android model层设计

model层在开发app的过程中&#xff0c;不管是使用了mvp还是mvc甚至mvvm模式,model层的设计基本都是一样的&#xff0c;model层可以被称为数据层&#xff0c;它的主要任务就是为上层提供各种的数据服务&#xff0c;上层完全不需要关心这些数据是来自网络&#xff0c;还是内存&am…

LeetCode 2134. 最少交换次数来组合所有的 1 II(数组*2 + 滑动窗口)

文章目录1. 题目2. 解题1. 题目 交换 定义为选中一个数组中的两个 互不相同 的位置并交换二者的值。 环形 数组是一个数组&#xff0c;可以认为 第一个 元素和 最后一个 元素 相邻 。 给你一个 二进制环形 数组 nums &#xff0c;返回在 任意位置 将数组中的所有 1 聚集在一…

四、pink老师的学习笔记——元素的显示与隐藏

1. 元素的显示与隐藏 目的 让一个元素在页面中消失或者显示出来 场景 类似网站广告&#xff0c;当我们点击关闭就不见了&#xff0c;但是我们重新刷新页面&#xff0c;会重新出现&#xff01; 1.1 display 显示&#xff08;重点&#xff09; display 设置或检索对象是否及如…

SpringMVC详解

来源&#xff1a;Sunnier&#xff08;http://www.admin10000.com/document/6436.html&#xff09; 一、SpringMVC基础入门&#xff0c;创建一个HelloWorld程序 1.首先&#xff0c;导入SpringMVC需要的jar包。 2.添加Web.xml配置文件中关于SpringMVC的配置 12345678910111213141…

LeetCode 2135. 统计追加字母可以获得的单词数(位运算+哈希)

文章目录1. 题目2. 解题1. 题目 给你两个下标从 0 开始的字符串数组 startWords 和 targetWords 。每个字符串都仅由 小写英文字母 组成。 对于 targetWords 中的每个字符串&#xff0c;检查是否能够从 startWords 中选出一个字符串&#xff0c;执行一次 转换操作 &#xff0…

五、pink老师的学习笔记——CSS精灵技术(sprite)

5. CSS精灵技术&#xff08;sprite) 重点 5.1 为什么需要精灵技术 图所示为网页的请求原理图&#xff0c;当用户访问一个网站时&#xff0c;需要向服务器发送请求&#xff0c;网页上的每张图像都要经过一次请求才能展现给用户。 然而&#xff0c;一个网页中往往会应用很多小的…

Javadoc的Html文件传输chm

&#xfeff;&#xfeff;Javadoc的Html文件转chm 工具下载地址&#xff1a;http://msdn.microsoft.com/en-us/library/ms669985.aspx 两篇相关文章&#xff1a; MyEclipse生成javadoc文档http://blog.csdn.net/kakarot5/article/details/40683837 Java凝视总结http://blog.csd…

六、pink老师学习笔记——CSS三角形之美 margin负值之美文字围绕浮动元素行内块元素布局的巧妙运用

7. 拓展 7.1 margin负值之美 1). 负边距定位&#xff1a;水平垂直居中 咱们前面讲过&#xff0c; 一个绝对定位的盒子&#xff0c; 利用 父级盒子的 50%&#xff0c; 然后 往左(上) 走 自己宽度的一半 &#xff0c;可以实现盒子水平垂直居中。 2). 压住盒子相邻边框 上图第…

LeetCode 2136. 全部开花的最早一天(贪心)

文章目录1. 题目2. 解题1. 题目 你有 n 枚花的种子。每枚种子必须先种下&#xff0c;才能开始生长、开花。播种需要时间&#xff0c;种子的生长也是如此。给你两个下标从 0 开始的整数数组 plantTime 和 growTime &#xff0c;每个数组的长度都是 n &#xff1a; plantTime[i…

html悬浮窗口退出,网页中可关闭的漂浮窗口实现

注释部分为广告的左右调节&#xff0c;可以自行设定网页中可关闭的漂浮窗口关闭点击这里&#xff0c;关闭广告&#xff01;&#xff01;&#xff01;var bodyfrm ( document.compatMode.toLowerCase()"css1compat" ) ? document.documentElement : document.body;v…

pycharm profile对函数调用效率进行测试

假设有如下代码&#xff1a; def func1():for i in range(1000):print("i love python")def func2():for i in range(10):print("i love c")func3()def func3():for i in range(100):print("i love java")def main():func1()func2()if __name__…

八、pink老师的学习笔记—— CSS用户界面样式(鼠标样式、轮廓线、防止拖拽文本域)

2. CSS用户界面样式 所谓的界面样式&#xff0c; 就是更改一些用户操作样式&#xff0c;以便提高更好的用户体验。 更改用户的鼠标样式 (滚动条因为兼容性非常差&#xff0c;我们不研究)表单轮廓等。防止表单域拖拽 2.1 鼠标样式cursor 设置或检索在对象上移动的鼠标指针采…