[CodeVS 1343] 蚱蜢:Splay Tree

2023-10-20 20:08
文章标签 tree codevs splay 1343 蚱蜢

本文主要是介绍[CodeVS 1343] 蚱蜢:Splay Tree,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题意:N个数,J个操作(2 ≤ N ≤ 100 000, 1 ≤ J ≤ 100 000)。每个操作将第a个数往前或后移动b个,并询问跨越的这些数中的最大值,保证操作有效。

要求支持区间查询、增添删除,Splay是个不错的选择。

把第a个数删掉,再插到第b个数前面就好啦。有没有更有针对性的做法呢?

我是这样做的:假设把x移到y前面,x、y把一列数分为三段:a x b y c -> a b x y c

把x删除,插到y前面等价于把b和a合并。正好,为了查区间最大值,我们已经把b提取出来了。

#include <cstdio>
#include <algorithm>
const int MAX_N = 1e5, inf = 1<<30;
int N, a[MAX_N];struct Splay {static const int n = MAX_N+4, nil = n-1;int ptr, &root, ch[n][2], fa[n], sz[n], v[n], mx[n];int type(int x) { return x == ch[fa[x]][1]; }void up(int x) { sz[x] = sz[ch[x][0]] + sz[ch[x][1]] + 1; mx[x] = std::max(v[x], std::max(mx[ch[x][0]], mx[ch[x][1]])); }void set(int x, int d, int y) { fa[ch[x][d] = y] = x; }void rot(int x, int d){int y = ch[x][d];set(fa[x], type(x), y);set(x, d, ch[y][d^1]);set(y, d^1, x);up(x);up(y);}void splay(int x, int p=0){int y;while ((y = fa[x]) != p) {int z = fa[y], t1 = type(x);if (z != p) {int t2 = type(y);if (t1 == t2)rot(z, t2), rot(y, t1);elserot(y, t1), rot(z, t2);} elserot(y, t1);}}int new_node(int c){ch[ptr][0] = ch[ptr][1] = nil;sz[ptr] = 1;v[ptr] = mx[ptr] = c;return ptr++;}Splay(): ptr(1), root(ch[0][0]){sz[nil] = 0;v[nil] = mx[nil] = -inf;set(0, 0, new_node(0));set(1, 1, new_node(0));}void build(){build(0, N-1, 2, 0);up(2);up(1);}void build(int l, int r, int p, int t){if (l > r) return;int m = (l+r)/2, x = new_node(a[m]);set(p, t, x);build(l, m-1, x, 0);build(m+1, r, x, 1);up(x);}void join(int x, int y, int t){int p = x;while (ch[p][t] != nil)p = ch[p][t];splay(p, fa[x]);set(p, t, y);up(p);}int kth(int k, int p=0){int x = root;while (x != nil) {int s = sz[ch[x][0]];if (k == s+1) return splay(x, p), x;if (s >= k) x = ch[x][0];else k -= s+1, x = ch[x][1];}}int jump(int a, int b){++a, ++b;int t = a>b, x = kth(a), y = kth(b, x), z = ch[y][t], r = mx[z];ch[y][t] = nil;up(y);join(ch[x][t], z, t^1);return r;}
} T;int main()
{int J;scanf("%d %d", &N, &J);for (int i = 0; i < N; ++i)scanf("%d", &a[i]);T.build();while (J--) {int a, b;char o;scanf("%d %c %d", &a, &o, &b);printf("%d\n", T.jump(a, a+(o == 'D' ? b+1 : -b-1)));}return 0;
}

这篇关于[CodeVS 1343] 蚱蜢:Splay Tree的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/249433

相关文章

树(Tree)——《啊哈!算法》

树 什么是树?树是一种特殊的图,不包含回路的连通无向树。 正因为树有着“不包含回路”这个特点,所以树就被赋予了很多特性。 一棵树中的任意两个结点有且仅有唯一的一条路径连通。一棵树如果有n个结点,那么它一定恰好有n-1条边。在一棵树中加一条边将会构成一个回路。 一棵树有且只有一个根结点。 没有父结点的结点称为根结点(祖先)。没有子结点的结点称为叶结点。如果一个结点既不是根结点也不是叶

