bzoj 1861 splay】的更多相关文章

就是裸地splay,然后自己写的不是特别好,tle了,最近时间比较紧迫,有时间了改下,在此记录 另附转载pascal AC代码最下面 /************************************************************** Problem: User: BLADEVIL Language: Pascal Result: Time_Limit_Exceed ****************************************************…
1861: [Zjoi2006]Book 书架 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 1396  Solved: 803[Submit][Status][Discuss] Description 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下一本.由于这些书太有吸引力了,所以她看完后常常会忘记原来是放在书柜的什么位…
1861: [Zjoi2006]Book 书架 Description 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下一本.由于这些书太有吸引力了,所以她看完后常常会忘记原来是放在书柜的什么位置.不过小T的记忆力是非常好的,所以每次放书的时候至少能够将那本书放在拿出来时的位置附近,比如说她拿的时候这本书上面有X本书,那么放回去时这本书上面就只可能有X-1.X或X+1本…
1861: [Zjoi2006]Book 书架 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 1453  Solved: 822[Submit][Status][Discuss] Description 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下一本.由于这些书太有吸引力了,所以她看完后常常会忘记原来是放在书柜的什么位…
#include<cstdio> #include<algorithm> #include<cstring> #define N 80010 #define which(x) (ls[fa[(x)]]==(x)) using namespace std; int id[N],pos[N],sz[N],ls[N],rs[N],fa[N],tot,n,m,root,a[N]; ]; +sz[ls[x]]+sz[rs[x]];} int Build(int l,int r,i…
[题目分析] 模板题目. 首尾两个虚拟结点,十分方便操作. [代码] #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <map> #include <set> #include <queue> #include <string> #include <iostream> #include…
1861: [Zjoi2006]Book 书架 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 1290  Solved: 740[Submit][Status][Discuss] Description 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下一本.由于这些书太有吸引力了,所以她看完后常常会忘记原来是放在书柜的什么位…
bzoj 1269 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1269 大致思路: 用splay维护整个文本信息,splay树的中序遍历即为该文本. 收获: 1.可以先在文本开始和结尾个插入一个节点,然后每次操作都适当调整位置,这样可以减少特判(插入一段文本到0位置,在最后插入一段文本...) 2.查找一段文本[lf,rg],可以先找到位置为lf-1的节点(因为1,不用特判没有了),splay到根,再找到rg+1的节点,旋转到根的下面,…
查最小值,删除,翻转... 显然splay啊... #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #define N 200005 #define inf 0x3f3f3f3f using namespace std; int n; ], fa[N]; int a[N]; int mn[N],zhi[N],size[N]; void push_up(int…
被后缀三人组虐了一下午,写道水题愉悦身心. 题很裸,求lcq时二分下答案就行了,写的不优美会被卡时. (写题时精神恍惚,不知不觉写了快两百行...竟然调都没调就A了...我还是继续看后缀自动机吧...) #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define bas 131 #define p 1000000007 #define N 100005 #…
因为是整体加减,所以直接记录在外面. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define inf 0x3f3f3f3f #define N 1000005 using namespace std; int sum; int li,root; ],fa[N],n,m,k[N]; void push_up(int x) { size[x]=size[c…
再刷水题我就废了... #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #define lc(x) ch[x][0] #define rc(x) ch[x][1] #define inf 0x3f3f3f3f #define N 200005 using namespace std; ]; int k[N];int cnt,root; int size[N],…
水题...貌似理解splay怎么维护数列了... 每个点维护一个size,它的位置就是它的size,区间翻转的话可以打标记,find的时候push_down,交换左右子树. #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #define N 100005 #define lc(x) ch[x][0] #define rc(x) ch[x][1] using n…
自己yy了找前驱和后继,学了学怎么删除...(反正就是练模板) #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define N 80005 #define lc(x) ch[x][0] #define rc(x) ch[x][1] #define inf 0x3f3f3f3f using namespace std; ],size,ch[N*][],roo…
用晚自习学了一下splay模板,没想象中那么难,主要是左旋和右旋可以简化到一个函数里边,减少代码长度... #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 33333 #define inf 0x3f3f3f3f #define lc(x) ch[(x)][0] #define rc(x) ch[(x)][1] using names…
题意: 带权联通块,添边与查询联通块中第k大. SOL: splay合并+并查集. 我以为splay可以用奇技淫巧来简单合并...调了一下午终于幡然醒悟...于是就只好一个一个慢慢插...什么启发式合并...说的那么高级其实那么丝帛. 实现得非常渣...中序遍历3060ms,换成队列并没有快起来...难道是我的splay本身就不对?... %%%hzw的线段树...发现其实线段树合并更简单更快...被splay蒙蔽了眼睛...思路不够开阔...唉... Code: /*=============…
好久没写splay了,写一发(写了一节课,调了一节课) #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <vector> #include <map> #include <set> #include <stack> #define mp make_pair #define pa pair…
(╯-_-)╯╧╧ 此处为错误代码. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 300050 #define inf 2147483646 using namespace std; int n,m,a[maxn],x,y; ],size[maxn],fath[maxn],val[maxn],root,hash[maxn],rr=…
题意:给定一个带点权的无向图,有两种操作: 1.将两个连通分量合并. 2.查询某个连通分量里的第K大点. 题解: 用并查集维护连通关系,一开始建立n棵splay树,然后不断合并,查询. 处理技巧: 1.每个顶点u所在的Splay就是T[find(u)]. 2.每个顶点在树中对应的节点编号就是该顶点的编号. #include <cstdio> #include <iostream> #define maxn 100110 using namespace std; ], siz[max…
类似于1014,用splay维护这个序列,维护每个节点为根的子树的hash值,对于一个询问二分答案判断就行了. 反思:询问的时候因为是原序列的x,y,所以开始的时候直接splay(x-1)了,后来发现这是不对的,因为可能在x前插入一些东西,所以需要麻烦些,先splay(x),然后提出来右端点为size[son[rot][0]]+1+len,然后再splay(find(size[son[rot][0]]+1)). /*****************************************…
首先我们可以用splay来维护这个字符串,那么对于某两个位置的lcp,维护每个节点的子树的hash,然后二分判断就好了. /**************************************************************     Problem: 1014     User: BLADEVIL     Language: C++     Result: Accepted     Time:4468 ms     Memory:3640 kb *************…
题目背景 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技术含量…… 这样我也出一道题,我出这一道的目的是为了让大家以后做这种题目有一个“库”可以依靠,没有什么其他的意思. 这道题目就叫序列终结者吧. 题目描述 给定一个长度为N的序列,每个序列的元素是一个整数(废话).要支持以下三种操作: 将[L,R][L,R][L,R]这个区间内的所有数加上VVV. 将[…
写完维修数列 这不是水题嘛233333 //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N=5000050; int n,pos=1,ch[N][2],fa[N],size[N],root,xx,cnt; char op[15],ins[N],v[N]; void push_up(int x){size[x]=s…
GSS系列有一丝丝像- 只不过那个是线段树 这个是splay 翻转 插入 删除啥的就是普通的splay 合在一起了而已 //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using namespace std; struct Tree{ int v,rev,sum,lmax,rmax,maxx,ch[2],fa,size,same; void init(){v=rev=sum…
就第三个操作比较新颖 转化成 在l前插一个点 把r和r+1合并 //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn=100005,mod=20130426; typedef long long ll; struct Tree{ int fa,ch[2];ll add,mul,size,val; }tr[66…
思路: 这像是 阶梯Nim之类的东西 我们 直接把sg函数 设成mod(L+1)的 一棵子树 向下的奇数层上的石子xor起来 就是答案 有加点和改值的操作 就splay维护一下 //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N=1000050,inf=0x3f3f3f3f,NULLL=N-1; int n,m,…
思路: 区间翻转的裸题 终于tm理解splay了-- //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define N 155555 int n,m,root,size[N],ch[N][2],fa[N],rev[N],v[N]; void push_up(int x){size[x]=size[ch[x][0]]+size[ch…
思路: splay维护序列的裸题 啊woc调了一天 感谢yzy大佬的模板-- //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define N 55555 #define inf 0x3f3f3f3f int n,m,root,cnt,size[N],ch[N][2],fa[N],v[N],mx[N],rev[N],tag[N];…
小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下一本.由于这些书太有吸引力了,所以她看完后常常会忘记原来是放在书柜的什么位置.不过小T的记忆力是非常好的,所以每次放书的时候至少能够将那本书放在拿出来时的位置附近,比如说她拿的时候这本书上面有X本书,那么放回去时这本书上面就只可能有X-1.X或X+1本书. 当然也有特殊情况,比如在看书的时候突然电话响了或者有朋友来访.这时…
思路:搞搞平衡树. #include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk make_pair #define PII pair<int, int> #define y1 skldjfskldjg #define y2 skldfjsklejg using namespace std; ; ; const int inf = 0x3f3f3f3f; cons…