http://codevs.cn/problem/1343/

题解:

本题splay基本操作:

1.如果是左跳,比如从 x 左跳到 y,就相当于查询 [ y, x ) 区间的最大值,那么就把 y-1 伸展到根,把 x 伸展到根的右节点,那么根的右节点的左节点对应的就是这段区间。

1.如果是右跳,比如从 x 右跳到 y,就相当于查询 ( x, y ] 区间的最大值,那么就把 x 伸展到根,把 y+1 伸展到根的右节点,那么根的右节点的左节点对应的就是这段区间。

3.这里 splay 是要将某个位置的节点伸展到给定位置,所以采用从顶向下查询第 rank 个的方式伸展,见代码。

4.remove操作:删除第 k 个,就把第 k-1 个伸展到根,把第 k+1 个伸展到根的右节点,删除它的左节点即可。别忘记 update 操作。

5.insert操作:如果要插到第 k 处,就把第 k-1 个节点旋转到根,把第 k 个节点旋转到根的右节点,那么插入到根的右节点的左节点就可以代替原来的第 k 个。好像没必要像我分两种情况。最后别忘 update,先子节点再根节点。

6.move操作:就是先 remove 再 insert。

7.宏定义:因为用到大量的根节点的左右节点的调用,而这里还不适合用引用,所以干脆定义了宏,简单清楚,编程效果好了很多。

8.边界防溢出:因为1、2中的将 y-1、y+1 伸展到根都是危险操作,因为 y 有可能等于 1 或 n,而 0 节点不能成为根节点,因为0节点默认为空;n+1 节点直接溢出,所以建立两个虚拟节点,一个为1,一个为 n+1,分别放在开头和末尾,对编程本身没影响,但不用担心溢出了,不过各个节点相应的位置就变了,读入位置 x 后 x++ 就行了。

代码:

总时间耗费: 6439ms 
总内存耗费: 3 kB

有些慢,但内存耗的很少。

