实用数据结构
伟大的蚊子
这个作者很懒,什么都没留下…
展开
-
codevs3243:区间翻转,线段树
题目描述 Description 给出N个数,要求做M次区间翻转(如1 2 3 4变成4 3 2 1),求出最后的序列输入描述 Input Description 第一行一个数N,下一行N个数表示原始序列,在下一行一个数M表示M次翻转,之后的M行每行两个数L,R表示将区间[L,R]翻转。输出描述 Output Description 一行N个数 , 表示最终序列。样例输入 Sample Inp原创 2016-01-07 11:03:32 · 955 阅读 · 0 评论 -
hdu5861 Road,线段树,然后扫描
佣神给的思路线段树预处理每一个road的起始和结束时间 然后排序按天数扫描,每天看有没有需要增加新路,看有没有需要关闭路 因为是排好序的,所以不会重复扫#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int INF=0x3f3f3f3f;co原创 2016-08-18 20:58:11 · 473 阅读 · 0 评论 -
hihocoder1077,线段树单点修改的一点小技巧
如果有神犇会区间修改的非递归版本,求教啊线段树单点修改,区间查询最小值 可以看见我这代码里面全是for循环 zkw 大法好正常线段树是一颗近似的满二叉树,因为n不是2的k次方 就这样凑成了一个满二叉树M可以理解为非叶子节点的数量, 那么点i,i+n就是其在堆式储存的线段树数组里的index 一步找到,然后直接up,,单点修改结束区间查找的话,先变成开区间,然后还是向上更新#includ原创 2016-08-20 03:23:53 · 420 阅读 · 0 评论 -
poj2528 线段树+骚气的离散化姿势
by cww97因为这个图所以,不能当做左闭右开的线段树来做and,卡了两个小时是因为这个傻逼错误//for (int i = 1; i <= A; i++) {// x[a[i]] = i;//啊啊啊啊啊啊啊啊啊啊啊啊啊啊 //printf("x[%d] = %d\n", a[i], i);//}T.build(A);for (int i = 1; i <= n; i++){原创 2017-07-06 03:46:58 · 260 阅读 · 0 评论 -
区间rmq的zkw线段树
本文适合对线段树有一定理解,同时看过一点《统计的力量》的人zkw线段树的理解和思考zkw线段树解决区间rmq zkw线段树具体内容请百度统计的力量(这是他讲的时候所用的ppt的名字) 今天我们就来完整的写一个zkw线段树。 正如他在ppt里讲的 *差分是化绝对为相对的重要手段 *标记永久化后就是值,只不过这种值是相对的 *计算答案时可以利用从节点到根部的信原创 2017-08-04 01:12:11 · 362 阅读 · 0 评论 -
多校第四场补题
题意 题目一通描述,弄得我完全懵逼。幸好讨论区,有题目意思。 题目意思为:定义f(l,r) 为区间 [l,r] 的不同元素个数/区间长度。求最小的 f(l,r) 定义域: 。题目意思,翻译转一下就是这么简单。我很菜,想不出来看了克拉丽丝的题解还是想不出来看别人blog看懂了 思路就是,官方题解给出的,二分+线段树;我们二分答案,mid。需要判断mid是否满足,假设我们定义原创 2017-08-04 18:26:46 · 312 阅读 · 0 评论 -
树的dfs序入门,BZOJ1103 ,hdu6162,EOJ3335
讨论昨天的02克拉丽丝说不需要树剖可以直接dfs序我不理解他就丢给我这题,曰:经典的题目百度题解一堆,好算知道dfs序是啥意思了#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int N = 5e5 + 7;int l[N], r[N];原创 2017-08-23 18:20:31 · 417 阅读 · 0 评论 -
【数据结构】Treap的实现与应用
本篇博客作者:czjTreap的本质是一颗二叉查找树,只是在每个结点上都附加了一个优先级的信息。保证每个点的优先级都比左右儿子小,利用优先级,我们可以把这颗树看成一个小根堆。 Treap树在随机给优先级的情况下,可以在期望O(logn)的时间复杂度里完成:一个结点的插入。一个结点的删除。查询第K大的值。给定一个值返回它是第几大。以上四种操作。那么话不多说,先上模板。这里准备了两个模板,第原创 2017-08-25 15:34:21 · 400 阅读 · 0 评论 -
左偏树
本文作者:czj左偏树的一道例题,hdu 1512题目大意:有n个猴子,一开始每个猴子只认识自己。每个猴子有一个力量值,力量值越大表示这个猴子打架越厉害。如果2个猴子不认识,他们就会找他们认识的猴子中力量最大的出来单挑,单挑不论输赢,单挑的2个猴子力量值减半,这2拨猴子就都认识了,不打不相识嘛。现在给m组询问,如果2只猴子相互认识,输出-1,否则他们各自找自己认识的最牛叉的猴子单挑,求挑完后这拨猴子原创 2017-08-25 17:40:41 · 311 阅读 · 0 评论 -
主席树,开坑POJ2104,EOJ3335&hdu6162,hdu5919
一些废话去年自己一知半解写的blogblog1blog2blog3还没看的blogn个树,其实是有n个线段树每个线段树记录前n个数插入的状态,是把整个序列排序之后插入自己该在的位置(类似于树状数组求逆序对的那种插入姿势)每次新建一个线段树大部分节点都是从前一棵树上掰下来的,公用的,所以每次增加nlogn个节点poj2104拿去年的板子改的,去年的代码好丑,换成舒服的风格# include <cstd原创 2017-08-29 00:19:02 · 448 阅读 · 0 评论 -
KD-Tree解决空间最短距离的利器
KD-Tree解决空间最短距离的利器本文作者:Caozhijie/************************************************************** Problem: 2648 User: Cardinal Language: C++ Result: Accepted Time:14476 ms Memory:原创 2017-09-27 11:17:56 · 605 阅读 · 0 评论 -
线段树开新坑:kuangbin带你飞
写在最前面的废话这里I以前的题是暑假刚刚开始的时候在家写的,然后多校一波就荒废了9月开头回家一波,重新填坑,= =,kuangbin带你飞的pdf,这才一半题,后面还有一波,蓝瘦,慢慢写吧,不写题怎么变的更强线段树基础单点更新A:hdu1166敌兵布阵:单点增减,区间sumcmy曾经这题疯狂TLE后来发现是因为cin的原因,cin好慢的说树状数组也可以做,zkw的暴力单点修改也可加速一波树状数组#i原创 2017-09-06 23:46:08 · 575 阅读 · 0 评论 -
hihocoder编程练习赛6+多重背包的各种姿势
题目现在在题库的1361~1364 比赛链接http://hihocoder.com/contest/hihointerview18/problems01:Playfair密码表 模拟题,秒 注意没有字母J#include<cstdio>#include<string>#include<cstring>#include<iostream>using namespace std;int原创 2016-08-21 20:34:44 · 681 阅读 · 0 评论 -
多校第九场总结,树剖
http://bestcoder.hdu.edu.cn/blog/02官方题解 由于没有修改操作,一个显然的想法是离线处理所有问题 将询问拆成1-x,1-y,1-LCA(x,y),则处理的问题转化为从根到节点的链上的问题。 解决这个问题,我们可以在dfs时向treap插入当前的数,在退出时删除这个数,并且每次维护在该点上的答案。 当然也可以将所有的查询和点权排序,用树链剖分做这原创 2017-08-23 03:07:46 · 318 阅读 · 0 评论 -
poj2886 线段树单点修改+反素数(喵?)
题意:n个熊孩子每个人有个数字a[i],首先k号熊孩子出圈,然后第k+a[i]个熊孩子出圈,一个环,可以绕很多圈,如果a[i]为正则顺时针数,反之逆时针,相当于一个变体的约瑟夫游戏,第i个出圈的熊孩子,有f[i]的得分,f[i]为i的因子个数反正没人看的讲解:分为两个部分:线段树模拟约瑟夫游戏+寻找1到n范围内因数数量最多的那个ans,约瑟夫游戏只要做到第ans个人出圈就好了区间和的线段树,每个叶子原创 2017-07-05 02:38:54 · 259 阅读 · 0 评论 -
线段树板子的小修改
关于M的计算方法int M = 1;for (; M &lt; n;)M &lt;&lt;= 1;if (M &gt; 1) M--;今天读学生代码,小朋友的代码都很规范int M = 1;for (; M &lt; n;) { M &lt;&lt;= 1;}if (M &gt; 1) { M--;}可是,好长啊,多年前看见主任的几个原创 2018-05-06 12:43:00 · 245 阅读 · 0 评论 -
hihocoder 1080 线段树:区间加法&赋值
题面蛮好玩的,,也行是因为我玩模拟城市的缘故 修模板了带两个操作的话,注意set和tag的顺序 每次down的时候先放set标记,再放tag标记 每次更新set的时候要把tag清空#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int N =原创 2016-08-19 18:36:57 · 577 阅读 · 0 评论 -
POJ3481 AVL树模板 ++codevs1285
这两天鲍鱼讲AVL树 poj3481 题意大概是每个人有两个参数k,p 按p排序,每次输出最大的或最小的人的k值 这道题方法很多,, 正好练一下AVL树 这里有个板不过这孩子似乎把左旋右旋写反了,同时delete的时候少了一个域= = 当然你要是用set,map之类的玩意A了我也没什么办法 敲完之后编译失败了好久,一开始以为是class的锅 呜呜呜,找cw和kpm看了看,,半天没编原创 2016-05-20 22:54:08 · 1190 阅读 · 0 评论 -
【NOI2004】郁闷的出纳员Splay版
题目连接codevs1286 BZOJ1503,这里数据似乎强大一点,SlowSplay会TLE学了Splay,,,练练手 多维护一个size域,就可以求k大值辣 昨晚调到接近3点还是RTE/WA,,cry 今天把每个节点加个cnt域就过了 (出现重复的数字的情况#include<cstdio>#include<algorithm>using namespace std;int m,原创 2016-05-30 16:12:22 · 391 阅读 · 0 评论 -
codevs1080 第一次用ZKW线段树
题目描述 Description一行N个方格,开始每个格子里都有一个整数。现在动态地提出一些问题和修改:提问的形式是求某一个特定的子区间[a,b]中所有元素的和;修改的规则是指定某一个格子x,加上或者减去一个特定的值A。现在要求你能对每个提问作出正确的回答。1≤N<100000,,提问和修改的总数m<10000条。输入描述 Input Description 输入文件第一行为一个整数N,接下来是n原创 2016-01-07 11:17:50 · 535 阅读 · 0 评论 -
hdu2665 主席树模板题
题目 http://acm.hdu.edu.cn/showproblem.php?pid=2665区间k大值,区间极值很容易想到线段树,如果k是个位数的话,可以考虑开k个域的线段树= =,,,,滚~ 又称可持久化线段树,函数式线段树 也许是上面两个字看的太长,同时主席两字给人一种不明觉厉的感觉,,,so,嘿嘿嘿关于主席树的讲解可以看这 http://wenku.baidu.com/link?原创 2016-02-02 02:22:26 · 789 阅读 · 0 评论 -
UVA 11992,。。。伪-二维线段树
题目点这看白书写的, 数据范围是最多20行嘛 所谓二维,开很多行的一维然后线性加起来,,,#include<cstdio>#include<cstring>#include<iostream> #include<algorithm>using namespace std;const int N=233333;const int INF=1000000000;//9个9 int n,原创 2016-03-06 11:39:08 · 381 阅读 · 0 评论 -
UVALive 3938 一道被我WA了的线段树
题目点着 题意是一段区间,q次询问一段区间最大连续字段和 看了眼白书,每段最大连续子段和为 左子树的最大子段,右子树的最大子段,或横跨左右的最大子段 这三个里面最大的 每个节点维护3个值,最大前缀子段(L开头),最大后缀子段(R结尾),最大子段WAWAWAWAWAWAWA。。。。。。 代码能力捉急,先存着,等到海枯石烂那天在回头看#include<cstdio>//cww=2016.3.原创 2016-03-06 23:17:08 · 535 阅读 · 0 评论 -
10分钟搞懂树状数组
写在前面:自己10分钟看懂了,感觉写的很帅,收藏一下吧 出处:http://blog.csdn.net/int64ago/article/details/7429868==========================下面是原作者写的===============================写下这个标题,其实心里还是没底的,与其说是写博帖,不如说是做总结。第一个接触树状数组还是两年前,用什么转载 2016-02-21 00:42:32 · 1976 阅读 · 1 评论 -
UVALive 4487 异或 并查集
题目点这位运算很强大啊题解看着这个题解中文讲解很详细,个人感觉代码上稍微有点繁琐,但总体很容易看懂其他几个题解,代码看一眼,先来十几个define,,,GG#include<cstdio>#include<cstring>#include<iostream>using namespace std;const int N=23333,T=N-10;int n,Q,op,p,q,va,k,an原创 2016-02-11 22:22:04 · 864 阅读 · 0 评论 -
UVA 11987 几乎就是并查集= =
题目点这题意,给很多个数,每个数刚开始自己是一个集合 要求满足3中操作: 1:将i与j两个数所在的集合合并 2:将i从原来集合中移除,扔进j所在集合中 3:询问i所在的集合有多少个数字,和是多少1,3相当简单,赤裸裸的并查集就好了 麻烦的是2,并查集是单向的,只知道父亲不知道儿子 所有如果i是叶子节点无所谓 如果是父亲节点就会十分的蛋疼: 你是到另一个集合里面去了,你的儿子们呢?原创 2016-02-10 02:04:22 · 610 阅读 · 0 评论 -
UVALive 2191 水一发树状数组
题目点着题意:单点修改,区间查询,树状数组 注意输出格式,每组数据之间有回车,最后一组没有#include<cstdio>#include<cstring>#include<iostream>typedef long long LL;using namespace std;const int N=233333;int n,a[N],T[N];char st[5];void add(i原创 2016-03-07 09:30:24 · 412 阅读 · 0 评论 -
UVALive 2191电影收藏,伪-(动态)树状数组
题目点这题意: 有n个电影光盘堆成一个栈的样子,每次抽出其中一个,看完放在最上面,问每次抽出时这个光盘上面有多少光盘。分析 看了份题解的中文部分,说的不是很清楚,但有个大概方向 然后一边洗澡一边思考,,,想通了树状数组的范围是n,每抽一次电影光盘,n++, 原来的节点值是1,变成0。。第n+1个节点值变成1 也就是说,树状数组的有效范围是变化的 注意是有效范围,这个有效很重要 也就是说原创 2016-03-07 17:23:25 · 485 阅读 · 0 评论 -
UVA12299 线段树水水水,但别乱开空间= =
题目看lyc的题解。。。。 传送门 果然神的题解都不放代码的 但是一直不知道为什么错了。。。后来也不知道怎么改就过了。。。。 后来慢慢改,也不知道怎么就ac了。。。 看来敲线段树还是要仔细啊。啊啊啊啊啊啊啊啊啊啊啊啊啊单点修改,区间查询,练练非递归写法#include<cstdio>#include<cstring>#include<iostream>#include<a原创 2016-03-08 22:38:43 · 522 阅读 · 0 评论 -
UVALive 4108城市天际线,混杂着递归与非递归的线段树
题目这里题意:城市会建设很多摩天楼,从侧面看城市,新楼会把旧楼挡住(如果新楼高度>=旧楼) 每新建一栋楼,会产生一个“建设值”=挡住了多少长度的旧楼(地面看做h=0的楼) 输出建设值总和, tip:每栋楼产生的“建设值”取决于这栋楼建成之前的状态,故顺序很重要分析:数据范围10W,楼的一维范围,开一个10W的线段树。 众所周知,线段树是一颗近似的完全二叉树,为何近似呢,最下面一层有一点不均匀原创 2016-03-10 01:55:24 · 728 阅读 · 0 评论 -
UVA 11525 好大好大的排列(线段树)
题目在这题意:求1-k的排列中第n大的序列,题目给出n的计算方法: n = si*(k-1)+s2*(k-2)…+sk*0!; 并给你s1~sk**分析:**n好大好大,,,,, n是给的一个一个的阶乘和,想想:k位的排列数是k! 从0!到(k-1)!,,,似乎,对应着什么 每一个s[i]对应全排列的一位数字 (蚊子数学太弱,,,证明什么的,,,额)原创 2016-03-10 19:03:00 · 532 阅读 · 0 评论 -
Problem Joseph。。。lzl==sz
先写个链表版的,,,dp版的以后再说#include <queue>#include <cstdlib>#include <iostream>#include <cstdio>using namespace std;struct node{ int num; node *next; node (){num=0;next=NULL;}};int fun(int m,原创 2016-03-14 13:45:10 · 438 阅读 · 0 评论 -
链表:女生节快乐
好久不写指针、、、代码能力大不如从前#include<cstdio> #include<cstring>#include<cstdlib>#include<iostream>#include<algorithm>using namespace std;const int N=233;int cnt;struct node{ int num; struct node *原创 2016-03-08 00:14:41 · 665 阅读 · 0 评论 -
Splay模板 codevs1296&&codevs1286好郁闷
先存个板(未完全测试#include<cstdio>#include<algorithm>using namespace std;struct Node{ int key;//size Node *l,*r,*f;//left,right,father};class SplayTree{public: void Init(){rt=NULL;} void Z原创 2016-05-30 02:42:28 · 364 阅读 · 0 评论 -
luogu4827 梦美的线段树
梦美的线段树 题解写完被出题人喷代码丑了呜呜呜题目链接点这这题有点毒瘤啊,__int128才能过,建议食用洛谷ide介于前面三篇的都比较玄学(代码都比较丑),打算自己写一发自己写的线段树常数应该比其他几篇大一点,为了方便理解吧首先数学期望E=∑Pi∗sumi=一通操作=∑sumi2sumrtE = \sum P_i * sum_i = 一通操作 = \frac{\sum sum_...原创 2019-02-23 03:09:06 · 211 阅读 · 0 评论