02 2019 档案

摘要:题面 • 线段树维护的题,关键在于合并区间答案。 • ans 数组记录每一段区间的答案。 • 然后会发现对于每一个子序列,有两种点在当前子序列中一定满足要求: 1. 子序列中的第一个点。 2. 子序列中权值最大的点。 • 而且 pushup 时,左儿子的 ans 值会被父节点全部接受。 • 通过上面 阅读全文
posted @ 2019-02-25 23:21 Hevix 阅读(132) 评论(0) 推荐(0)
摘要:题面 • 如果没有撤销操作的话,它无非就是单纯的线段树。 • 如果加上撤销操作的话,它还可以是单纯的线段树。 • 把撤销操作看做是另一维的限制,那么修改与其对应的撤销就可以当做一个二维 的修改。 • 将询问的点取出来后建一棵 K-D tree 就可以当做线段树操作了。 1 #include<bits 阅读全文
posted @ 2019-02-25 22:57 Hevix 阅读(307) 评论(0) 推荐(0)
摘要:题面 • 平面是二维的,第 K 大是相对的。 • 单纯的 K- D 似乎并不能解决(反正我不会)。 • 第 K 大和二分是紧密相关的。 • 二分之后的判定就是一个二维数点问题。 • 所以我们可以线段树套 K-D tree 。 1 #include<bits/stdc++.h> 2 #define l 阅读全文
posted @ 2019-02-25 22:40 Hevix 阅读(226) 评论(0) 推荐(0)
摘要:• 通过 K-D tree 和一个优先队列,可以查询距离一个钦定点第 K 远的点。 • 具体操作看起来似乎比较暴力。 1. 首先将 K 个 “ 空 ” 的值存入队列。 2. 暴力 dfs K-D tree 更新队列。 • 所有点对中的第 K 远点对显然只需要将队列全局化。 P2093 [国家集训队] 阅读全文
posted @ 2019-02-25 22:19 Hevix 阅读(308) 评论(0) 推荐(0)
摘要:题目 • 很容易想到分块。 • 类似于区间众数的操作。 • 首先预处理出两个数组: 1. f 二维数组表示两个块为左右边界的序列的答案。 2. s 二维数组处理出从第一个块到某一个块之间每 个数出现的次数。 • 对于询问其实和预处理 f 数组的做法差不多。 1 #include<bits/stdc+ 阅读全文
posted @ 2019-02-24 21:39 Hevix 阅读(188) 评论(0) 推荐(0)
摘要:要求在平面直角坐标系下维护两个操作: 1.在平面上加入一条线段。记第 i 条被插入的线段的标号为 i 2.给定一个数 k,询问与直线 x = k 相交的线段中,交点最靠上的线段的编号。 • 沿用线段树的一般套路,保存的线段信息为线段的表达式。 • 更新线段的过程: 1.在线段树中找到该线段对应的区间 阅读全文
posted @ 2019-02-24 12:07 Hevix 阅读(349) 评论(0) 推荐(0)
摘要:启发式合并是对集合合并类问题的一种高效处理方式。 • 通常启发式合并优化的是合并多个相同数据结构的时间,通过暴力的合并来 将两个相同的数据结构合并,从而使得维护的零散信息(性质)逐渐合一。 • 举个十分简单的例子:起初有 n 个数组,且每个数组有且仅有 1 个数,接下 来有 n-1 个指令,需要你每 阅读全文
posted @ 2019-02-24 11:29 Hevix 阅读(151) 评论(0) 推荐(0)
摘要:P3834 【模板】可持久化线段树 1(主席树) 静态区间第k小。 主席树模板题 1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,m,x,y,k; 4 struct node 5 { 6 int l,r,sum; 7 }num[340 阅读全文
posted @ 2019-02-24 10:54 Hevix 阅读(865) 评论(1) 推荐(0)
摘要:题面 将树上的路径包含问题通过dfs序转换为双关键字区间包含问题, 进而转换为区间覆盖类问题。 由此,我们可以通过二分得出每一个询问的答案。 由于有多次询问,故只需要整体二分即可。 1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,p, 阅读全文
posted @ 2019-02-20 19:27 Hevix 阅读(152) 评论(0) 推荐(0)
摘要:题面 作为一道经典的点分治题目,此题能很好的考察对点分治的运用。 个人认为点分治的本质在于:对于树上近乎n2 的路径询问,通过有效的 划分,使之能在稳定的时间内通过 存储信息——获取信息 的经典方式来求 出答案。 由此看出点分治的关键在于存储信息与获取信息的方式。 点分治的模板套上之后我们只需要考虑 阅读全文
posted @ 2019-02-20 13:19 Hevix 阅读(207) 评论(0) 推荐(0)
摘要:题目描述 白云和白兔想占领一棵树。白云列举了游戏玩法:∙ 首先,白云任意选择一个结点𝑘,把这个结点占领,其它结点都未本占领。 每一轮,白云可以选择若干个已经被占领的点,然后分别从每个点出发,找一条出边,把到达的结点占领。∙ 当所有结点都被占领时游戏结束。 白兔想知道,选择一个最优的𝑘,白云最少几 阅读全文
posted @ 2019-02-15 17:06 Hevix 阅读(353) 评论(0) 推荐(0)
摘要:题面 • get到一种 hash 乱搞。 • 考虑题目要求如何在 hash 值中得以体现。 • 为每个数赋上一个 hash 值,使得同一类数的 hash 值为零。 • 那么满足要求的序列的 hash 值之和一定为零。 1 #include<bits/stdc++.h> 2 #define ll un 阅读全文
posted @ 2019-02-15 16:30 Hevix 阅读(215) 评论(0) 推荐(0)
摘要:题面 • 提一下静态区间第k小的nlog2n的做法: 1. 建关于排名的主席树(按排名顺序建树)。 2. 二分答案。 • 这样做静态区间第k小的虽然有些ZZ,但它的意义在于将线段树 维护的对象改变了。 1 #include<bits/stdc++.h> 2 using namespace std; 阅读全文
posted @ 2019-02-14 18:17 Hevix 阅读(175) 评论(0) 推荐(0)
摘要:P3521 [POI2011]ROT-Tree Rotations 本题可以通过合并数据结构解决。 权值线段树合并的时间复杂度为O(nlogn)。 证明: • n个节点相互独立。 • 考虑合并节点的意义:两棵线段树在当前区间内都有值且新的树在当前区间的值相对原来两棵树的值都增加了。 • 说明对于一个 阅读全文
posted @ 2019-02-13 19:24 Hevix 阅读(147) 评论(0) 推荐(0)
摘要:https://www.luogu.org/problemnew/show/P3332 题目描述 有N个位置,M个操作。操作有两种,每次操作如果是: 1 a b c:表示在第a个位置到第b个位置,每个位置加上一个数c 2 a b c:表示询问从第a个位置到第b个位置,第C大的数是多少。 输入输出格式 阅读全文
posted @ 2019-02-11 17:06 Hevix 阅读(122) 评论(0) 推荐(0)
摘要:题目描述 给定一个由 n 个点和 n-1 条边构成的连通图(即为一棵树)。每条边都有一个权值,表示该边的长度。除了原本存在 n-1 条边,在这棵树上,还存在着 m 条捷径。每条捷径可以用五元组( u1,v1 ,u2 ,v2 ,L )表示:在树上路径( u2,v2 )上的每个点到树上路径( u1,v1 阅读全文
posted @ 2019-02-11 16:25 Hevix 阅读(227) 评论(0) 推荐(0)
摘要:题目描述 有 n 座城市,城市之间建立了 m 条有向的地下通道。你需要发起若干轮轰炸,每轮可以轰炸任意多个城市。但每次轰炸的城市中,不能存在两个不同的城市 i,j 满足可以通过地道从城市 i 到达城市 j。你需要求出最少需要多少轮可以对每座城市都进行至少一次轰炸。 输入数据 第一行两个整数 n,m。 阅读全文
posted @ 2019-02-11 16:19 Hevix 阅读(234) 评论(0) 推荐(0)