数据结构
meopass
即使摸爬滚打,满身泥泞,我也要前进
展开
-
codeforces610D 矩形面积并
点相当于格,则先将右上角坐标x++, y++,将格转化成点。原问题等价于矩形面积并。 扫描线解决即可,枚举y扫描线,需要离散化x坐标轴。对于x坐标轴的离散化,需要将线段树原有的[l,r]闭区间转化成[l, r)左开右闭区间。这样每一点都代表一段区间V[r+1] - V[l]。#include <bits/stdc++.h>using namespace std;#define all(x) x.原创 2017-08-16 15:39:15 · 211 阅读 · 0 评论 -
codeforces 893F Subtree Minimum Query 线段树合并
简略题意:树上每个点存在一个点权,边权为1,每次询问点x的子树中,距离x小于等于k的所有点中最小值是多少。强制在线,老老实实考虑数据结构解法…对每个节点维护一棵线段树即可,父亲节点的线段树由自己本身和所有儿子节点合并而成。对每个点用其深度表示其在线段树对应的位置。用到的只有单点更新,区间查询,合并。 qls:“线段树合并对如闪电!”#define poj#ifdef poj#include <原创 2017-11-25 23:21:36 · 421 阅读 · 0 评论 -
codeforces 895E Eyes Closed 线段树 期望 数学
简略题意: 两种操作。 1. [l1, r1]之间随机一个数,[l2, r2]之间随机一个数,把两个交换 2. 问[l, r]区间和的数学期望是多少。先考虑左部分区间,假设其总和为sum1sum1, 长度为len1len1, 右部分区间总和为sum2sum2,长度为len2len2。 那么对于左区间随机一个数xx,进行操作后的数学期望值为: len1−1len1∗x+1len1∗sum2l原创 2017-11-27 16:34:12 · 679 阅读 · 0 评论 -
HDU 6305 RMQ Similar Sequence
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6305意识到RMQ相同的含义就是序列的相对大小关系保持一致,而相同的大小关系建立出的笛卡尔树相同(特殊的不是笛卡尔树,而是建树的方式)。 考虑B数组的排列中能够符合A数组构成的笛卡尔树的概率为1/∏sz[i]1/∏sz[i]1/\prod sz[i],可以简单理解为,在对应笛卡尔树的节点上,当前位...原创 2018-07-29 01:32:09 · 232 阅读 · 0 评论 -
牛客多校第3场:C Shuffle Cards
https://www.nowcoder.com/acm/contest/141#question之所以补这题,是因为第一次使用rope,这是一个可持久化平衡树。 不过本题没有用到可持久化就是了,平衡树的split和merge。#define others#ifdef poj#include &amp;lt;iostream&amp;gt;#include &amp;lt;cstring&amp;gt;#inc...原创 2018-07-27 12:53:50 · 247 阅读 · 0 评论 -
字符串学习:字符串算法选讲-金策
周期和border0&amp;lt;q≤|s|,s[i]=s[i+p],∀i∈1...|s|−p0&amp;lt;q≤|s|,s[i]=s[i+p],∀i∈1...|s|−p0 &lt; q \le |s|, s[i] = s[i+p], \forall i \in {1...|s|- p}, ppp就是sss的周期。 0≤r≤|s|,pre(s,r)=suf(s,r),pre(s,r)0≤r≤|s|,pre(s...原创 2018-09-08 21:28:53 · 1627 阅读 · 0 评论 -
KD树练习
BZOJ 4066 单点修改,区间求和 BZOJ 3132 BZOJ1941 最近点对与最短点对 BZOJ 4303原创 2018-09-09 23:51:51 · 636 阅读 · 0 评论 -
2018沈阳网络赛:J kachang KD树
把每个点建立(dfs序,depth),所有操作和查询转化为矩形操作,用KD树就可以n(√n)n(n)n\sqrt(n)完成了。#include <bits/stdc++.h>using namespace std;typedef long long LL;const LL maxn = 110000;const LL INF = 1e18;const LL dimen...原创 2018-09-10 00:21:19 · 656 阅读 · 0 评论 -
HDU 6203 贪心 + LCA + dfs序 + BIT
简要题意:给出一个n+1n+1个点的树,以及若干个点对,需要断开一些点,使得这些点对路径不连通。输出应该断开的最少点数。我们断开一个点,能够影响到的是: 1.1.子树中过这个点的路径. 2.2.一个点在子树中,另一个点在祖先中的路径。为了使得以上两个影响尽可能的大,我们每次需要使得断开的点的子树尽可能大。 因此当我们打算断开一对点对(u,v)(u, v)的时候,为了使得断开的点的影响尽可能大,原创 2017-09-21 17:51:14 · 297 阅读 · 0 评论 -
BZOJ 2588 LCA + 主席树
简略题意:树上路径第K大。经典的LCA + 主席树问题。每次以父亲节点为上一版本建树,对于一次询问的答案就是在区间x−lca[x,y]+y−fa[lca[x,y]]x - lca[x, y] + y - fa[lca[x, y]]的答案。A了这题可以看一下加强版。#include <bits/stdc++.h>#define all(x) x.begin(), x.end()using name原创 2017-09-19 20:11:13 · 314 阅读 · 0 评论 -
BZOJ 2212 线段树启发式合并
简略题意:现在有一棵二叉树,所有非叶子节点都有两个孩子。在每个叶子节点上有一个权值(有n个叶子节点,满足这些权值为1..n的一个排列)。可以任意交换每个非叶子节点的左右孩子。要求进行一系列交换,使得最终所有叶子节点的权值按照遍历序写出来,逆序对个数最少。考虑题中的唯一操作,交换两个孩子。 对每个节点考虑两个孩子对答案的贡献:左孩子的贡献 + 右孩子的贡献 + 左孩子比右孩子大产生的贡献。 交换两原创 2017-09-19 17:14:33 · 503 阅读 · 0 评论 -
HDU6096 ac自动机+fail树
题目问每个”prefix + ’ ’ + suffix”类型的串能匹配上多少个串S。 可以做处理将”prefix + ’ ’ + suffix” 转化为 “suffix + ‘@’ + prefix”类型的串,然后把所有S串扩充成”S + @ + S”串。 问题就转化成了,给定m个串,问每个串是多少个s串的子串。 首先不考虑前缀后缀不允许重合的条件。 将m个串建ac自动机,分别用n个串去匹配原创 2017-08-18 13:01:24 · 414 阅读 · 0 评论 -
笛卡尔树
笛卡尔树是一种treap,她有两种权值:key和val。 1. 对于key权值,她有二叉搜索树的性质。 2. 对于val权值,她有大顶堆的性质。因此我们可以对key排序之后,每次建树插入新节点就只需要考虑树上靠右的那条链即可。每次插入一个新节点,我们找到链上靠近叶子节点的,第一个val大于她的节点,插在她的右子部分即可。 我们可以维护一个单调栈来完成这个操作,易知栈顶元素靠近叶子节点,栈底元素原创 2017-08-26 09:48:53 · 312 阅读 · 0 评论 -
HDU6183 cdq分治+线段树
简要题意: 1. 每次给(x,y)染上颜色c(x, y)染上颜色c。 2. 询问x∈[1,X]y∈[y1,y2]这个矩形内部的颜色种类x \in [1, X] y \in [y1, y2]这个矩形内部的颜色种类。对于一个修改能够影响的询问,是在这个修改之后的所有xx坐标大于当前修改位置的询问。 每次询问需要回答的就是xx在小于当前位置的,且时间早于当前位置的那些修改中,[y1,y2]部分的答原创 2017-09-05 18:55:06 · 324 阅读 · 0 评论 -
玲珑杯Round20
“愿ACM没有由乃”1157 - 造物主的戒律每次询问给出一个基准值x。 查询有两个,第一个是区间第k小,如果大于基准值则为-1。第二个也是区间第k小,首先得查出x在对应区间的排名k,之后同上。 需要注意的是原题卡双log做法,因此比起树套树,推荐函数式线段树。#include <bits/stdc++.h>using namespace std;const int maxn = 1e6+10;原创 2017-08-27 23:35:03 · 420 阅读 · 0 评论 -
codeforces 840D Destiny 主席树
简明题意:给出一个长为n的数组,q次询问,每次问[l, r]区间出现次数超过⌊r−l+1k⌋\lfloor\frac{r-l+1}{k}\rfloor的最小数是多少,不存在返回-1。显然对每个询问建立一棵权值线段树即可,因此使用主席树。然后就没有然后了。#include <bits/stdc++.h>using namespace std;const int maxn = 310000;struct原创 2017-08-27 23:42:37 · 294 阅读 · 0 评论 -
codeforces 455E Convex hull trick
简略题意:给出n个数a[i]a[i],回答mm次询问(xi,yi)(xi, yi),每次回答f(xi,yi)f(xi, yi)是多少。 ∗f(1,j)=a[j],1≤j≤n.* f(1, j) = a[j], 1 \leq j \leq n. ∗f(i,j)=min(f(i−1,j),f(i−1,j−1))+a[j],2≤i≤n,i≤j≤n.* f(i, j) = min(f(i-1, j),原创 2017-08-30 22:51:49 · 258 阅读 · 0 评论 -
codeforces 455D 分块
简略题意:初始给出长度为nn的数组a[i]a[i], 有两种操作,共q次。 1.将a[l],a[l+1],...,a[r]中的a[r]移动到a[l]处,之后的元素后移一位.1.将a[l], a[l+1], ... , a[r]中的a[r]移动到a[l]处,之后的元素后移一位. 2.问区间[l,r]有多少数等于k.2.问区间[l, r]有多少数等于k. 要求强制在线。看起来就是个数据结构头,原创 2017-08-30 23:25:06 · 286 阅读 · 0 评论 -
BZOJ 2434 ac自动机fail树+dfs序+树状数组+离线处理
简略题意:中文题目丢链接跑先考虑建立acac自动机,PP代表当前节点为终止节点,BB代表返回父亲节点。 这样就可以O(n)O(n)建树。 问第xx个字符串在yy中出现多少次,相当于问rootroot到yy这条路径每个点不停在fail上走,能到达多少次xx。 所以我们相当于在fail树上询问,rootroot到yy这条路径上有多少点在xx的子树中。 对于一个询问,我们只需要把rootroot到原创 2017-09-08 23:40:14 · 379 阅读 · 0 评论 -
BZOJ 3123 LCA + 主席树 + 启发式合并
大致题意:有两种操作。 1. 查询节点x到节点y的路径上的第k小。 2. 连接点x和点y。需要离散化不必多说。 对于第一种操作,经典的LCA + 主席树问题。每次以父亲节点为上一版本建树,对于一次询问的答案就是在区间x−lca[x,y]+y−fa[lca[x,y]]x - lca[x, y] + y - fa[lca[x, y]]的答案。 对于第二种操作,每次启发式合并即可。对于新加入的点,原创 2017-09-18 15:17:06 · 426 阅读 · 0 评论 -
BZOJ 2653 可持久化线段树
大致题意:一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a, b从0开始标号,除法取下整。给你一个长度为n的序列s。回答Q个这样的询问:s的左端点在[a,b]之间,右端点在[c,d]之间的子序列中,最大的中位数。其中a < b < c < d。位置也从0开始标号。强制在线。对于中位数有一个性质,将所有大于等于他的数置为11, 小于他的数置为−1-1,则所有数的和00或11原创 2017-09-19 11:50:59 · 378 阅读 · 0 评论 -
2014西安区域赛G The Problem to Slow Down You 回文树
问AAA和BBB两个串中,相同的回文串的对数。为A和B建立两棵回文树,然后记录每个点的次数(也就是回文串的个数),随后分别从两棵树对应的奇长度树和偶长度树向下遍历即可,遇到相同的节点就统计答案,否则停止搜索。#define others#ifdef poj#include &amp;amp;lt;iostream&amp;amp;gt;#include &amp;amp;lt;cstring&amp;amp;gt;#in原创 2018-09-20 11:21:17 · 230 阅读 · 0 评论