数据结构
ttoobne
for the times they are a-changin'
展开
-
带权并查集
以前写过带权并查集的题目,自己琢磨半天判断了很多情况,最后终于能过题了,但是写法之麻烦实在是没法保证再写一次也不会出错。看网上的博客才发现能够有简单许多的方法来搞定带权并查集。首先就是获取祖先的函数,这个函数中与普通的并查集唯一的不同之处就是更新 dis 数组的部分,dis 中存的为该点到其祖先的距离。int get_root(int x){ if(father[x] == x...原创 2019-03-27 15:32:12 · 512 阅读 · 0 评论 -
杭电多校第六场 E Snowy Smile (线段树维护二维最大子段和)
题目链接题解:枚举上下边界,用线段树维护区间最大子段和。具体的,首先枚举下界,固定下界的情况下,上界的枚举与计算答案并更新可以 O(n) 完成。代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;typedef unsigned long long ull;#define...原创 2019-08-09 19:52:40 · 343 阅读 · 0 评论 -
线段树yy(线段树维护括号序列+LCA)
没有题目链接一颗有 n 个节点的树,q 组询问,支持两种操作:1.单点修改 2.路径求和。(1 <= n, Q <= 1e5)题解:用 dfs 建出树的括号序列(好像也叫欧拉序),用基本的线段树维护这个括号序列,每个点在括号序列中为左括号时在线段树中加上该点权值,为右括号的位置减去该点权值,那么在一条路径中从起始点左括号到终点左括号一定包含路径中的每个点,并且不包含不再路径...原创 2019-08-15 09:18:11 · 497 阅读 · 0 评论 -
HDU6703 CCPC-网络赛 1002 array (主席树 + set)/(权值线段树)
题目链接题解:由于序列所有元素都是唯一的,在 1 ~ n 的范围内。可以用主席树维护权值,查询在树中 ala_lal 到 ara_rar 区间大于等于 k 的最小的数,但是还有操作 1。操作 1 可以视为为操作 2 提供答案(因为加了一个很大的值,查询保证 k≤nk\leq nk≤n,那加了之后的值就查不到了),这样的话进行操作 1 ,就将 aposa_{pos}apos 插入 set...原创 2019-08-23 21:51:37 · 425 阅读 · 5 评论 -
CodeForces - 840D Destiny (主席树)
题目链接题解:由于每次查询的符合条件的数字不会达到k 个(k <= 5),所以大胆用主席树暴力往下左右子树都查符合条件的解即可。每次查询时间复杂度O(k*logn)。代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;typedef unsigned long long...原创 2019-08-11 11:22:02 · 373 阅读 · 0 评论 -
HDU6704 CCPC网络赛 K-th occurrence (后缀数组 + ST表 + 主席树)
添加链接描述题解:一般这种和子串有关的都能扯到后缀数组,由于要找一个子串第 k 个出现的位置,所以先确定范围,一个子串若在原串中出现 x 次,那么这 x 个以该子串开头的后缀一定在所有的后缀中排名是连续的,并且在这些区间内所有的后缀的前缀都是该子串。所以就可以先求出后缀数组 sa 和 lcp 的 height 数组,接着对于每次查询先二分该子串所在排名的满足条件的最左区间与最右区间,可以用ST...原创 2019-08-24 21:26:57 · 231 阅读 · 0 评论 -
2019牛客暑期多校训练营(第九场)H Cutting Bamboos(二分+主席树)
题目链接题解:我们可以二分砍到的高度,那么怎么求 L 到 R 区间内一个高度能砍掉的竹子呢?那么可以用一颗可持久化线段树来使区间的高度变得有序。具体的,用主席树维护区间的高度之和与区间每个高度出现的次数。每次可以计算出高于二分高度的和 sum 与出现次数 num,那么剪掉的部分就是 sum - 二分的高度 * num 。那么就直接二分了。代码:#include <bit...原创 2019-08-16 08:44:53 · 215 阅读 · 0 评论 -
2019牛客暑期多校训练营(第八场)A All-one Matrices(单调栈)
题目链接题解:先求出每列与每行的前缀和,然后逐行计算答案。具体的,枚举每行每个点,单调栈求出以该点往上的高度往左往右能够扩展的左右边界 L 和 R。然后判断该点下一行的 L 到 R 之间是不是都被 1 占满,如果不是,则答案加一。由于每个矩形底边的元素都会重复计算一次,则用哈希去重即可。代码:#include <bits/stdc++.h>using nam...原创 2019-08-12 14:36:20 · 274 阅读 · 0 评论 -
CodeForces - 786B (线段树?优化建图最短路)
题目链接题解:这道题太神仙了!由于有整个区间指向点的边和点指向一整个区间的边,所以边数它爆炸了。那么怎么样可以将边数减下来呢?这里以一个点连向一个区间的点为例子,我们可以建立一颗线段树,每个点代表一个区间,每个区间连一条边到它的各个子区间,边权为 0 ,然后将叶子节点连向各个原始的节点。那么要增加一个点连向一个区间的边就变成了这个点连向这个区间所包含的线段树中的节点即可。同样,增加一个区...原创 2019-08-21 15:25:08 · 227 阅读 · 0 评论 -
线段树yy (线段树维护等比数列的和)
没有题目链接一个长度为 n 的序列,Q 次操作:对于区间 l 到 r 的所有位置 i,a[i]+=bi−la[i]+=b^{i - l}a[i]+=bi−l求区间 l 到 r 的和 mod 1e9 + 7对于所有操作,b 不变。(1 <= n, Q <= 1e5, 1 < b <= 1e9)题解:由于每次加的是一个等比数列,那么可以将等比数列的首项作为下传标...原创 2019-08-16 14:42:33 · 843 阅读 · 1 评论 -
2019牛客暑期多校训练营(第七场)E Find the median (线段树维护离散化后的区间)
题目链接题解:由于区间范围较大,考虑离线将区间离散化,那么可以利用线段树存左闭右开区间,每次更新时为两个操作:将 L~ R - 1 区间更新,将 R 单点更新。代码:#include <bits/stdc++.h>using namespace std; typedef long long ll;typedef unsigned long long ull;...原创 2019-08-12 21:02:28 · 208 阅读 · 1 评论 -
BZOJ-3674 可持久化并查集加强版 (主席树+并查集按秩合并)
题目链接题解:主席树维护并查集的 father 数组以及它的历史状态。我觉得比较难搞得是按秩合并,我看网上其他人的代码觉得合并的好奇怪,然后我按照自己的想法合并觉得更奇怪,但是最奇怪的是它竟然过了?!我怀疑是不是数据水了,然后去 洛谷 和 acwing 交了一下,竟然都过了?这里由于按秩合并优化是不影响答案的正确性的,所以我合并部分的正确与否先保留。(因为我觉得我合并时会将以前的版本中的节...原创 2019-09-03 12:16:50 · 197 阅读 · 0 评论 -
poj 3667 (线段树区间合并)
题意:一家旅馆共有N个房间,这N个房间是连成一排的,标号为1-N。现在有很多旅客以组为单位前来入住,每组旅客的数量可以用DiDi来表示。旅店的业务分为两种,入住和退房:1、旅客入住时,第i组旅客需要根据他们的人数DiDi,给他们安排DiDi个连续的房间,并且房间号要尽可能的小。如果房间不够,则无法安排。2、旅客退房时,第i组旅客的账单将包含两个参数XiXi和DiDi,你需要将房...原创 2019-08-07 17:23:42 · 428 阅读 · 1 评论 -
2019牛客暑期多校训练营(第八场)D Distance (三维树状数组)
题目链接题解:求最小曼哈顿距离,可以用给定范围的最大立方体的八个顶点建立八个树状数组,分别维护距离该顶点的曼哈顿距离的最大值。出题人给的正解不是这种方法,效率更高,但是树状数组常数很小,也能达到令人满意的时间消耗。代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;...原创 2019-08-14 08:40:05 · 287 阅读 · 0 评论 -
HDU2665 (主席树)
题目链接题解:主席树模板题。#include <cstdio>#include <cmath>#include <cstdlib>#include <cstring>#include <algorithm>#include <iostream>#include <string>#incl...原创 2019-02-26 17:45:13 · 213 阅读 · 0 评论 -
HDU - 3974 Assign the task (线段树 + dfs)
题目链接题意:一个公司中有一种制度:如果老板被分配到一个任务,那么他会把任务分配给他的直接员工,员工中如果是其他人的老板,那么该员工的员工也将被分配到这个任务。这个公司中有 n 个人,给 m 此操作,T x y 代表给 x 分配的任务是 y,C x 代表查询 x 的任务。题解:我一开始是没有思路的,看了别人的解题思路才知道,如果对一棵树 dfs 的过程中一个点访问了两次,那么从...原创 2018-11-25 12:12:56 · 247 阅读 · 1 评论 -
POJ - 2528 Mayor's posters (线段树 + 离散化)
题目链接题意:给 n 个海报,顺序贴上去,后贴的海报会覆盖之前的海报,问最后能看见的海报种类数。题解:最近把线段树又看了一遍,感觉对线段树的理解加深了一些。(之前连理解都有问题,还是太菜了TAT)这道题显然暴力去更新是会超时的,那么可以想到用线段树来解决,之前也做过一个类似的数颜色,这道题有所不同的是数据量太大,但是海报数量却并不多,所以可以离散化处理。然而普通的离散化...原创 2018-11-23 12:25:45 · 146 阅读 · 0 评论 -
CodeForces - 652D Nested Segments (树状数组 + 离散化)
题目链接题意:给 n 个区间,求每个区间包含多少子区间。题解:将每个区间的 r 存进树状数组里,然后对每个区间的 l从大到小进行排序,每次查询时查的一定是比自己 l 大的,并且比自己 r 小的,即自己的子区间。由于数字比较大,需要离散化处理。代码:#include<cstdio>#include<iostream>#include<al...原创 2018-08-22 11:24:49 · 299 阅读 · 0 评论 -
HDU - 6315 Naive Operations (区间线段树)
题目链接题意:一段序列每一个元素有一个分母值和一个分子值,初始分子值为 0 ,给定一个分母值,可以进行以下操作:1. add l r : add one foral,al+1...aral,al+1...ar 从 l 到 r 每个元素分子值加 1。2. query l r : query∑ri=l⌊ai/bi⌋ 询问从 l 到 r 区间内分子除以分母的和。题解:用一...原创 2018-08-22 08:28:43 · 197 阅读 · 0 评论 -
ZOJ - 3261 Connections in Galaxy War (逆向并查集 离线操作)
题目链接题意:有n个星球(编号 0 ~ n ),每个星球都有自己的power值,有m条线连接着星球,接下来有q个操作要求如下:"destroy a b" 破坏a与b之间的连接。"query a" 询问与a星球直接或间接连接的星球中power值最大的星球的编号,如果power值相同,则输出最小的编号。题解:思路:这题看到直接或间接连接就想到并查集,但是并查集没办法维...原创 2018-08-03 18:01:20 · 310 阅读 · 0 评论 -
1239: Easy的队列 (单调队列)
题目描述 Easy的学生的《数据结构》考试挂掉了,他求着Easy再给他一次机会,Easy出了这么一道题,如果他的学生做出来就给这个学生一次重新考试的机会,题目是这样的:维护一个名为队列的数据结构,支持以下四种操作:ENQUEUE x将值为x的元素放入队列的尾部DEQUEUE输出当前队列首部的元素之后删除队列首部的元素MAX输出当前队列中的最大值,若队列为空...原创 2018-07-31 20:04:44 · 217 阅读 · 0 评论 -
南昌网络赛 Max answer(单调栈 + 线段树维护前缀和最大最小值)
题目链接题意:给一串序列,要求选任意连续的一段区间,使得这一段区间中最小值乘以区间总和尽量大。题解:首先先单调栈求出每个数字作为最小值所在的区间。如果数据范围只有正数那么只用单调栈就可以解决,但是数据有负数,那么怎么高效查询使得总乘积最大的区间呢?那么这时候我们可以用线段树维护前缀和的最大最小值,要使得负数乘以一个数尽量大,那么这个数就得尽量小。前缀和能够 O(1) 的...原创 2019-04-24 09:36:21 · 503 阅读 · 0 评论 -
校赛题解
A.CQW又迟到了水题。#include <bits/stdc++.h>using namespace std;typedef long long ll;#define int ll#define INF 0x3f3f3f3f3f3f3f3f#define fastio ios::sync_with_stdio(false), cin.tie(0)cons...原创 2019-05-13 19:39:12 · 303 阅读 · 0 评论 -
POJ 1417(带权并查集 + dp 记录路径)
题意:一个岛上存在着两种居民,一种是天神,一种是恶魔。天神永远都不会说假话,而恶魔永远都不会说真话。岛上的每一个成员都有一个整数编号(类似于身份证号,用以区分每个成员)。现在你拥有n次提问的机会,但是问题的内容只能是向其中一个居民询问另一个居民是否是天神,请你根据收集的回答判断各个居民的身份。题解:不难发现,如果输入 a b yes 则表示 a 与 b 在同一个种族, a ...原创 2019-08-07 09:48:59 · 320 阅读 · 0 评论 -
牛客练习赛37B 筱玛的排列(字典树 + dfs)
题目链接题解:由于 nnn 最大有 20,那所有从 1 到 n 的情况有 C2nnC_{2n}^nC2nn 种情况,肯定不能暴力搜索,那么我们可以把图分成两个部分来搜索,分别从 (1,1)(1,1)(1,1) , (n,n)(n,n)(n,n) 开始走 nnn 步到对角线上,然后用字典树求最大异或和就行啦。代码:#include <bits/stdc++.h>using n...原创 2019-09-12 22:18:09 · 194 阅读 · 0 评论