226 Invert Binary Tree

//226 Invert Binary Tree//算法思路:主要使用递归算法public class Solution {public TreeNode invertTree(TreeNode root) {//1 出口 空节点if (root==null)return null;//2 递归 调用自己TreeNode left = root.left;TreeNode right = ro

Sorry!Hbase的LSM Tree就是可以为所欲为!

我们先抛出一个问题: LSM树是HBase里使用的非常有创意的一种数据结构。在有代表性的关系型数据库如MySQL、SQL Server、Oracle中,数据存储与索引的基本结构就是我们耳熟能详的B树和B+树。而在一些主流的NoSQL数据库如HBase、Cassandra、LevelDB、RocksDB中,则是使用日志结构合并树(Log-structured Merge Tree,LSM Tr

【spring】does not have member field ‘com.sun.tools.javac.tree.JCTree qualid

spring-in-action-6-samples 的JDK版本 最小是11,我使用 了22: jdk21 jdk22 都与lombok 不兼容,必须使用兼容版本, 否则报错: thingsboard 的大神解释了: java: java.lang.NoSuchFieldError: Class com

[LeetCode] 863. All Nodes Distance K in Binary Tree

题:https://leetcode.com/problems/all-nodes-distance-k-in-binary-tree/ 题目大意 求给树中,距给定 结点 指定长度的 所有结点的val 思路 tree -> graph 、 bfs 先遍历树,并用map记录每个结点的父结点 ,将树变为图,然后 bfs。 /*** Definition for a binary tree

js实现树级递归,通过js生成tree树形菜单(递归算法)

1、效果图 需求:首先这是一个数据集—js的类型,我们需要把生成一个tree形式的对象 : var data = [{ id: 1, name: "办公管理", pid: 0 },{ id: 2, name: "请假申请", pid: 1 },{ id: 3, name: "出差申请", pid: 1 },{ id: 4, name: "请假记录", pid: 2 },{ id:

【unity实战】利用Root Motion+Blend Tree+Input System+Cinemachine制作一个简单的角色控制器

文章目录 前言动画设置Blend Tree配置角色添加刚体和碰撞体代码控制人物移动那么我们接下来调整一下相机的视角效果参考完结 前言 Input System知识参考: 【推荐100个unity插件之18】Unity 新版输入系统Input System的使用,看这篇就够了 Cinemachine虚拟相机知识参考: 【推荐100个unity插件之10】Unity最全的最详细的C

树链剖分 + 后缀数组 - E. Misha and LCP on Tree

E. Misha and LCP on Tree  Problem's Link   Mean:  给出一棵树,每个结点上有一个字母。每个询问给出两个路径,问这两个路径的串的最长公共前缀。 analyse: 做法:树链剖分+后缀数组. 记录每条链的串,正反都需要标记,组成一个长串. 然后记录每条链对应的串在大串中的位置,对大串求后缀数组,最后询问就是在一些链

数据结构 - Codeforces Round #353 (Div. 2) D. Tree Construction

Tree Construction  Problem's Link  ---------------------------------------------------------------------------- Mean:  给定n个数,按照构造Binary Search Tree的方式来构造BST树,按顺序输出每一个非root结点的父节点的值。 analyse

【HDU】4871 Shortest-path tree 最短路+点分治

传送门:【HDU】4871 Shortest-path tree 题目分析: 学了点分治后来看这道题,简直就是水题。。。 但是我竟然花了将近一个晚上才写出来。。。就因为一个地方写漏了T U T。。 首先根据题意求一棵树,最短路一下,然后最小字典序就按照编号顺序遍历邻接表给节点标记。 剩下的就是树分治的事了。 在以重心X为根的子树中,按照X的子节点v的子树中最长路径包含节点数升序遍