Description Write a program to transform the permutation 1, 2, 3,..., n according to m instructions. Each instruction (a, b) means to take out the subsequence from the a-th to the b-th element, reverse it, then append it to the end. Input There is on…
第一棵伸展树,各种调试模板……TVT 对于 1 n 这种查询我处理的不太好,之前序列前后没有添加冗余节点,一直Runtime Error. 后来加上冗余节点之后又出了别的状况,因为多了 0 和 n+1 这两个节点,并且每次截取翻转添加到序列最后,因此无法确定 n+1 这个节点在序列的哪个位置. 比如(括号中的为添加的冗余节点): (0) 1 2 3 4 5 (6) 我把[3,4]截取翻转添加到序列尾部,会变成这样: (0)1 2 5 (6)4 3 此时我如果再希望截取[3,4],期望的结果应该是…
splay的题: 学习白书上和网上的代码敲的: #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> using namespace std; int n,m; struct node { node *ch[]; int s,v; int flip; node(int v):v(v) { ch[]=ch[]=NULL; s=; flip=; } void ma…
题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18902 [思路] 伸展树+打标记. 用伸展树维护这个序列,使得能够提供快速的分裂与合并O(logn),利用打标记的方法处理区间翻转的问题. 需要注意的有: 1)在splay与print中都需要合适地调用pushdown下传标记. 2)Merge操作应该满足left中所有元素都比right中的元素小,这里的大小定义为序列位置的大小而不是键值v的大小. 3)因为me…
题目链接 题意:你的任务是根据m条指令改变排列{!,2,3,...,n}.每条指令(a,b)表示取出第a~b个元素,翻转后添加到排列的尾部.输出最终序列. 解法:splay对区间分裂合并翻转,模板题. 初学splay,代码写得有点挫,以后慢慢改~~ #include<bits/stdc++.h> using namespace std; struct Splay { ; ],siz[N],val[N],fa[N],tot,flip[N],n,m; int rel(int u) { ]==u;…
题意: 给一个序列,是从1~n共n个的自然数,接下来又m个区间,对于每个区间[a,b],从第a个到第b个从序列中分离出来,翻转后接到尾部.输出最后的序列. 思路: 这次添加了Split和Merge两个基本操作,还有个比较困难的翻转操作.翻转操作只需要将需要翻转的序列独立成树,给根加上翻转标记之后再直接插到另外由前后两棵树组成的树上.但是在做一些操作的时候可能会遇到已经标记了翻转的子树,比如splay时,如果不顾flip标记,直接带flip标记的点伸展到根,会就会跟其他没有标记的节点混合了,而一个…
题意:根据m条指令改变排列1 2 3 4 … n ,每条指令(a, b)表示取出第a~b个元素,反转后添加到排列尾部 分析:用一个可分裂合并的序列来表示整个序列,截取一段可以用两次分裂一次合并实现,粘贴到末尾可以用一次合并实现. 翻转可以采用在每个结点上做标记的方法,flip = 1意味着将这棵子树翻转,可以类似线段树用一个pushdown()实现标记向下传递. 可以发现当前排列就是伸展树的中序遍历序列.中序遍历打印结果即可. 注意代码中设置了虚拟首结点0的技巧. 代码如下: #include…
原题链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18902 伸展树的区间翻转剪切... 如下: #include<cstdio> #include<cstdlib> #include<iostream> #include<algorithm> ; struct Node{ int v, s, rev; Node *pre, *ch[]; inline , , Node *p =…
UVA 11922 题意: 有n个数1~n 操作a,b表示取出第a~b个数,翻转后添加到数列的尾部 输入n,m 输入m条指令a,b 输出最终的序列 代码: #include<iostream> #include<cstdio> #include<cstring> using namespace std; #define Key_Value ch[ch[root][1]][0] ; int n,m; ],root,tot1; void Update_Rev(int r){…
Array Transformer Time Limit: 5000ms Memory Limit: 131072KB This problem will be judged on UVA. Original ID: 1200364-bit integer IO format: %lld      Java class name: Main   Write a program to transform an array A[1], A[2],..., A[n] according to m in…