BZOJ 1507 Editor(块状链表)】的更多相关文章

2016-06-18 当时关于块状链表的想法是错误的,之前维护的是一个动态的$\sqrt{n}$,所以常数巨大,今天才知道原因TwT,请不要参照这个程序为模板!!! 模板题水啊水~~~ 第一次写块状链表,先写一个模板题(⊙o⊙) 块状链表虽然效率大概在O(n√n),但它几乎没有常数,相比较理论上复杂度较快的O(nlogn)的Splay还是要快,因为Splay常数太大啦!感觉比较笨重.也许这就是许多OIer热衷分块的原因吧. BZOJ 1507(因为O2优化,没有内存池) #include<cma…
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1507 题意:一个文本编辑器,模拟以下操作: 思路:块状链表的主要操作: (1)find(p,b):找到位置p在链表的位置b: (2)split(b,p):将第b块分裂成两块,前一块大小为p: (3)maintain(b):将b块之后的碎片合并: 利用以上三种操作可以完成插入串.删除一段串.得到一段串三种操作.另外三种操作比较简单. (1)insert(p,n,str):在位置p之后插入…
1507: [NOI2003]Editor Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 3397  Solved: 1360[Submit][Status][Discuss] Description Input 输入文件editor.in的第一行是指令条数t,以下是需要执行的t个操作.其中: 为了使输入文件便于阅读,Insert操作的字符串中可能会插入一些回车符,请忽略掉它们(如果难以理解这句话,可以参考样例). 除了回车符之外,输入文件的所有字…
第一次写块状链表,发现还挺好写的,但是一点地方写错加上强制在线就会各种姿势WA/TLE/RE爆- 想法就是分块后,在每一个块上维护最大值和次大值,还在每一个块上维护一棵trie树来求异或最大值.散块直接暴力-这想法暴力吧-这道题不用考虑合并,因为最多分出(n+q)/Bsz块.详细的做法如下 对于修改一个数,首先在该块的trie数中删除该数(直接伪删,也就是让那一条路径上每个点的cnt都减1),然后再插入,接着更新最大值和次大值. 对于插入一个数,直接在trie树中插入该数,随后在块状链表中插入,…
Description Input 输入文件editor.in的第一行是指令条数t,以下是需要执行的t个操作.其中: 为了使输入文件便于阅读,Insert操作的字符串中可能会插入一些回车符,请忽略掉它们(如果难以理解这句话,可以参考样例). 除了回车符之外,输入文件的所有字符的ASCII码都在闭区间[32, 126]内.且行尾没有空格. 这里我们有如下假定:MOVE操作不超过50000个,INSERT和DELETE操作的总个数不超过4000,PREV和NEXT操作的总个数不超过200000.所有…
这就是一道数据结构裸题啊,最大极差就是区间最大值减最小值,最小极差就是相邻两个数差的最小值.然后平衡树splay/treap或者块状链表维护就行了. 第一次自己写块状链表,蛮好写,就是长..然后就BZOJ rank1了(2019.5.11求不打脸 ) CODE #include <bits/stdc++.h> using namespace std; const int MAXN = 200005; char cb[1<<15],*cs=cb,*ct=cb; #define get…
[题意] 回答若干个询问,(l,r,a,b):区间[l,r]内权值在[a,b]的数有多少[种]. [思路] 考虑使用块状链表实现莫队算法中的插入与删除. 因为权值处于1..n之间,所以我们可以建一个基于权值的块状链表,每个块维护一个区间信息sum,表示权值在该块的数的种数. 这样插入与删除只需要O(1)的时间,查询需要O(sqrt(n))的时间,总的时间复杂度为O(n^1.5+qn^0.5) [代码] #include<set> #include<cmath> #include&l…
题目链接 st(n)表示sqrt(n) 为使块状链表不会退化,通常将每块的大小S维持在[st(n)/2,2st(n)]中,这样块数C也一定[st(n)/2,2st(n)]中 在此使用另一种方法(方便)维持这种性质:保证任意相邻两块的size相加>st(n),并且每块大小<=st(n) 这样可保证块数C在[st(n),2st(n)]中 在每次块状链表结构改变后执行maintain,顺序扫描链表,将相邻两块能合并就合并 1.注意Insert的读入,会有回车 2.为避免各种翻车,还是加上判断!=-1…
传送门 看了看块状链表,就是数组和链表的合体. 看上去好高大尚,思想也很简单. 但是发现代码量也不是很小,而且代码理解起来也是费尽得很,倒不如splay用起来顺手. 在加上适用范围貌似不是特别广,所以只把模板贴在这,只当了解思想,暂时先不使用.(也不会用啊) #include<iostream> #include<cstring> #include<cstdio> #include<queue> using namespace std; <<;…
//块状链表//分块排序,然后每次查找时在暴力查找头和尾两个块.//中间那些块,因为有序所以只需2分查找即可.我用的是lower_pound();//插入是,也是头和尾暴力插入,中间那些加到一个累计里即可.#include<cstdio>#include<cmath>#include<algorithm>#include<iostream>using namespace std;int a[1000005],b[1000005],lei[1000005],d…