#include<cstdio>
#include<algorithm>
using namespace std;const int INF = 1e9 + 7;
const int maxn = 100000 + 10;int root, ch[maxn][2], v[maxn], s[maxn], maxv[maxn];void update(int o) {maxv[o] = max(v[o], maxv[ch[o][0]]);maxv[o] = max(maxv[o], maxv[ch[o][1]]);s[o] = s[ch[o][0]] + s[ch[o][1]] + 1;
}int cmp(int o, int k) {int sum = s[ch[o][0]] + 1;if(sum == k) return -1;return k < sum ? 0 : 1;
}void rotate(int& o, int d) {int k = ch[o][d^1]; ch[o][d^1] = ch[k][d]; ch[k][d] = o;update(o); update(k); o = k;
}void splay(int& o, int k) {int d = cmp(o, k);if(d == -1) return;if(d == 1) k -= s[ch[o][0]] + 1;int p = ch[o][d];int d2 = cmp(p, k);int k2 = (d2 == 0) ? k : k - s[ch[p][0]] - 1;if(d2 != -1) {splay(ch[p][d2], k2);if(d2 == d) rotate(o, d^1); else rotate(ch[o][d], d);}rotate(o, d^1);
}void build(int l, int r, int pa) {if(l > r) return;if(l == r) { maxv[l] = v[l]; s[l] = 1; if(l < pa) ch[pa][0] = l; else ch[pa][1] = l;return;} int m = (l+r) >> 1; maxv[m] = v[m];build(l, m-1, m); build(m+1, r, m); update(m);if(m < pa) ch[pa][0] = m; else ch[pa][1] = m;
}#define lc ch[root][0]
#define rc ch[root][1]void move(int x, int y) {splay(root, x-1); splay(rc, x-s[lc]); //x+1 - (s[lc]+1)int o = ch[rc][0];ch[rc][0] = 0; //removeupdate(rc);if(x < y) {splay(root, y-1); splay(rc, y-s[lc]-1); //y - (s[lc]+1)ch[rc][0] = o; update(rc); update(root); //notice} else {splay(root, y); splay(lc, y-1); //ch[lc][1] = o; update(lc); update(root);}
}int main() {int n, m; scanf("%d%d", &n, &m); for(int i = 2; i <= n+1; i++) scanf("%d", &v[i]); build(1, n+2, 0); root = (n+3) >> 1;for(int i = 1; i <= m; i++) {int x, k; char cmd[1]; scanf("%d%s%d", &x, &cmd, &k); x++;switch(cmd[0]) {case 'L': {splay(root, x-k-1); splay(rc, x-s[lc]-1); //x - (s[lc]+1)printf("%d\n", maxv[ch[rc][0]]); move(x, x-k);break; }case 'D': {splay(root, x); splay(rc, x+k-s[lc]); //x+k+1 - (s[lc]+1)printf("%d\n", maxv[ch[rc][0]]); move(x, x+k);break;}}}return 0;
}

[codevs 1343] 蚱蜢(省队选拔赛湖南)相关推荐

  1. Codevs 2296 仪仗队 2008年省队选拔赛山东

    2296 仪仗队 2008年省队选拔赛山东 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 大师 Master 题解 题目描述 Description 作为体育委员,C君负责这次运动 ...

  2. [codevs 2926] 黑白瓷砖(2002年安徽省队选拔赛)

    描述 http://codevs.cn/problem/2926/ 题解: Polya定理的应用. 由于第一次做polya定理的题,故要写的详细些. 首先可以从题目中读到三个置换以及一个不动置换: 顺 ...

  3. 2022—SWJTU-寒假ACM校队选拔赛第二场-题解

    A - 傻子楼梯 算法分析 队列模拟即可 要转变方向当且仅当不同方向的人已抵达电梯,且该方向的下一个人还未到达电梯 昨天发现某位同学一直在wa,这里放上一组hack数据,仅作参考 5 1 1 7 0 ...

  4. 中山大学校队选拔赛第二试题试题3【Compressed suffix array】-------2015年2月8日

    一:题目大意 本题通过给定三个数组S0,P,S,其中S0是1到2n的一个排列,P具有2n个整数,且满足: 数组S是把数组S0中所有奇数元素全部删除并将所有偶数元素除以2并按照原来的相对顺序进行排列而得 ...

  5. 2022—SWJTU-寒假ACM校队选拔赛第一场-题解

    A - 惠老板观星https://vjudge.net/problem/Gym-103401H 算法分析 暴力枚举正方形的四个顶点即可,由于正方形的长宽相等,时间复杂度为 AC code #inclu ...

  6. 2022—SWJTU-寒假ACM校队选拔赛第三场-题解

    A - A 算法分析 要想让 只能是发生在进位的时候,因此每逢尾数为 9 时就会对答案产生贡献. AC code #include<bits/stdc++.h> using namespa ...

  7. clientdataset 遍历字段_解决DBGridEh遍历记录后不移动当前行位置的方法

    解决DBGridEh遍历记录后不移动当前行位置的方法 在用DBGridEh配合ClientDataSet使用时,需要知道用户选择了哪些记录,可用遍历记录的方法查询选择列是否为真,但在这之后,Clien ...

  8. 讯飞创意组别 全国选拔赛成绩公布说明

    第十七届全国大学生智能汽车竞赛 讯飞创意组别 全国选拔赛成绩公布说明 一.全国总决赛设置   2022年第十七届全国大学生智能车竞赛-讯飞创意组别.有来自于94所高校的124支参赛队伍,参加选拔赛的区 ...

  9. Codevs 2460 == BZOJ 1036 树的统计

     2460 树的统计 2008年省队选拔赛浙江 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 一棵树上有n个节点,编号分别为1 ...

最新文章

  1. Windows Server 2016 Technical Preview 5 X64 中文版下载地址
  2. jittor 训练手写数字识别(mnist)
  3. QLibrary执行load失败
  4. Caddy Web服务器QUIC部署
  5. Redis- 内存数据库Redis之安装部署
  6. UVA 11090 Going in Cycle!! 二分答案 + bellman-ford
  7. P2710-数列【Splay】
  8. Docker保存修改后的镜像
  9. javascript的prototype继承问题
  10. k8s核心技术-Helm(chart模板的使用下)---K8S_Google工作笔记0049
  11. android利用AudioRecord实现录音功能(kotlin语言)
  12. SharePoint 2013 母版页修改后,无法添加应用程序
  13. 随机函数_巧用随机函数,生成各种姓名组合。
  14. 对话元境 王矛,详解元境蓝图:以全面的技术重新定义计算范式
  15. 推荐一些小而美的互联网公司
  16. Android Hook框架adbi的分析(3)---编译和inline Hook实践
  17. C语言打印输出图形(初版)
  18. 全息投影技术及其实现(附素材下载)
  19. 一个STAF的RC21的问题的解决和思考
  20. 边缘计算的100个术语

热门文章

  1. [云炬创业基础笔记] 第四章测试14
  2. [云炬学英语]每日一句2020.8.26
  3. php将soap返回的xml转成数组,PHP – 在PHP中将XML转换为数组 – 在php中解析soap xml并将其存储在数据库中...
  4. Siamese Network (应用篇4) :块匹配中一致性特征和距离测度学习 CVPR2015
  5. 如何理解遗传算法中的编码与解码?以二进制编码为例
  6. BugkuCTF-Misc:猜
  7. python 中的序列
  8. 最小生成树与最短路径的区别以及实现方法
  9. ESP32开发 -- 试玩ESP32
  10. 【动态规划】关于转移方程的简单理解