![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Splay
Jinx_jinx_again
啊啊啊啊哈哈哈
展开
-
poj3468 A Simple Problem with Integers(spaly&&线段树)
#include #include #include #define MAXN 100005using namespace std;long long tree[MAXN<<2];long long add[MAXN<<2];void pushdown(int num,int mid){ if(add[num]) { add[num<<1] +=原创 2013-07-16 19:53:47 · 886 阅读 · 0 评论 -
SPOJ GSS6 4487. Can you answer these queries VI (SPLAY)
题目大意:四个操作:I X Y 在x位置插入yD x 删除x位置的数R x y 用y替换x位置上的数字Q x y 求出[x,y]上的最大子序列的和。思路分析:对于动态维护序列肯定是splay了。现在就考虑以下几个问题。之前我们知道线段树处理连续的子序列的和是用区间合并的。那splay上怎么做。考虑边界,如儿子为 0 或者是冗余节点怎么办?初始化的原创 2014-07-27 10:59:48 · 928 阅读 · 1 评论 -
CF 295E Yaroslav and Points(Splay)
题目大意:两个操作1 id op 把id的位置+op2 id op 查询在【id,op】之间的所有的数的差思路:关键是pushup函数。自己退一下会发现,跟区间的总和,区间的节点个数有关。比如如果左区间是 1 2 的话右区间来一个 9那么就要加上9-1+9-2 #include #include #include #incl原创 2014-04-29 01:01:59 · 953 阅读 · 0 评论 -
zoj 3612 Median (splay)
题目大意:添加和删除一个数,然后输出中位数。简单的Splay 维护Splay上有多少个节点就可以了#include #include #define inf 1LL<<60#define maxn 222222#define keyTree (ch[ch[root][1]][0])using namespace std;typedef long原创 2014-05-05 19:35:17 · 860 阅读 · 0 评论 -
hdu 4286 Data Handler (Splay)
splay 的基本操作,但是我真是服了。 N 是 50W 还有 50W个操作,所以需要把splay的数组开到100W.而且还要C++扩栈。需要注意的是 插入的时候 rpos 要 +1 删除的时候要 -1#include #include #include #include #define inf 0x3f3f3f3f#define maxn 1000005原创 2014-03-19 21:08:06 · 913 阅读 · 0 评论 -
ZOJ 3765 Lights (SPLAY)
gcd[x] =GCD( GCD( gcd[ls],gcd[rs]),val[x]) );注意判断没有亮灯状态的情况#include #include #define inf 0x3f3f3f3f#define maxn 222222#define keyTree (ch[ch[root][1]][0])using namespace std;type原创 2014-04-15 23:05:39 · 845 阅读 · 0 评论 -
hdu 4441 Queue Sequence (splay + 线段树)
题目大意:给出一个空的序列,通过插入,删除,查询操作维护。插入:找到这个序列中还没出现的最小的正数 i 。将他插入到给定的位置,然后还要插入一个 -i ,将-i 插入到使得正负数的顺序一样的最右边。删除:删除 i 和 -i的位置查询:查询i 和 -i之间的和思路分析:首先我们面临的问题就是要找到最小的正数,要用一个线段树维护。然后插入操作:首先+i 方便原创 2014-03-18 22:07:03 · 1040 阅读 · 0 评论 -
hdu 3436 Queue-jumpers(Splay)
题目大意:波妞和加菲猫(这两个角色也能扯到一起)排队的时候无聊玩游戏。把这个队伍的人从头到尾标号1-ntop x操作,把编号为x的人放到对首。query x操作,x在第几号位置。rank x操作,x号位置的人的编号是多少。思路分析:让你对Splay 的旋转操作的理解更加深刻。难点在于离散化,离散出top 和 query 操作中所有的点,因为这些点没有操作原创 2014-01-10 20:13:40 · 929 阅读 · 0 评论 -
[NOI 2005] 维修队列 (Splay 给最大连续子区间和 0rz)
题目大意:上图!这题不A都不好意思说会伸展树- -最大的子列要命哦。。。可以先考虑去试一试 SPOJ 1043 Can you answer these queries I 但是这一题没有反转操作所以记住反转的时候要swap(lmax,rmax); orz#include #include #include #include #原创 2014-01-11 20:20:28 · 1003 阅读 · 0 评论 -
POJ 3580 SuperMemo(Splay)
思路分析:ADD , REVERSE ,INSERT ,DELETE ,MIN 这些都是基本操作。只是REVOLVE 操作不好想,但是你会发现规律。就是把一段取出,放在新序列的后面。而且有一个循环关系。所以我们可以用取模操作。而且discuss里说的这个操作的T可能为负数。所以取模的时候就%mod+mod%mod吧。调试的时候犯了两个超级2的错误。样例给的m是2.然原创 2014-01-11 16:12:23 · 952 阅读 · 0 评论 -
hdu 3487 Play with Chain(Splay)
题目大意:一个序列区间的反转操作还有就是把[a,b] 这段序列拿出来,插到新序列的第C个的后面。思路:反转就和hdu 1890 一样的。插入的话,先旋转到要的位置,拿出子序列。然后旋转到C位置,插入子序列。#include #include #include #include #define inf 0x3f3f3f3f#define maxn原创 2014-01-11 09:58:35 · 813 阅读 · 0 评论 -
hdu 1890 Robotic Sort(Splay)
题目大意:机器人可以每次反转一个区间,要把当前最小的放在最前面。问他反转前,那个数在第几号位置。思路:可以知道Splay的左子树就是在他左边的数的个数,所以我们直接用他们的初始位置建树。然后用num排序。这时可以用从小到大的顺序取出他们在数组中的位置。把目标放在根节点。然后找他的左子树的个数+i,然后删除根节点。之前遇到一个思维上的问题,也是lcm提出来的。既然原创 2014-01-10 10:28:11 · 1162 阅读 · 0 评论 -
Hdu 4699 Editor(Splay)
题目大意:给出一个文本编辑器,按照图示的操作进行删减和添加。思路分析:对于如何维护左边最大,就要记录每个区间的左边最大,还有这个节点的值,还有子区间的和。注意看题目,题目的要求输出左边最大是不能为空集的,意味着如果全部都是负数,那么就输出最左边的负数就好。那么就要解决初始化的问题。再有一点问题就是会有很多个连续的L ,R操作。所以要判断边界。#inclu原创 2014-09-24 14:55:28 · 884 阅读 · 0 评论