
数据结构
文章平均质量分 54
数据结构
Legendout
退役ACM银牌loser
展开
-
UVA1316 Supermarket
并查集做法我们维护每个日期的最后一个空日期,如果没被占用,就直接用了。然后按收益排序,贪心即可。其他的并查集用法多见于维护集合连通性,如kruskal算法。原创 2022-07-29 16:56:24 · 270 阅读 · 0 评论 -
树状数组套权值线段树
给定一个含有 nnn 个数的序列 a1,a2…ana_1,a_2 \dots a_na1,a2…an,需要支持两种操作:第一行两个正整数 n,mn,mn,m,表示序列长度与操作个数。第二行 nnn 个整数,表示 a1,a2…ana_1,a_2 \dots a_na1,a2…an。接下来 mmm 行,每行表示一个操作,都为上述两种中的一个。对于每一次询问,输出一行一个整数表示答案。样例输出 #1提示【数据范围】对于 10%10\%10% 的数据,1≤n,m≤1001\le n,m \l原创 2022-06-28 11:34:37 · 531 阅读 · 0 评论 -
P3387 【模板】缩点
给定一个 nnn 个点 mmm 条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大。你只需要求出这个权值和。允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次。第一行两个正整数 n,mn,mn,m第二行 nnn 个整数,其中第 iii 个数 aia_iai 表示点 iii 的点权。第三至 m+2m+2m+2 行,每行两个整数 u,vu,vu,v,表示一条 u→vu\rightarrow vu→v 的有向边。共一行,最大的点权之和。样例输出 #1提示对于 100%10原创 2022-06-23 12:24:19 · 193 阅读 · 0 评论 -
单调栈 单调队列 尺取法
1:包含长度覆盖问题:C. Paint - 上海市大学生程序设计竞赛 - 十二月赛 - ECNU Online Judge2:区间求以该元素为最值的区间范围,求最大值就维护单调增栈,出栈时就代表该元素为最大值的右边界为此。反向再求一遍即可得到左右边界。求最小值时就维护单调减栈。例题:CodeCraft-22 and Codeforces Round #795 (Div. 2) D. Max GEQ Sum(单调栈+区间最值)_Jack_00_的博客-优快云博客适合求滑动窗口型最值,也原创 2022-06-22 17:17:04 · 138 阅读 · 0 评论 -
CodeCraft-22 and Codeforces Round #795 (Div. 2) D. Max GEQ Sum(单调栈+区间最值)
一眼就是比较经典的区间最大值,就是单调栈题。那么再考虑举反例:就是找出以这个数为最大值的区间内,区间和大于这个数。那么就转化为单调栈+区间最大值了。由于区间左右可伸缩,那么,我们找左半区间的时候,就可以固定查找右区间为,然后在区间内找最值,线段树维护的是后缀和;那么右半区间同理,前缀和找最值即可。最后在两半区间和找有没有大于0的,有即存在反例,无则满足条件。...原创 2022-06-21 23:46:36 · 174 阅读 · 0 评论 -
P3384 线段树维护树链剖分
【模板】轻重链剖分/树链剖分 - 洛谷树剖学习地址:树链剖分详解(洛谷模板 P3384) - ChinHhh - 博客园这次学只用了一个多小时,感觉还好,树剖也不是很难嘛~(就是代码超长没什么好讲的,人家的详解已经说得比较清楚啦,就是重新按DFS序建一棵线段树,然后在树链上跳跳,再在线段树上搞搞就行了。ps:找了好一会bug,发现是线段树上的标记改错了qaq原创 2022-06-02 12:48:37 · 157 阅读 · 0 评论 -
P2633 Count on a tree (树上主席树 LCA)
Count on a tree - 洛谷## 题目描述给定一棵 n个节点的树,每个点有一个权值。有 m个询问,每次给你 u,v,k,你需要回答 $u \text{ xor last和 v这两个节点间第 k小的点权。其中 last是上一个询问的答案,定义其初始为 0,即第一个询问的 u是明文。## 输入格式第一行两个整数 $n,m$。第二行有 $n$ 个整数,其中第 $i$ 个整数表示点 $i$ 的权值。后面 $n-1$ 行每行两个整数 $x,y$,表示点 $x$ 到...原创 2022-05-30 10:13:07 · 194 阅读 · 0 评论 -
P1972 [SDOI2009] HH的项链 (离线树状数组)
[SDOI2009] HH的项链 - 洛谷## 题目描述HH 有一串由各种漂亮的贝壳组成的项链。HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义。HH 不断地收集新的贝壳,因此,他的项链变得越来越长。 有一天,他突然提出了一个问题:某一段贝壳中,包含了多少种不同的贝壳?这个问题很难回答…… 因为项链实在是太长了。于是,他只好求助睿智的你,来解决这个问题。## 输入格式一行一个正整数 $n$,表示项链长度。 第二行 $n$ 个正整数 $...原创 2022-05-29 15:09:12 · 411 阅读 · 0 评论 -
可持续化权值线段树
可持久化线段树 - OI Wiki看图是很好理解的。但具体的实现逻辑见代码注释。例题:【模板】可持久化线段树 2 - 洛谷/*keep on going and never give up*/#include<bits/stdc++.h>using namespace std;#define int long long#define ll long long#define db(x) cerr<<(#x)<<" "<<(x)<&l原创 2022-05-25 13:01:56 · 148 阅读 · 0 评论 -
树状数组
算是重新梳理了一下吧,搞了点优化,和k大/小的trick。今天再把主席树搞下来,数据结构就不想多搞了,去搞图论,寄算寄何,字符串了。哦对,还有st表。算了,感觉可以用树状数组平替掉。哦还有二维线段树,树套树,二维数点什么的不会。真让人头秃。来个板子:/*keep on going and never give up*/#include<bits/stdc++.h>using namespace std;#define int long long#define M原创 2022-05-22 11:30:10 · 57 阅读 · 0 评论 -
权值线段树
可以参考这篇博客的易懂图解。数据结构 线段树--权值线段树 详解_HeartFireY的博客-优快云博客_权值线段树权值线段树即维护数出现的次数的线段树。区间可设为数的大小,为了减小复杂度,可以离散化。由于是动态维护,需要像扫描线一样动态开点。这样的线段树主要用来下求第k大/小的信息。板子:/*keep on going and never give up*/#include<bits/stdc++.h>using namespace std;#define i原创 2022-05-21 21:04:50 · 1469 阅读 · 0 评论 -
扫描线 (线段树)
【模板】扫描线 - 洛谷昨天脑子不好使,拖了一天才搞懂啊。其实就是按高度排序后维护行的宽度吧。那么只有两种情况:当前节点的cnt>0和==0的情况。前一种对应整段都覆盖,因为我们只对全覆盖的线段++cnt;所以都加上。后一种对应其他情况,统计子节点即可。因为我们最多更改到当前节点,所以子节点的信息是正确的。/*keep on going and never give up*/#include<bits/stdc++.h>using namespace std;原创 2022-05-18 20:00:04 · 187 阅读 · 0 评论 -
P4588 [TJOI2018]数学计算 (思维 线段树)
[TJOI2018]数学计算 - 洛谷直接模拟,显然是不行的,精度肯定会出问题,连续搞两个1e9的数据就回不来了。考虑把时间作为坐标,那么乘以一个数和除一个数就是单点修改,求当前x就是区间查询,得解。/*keep on going and never give up*/#include<bits/stdc++.h>using namespace std;#define int long long#define ll long long#define db(x) cerr&原创 2022-05-17 20:37:07 · 186 阅读 · 0 评论 -
树上启发式合并详解 dsu on tree (图论)
算法简介:在支持离线查询的与子树有关的题目中可以离线处理每个点的信息然后查询。常见的题目有查询某子树颜色数量即相关信息。算法思想:考虑最简单的处理方法:对每个点都遍历一次子树所有节点求相关信息,复杂度为,明显没有实际应用意义。仔细思考过程,我们可以发现每个点的信息求出来了之后,只对当前子树和父节点有作用,对其同深度的子树没有任何意义,反而我们还需要求一遍之后清除记录之后才能求其他点的信息,不然会冲突。此时算法的瓶颈出现了:遍历的不可避免,能不能把每个点的求解降复杂度呢?想想求解的原创 2022-05-03 22:46:38 · 515 阅读 · 0 评论 -
D. Optimal Partition ( 树状数组优化dp )
Problem - D - Codeforces题意:给出一个长度为n的数组a,现在需要将该数组分成任意段,每段的贡献为:问你贡献最大和。题解:首先分析一下:设一段区间和为sum;当sum<0时,我们把他们拆成一段段区间为1,贡献只大不小;sum==0时,我们从中间拆开,假如两段都小于零,那么总贡献不变;假如有大于0的,那么总值变大;再把小于0的子区间做如下拆分,最后都会变成大于0的区间和小于0且长度为1的区间。那么只剩下sum>0的区间了。显然满足dp性质,原创 2022-04-29 20:28:50 · 975 阅读 · 0 评论 -
点分治详解 ( 数据结构 )
啦啦啦,更新啦~学习笔记: 前置知识:树的重心、线段树等类似数据结构。点分治是一种十分高效的树上路径查询的数据结构,能在复杂度内查询所有路径信息。它与线段树和分块的思想十分相似,用已求出的信息来帮助处理之后需要求的信息。那么在树上呢,我们就可以先dfs一遍,然后用求出的dis信息来求解路径信息。那么我们把所有的路径分为两种:经过当前根节点的和不经过当前根节点的。后者可以递归根节点转化为前者。具体语境下求的东西不一样,这里介绍模板中距离小于k和等于k的做法。算法流程:...原创 2022-04-27 12:52:47 · 3843 阅读 · 0 评论 -
CF1659E AND-MEX Walk (图论 并查集 思维 MEX)
Problem - E - Codeforces题意:给定一个无向带权图,总共有nn个点mm条边,选定一个起点uu和终点vv,现在你需要确定一条路径,设路径上的kk条边的边权为w_1,w_2,\dots,w_kw1,w2,…,wk,求出 MEX({w_1,w_1 & w_2,w_1&w_2&w_3,w_1&w_2&w_k}的最小值。其中 MEX 指集合中最小的不存在的自然数。数据范围:n,m\le 10^5n,m≤1...原创 2022-04-26 22:14:04 · 504 阅读 · 2 评论 -
Cards (并查集 dp)
F - Cards题意:给你n个卡片,每个卡片正背面各有一个数字,大小为1到n,问你有多少种选法让选出的情况使1到n都出现过。题解:看到这种情况肯定想到dp。但是怎么dp呢。考虑在卡片上两个数字连一条边,...原创 2022-04-20 22:00:30 · 327 阅读 · 0 评论 -
妄想集合(并查集 数学)
链接:登录—专业IT笔试面试备考平台_牛客网题目描述开始有nnn个可重集合,开始时每一个集合中都有一个数,有mmm个操作。Quantlrx\text{Quant l r x}Quantlrx:往编号在l∼rl\sim rl∼r的每个集合中加入一个数xxx。 Asklr\text{Ask l r}Asklr:询问能否从l∼rl\sim rl∼r的集合中取出三个数使得他们能作为边长组成一个三角形(即最小两个和要大于最大的)。输入描述:第一行两个整数n...原创 2022-04-16 23:29:08 · 1141 阅读 · 0 评论 -
CF372C Watching Fireworks is Fun (单调队列优化dp)
Problem - 372C - Codeforces题目大意:城镇中有n个位置,有 m个烟花要放。第i个烟花放出的时间记为 t,放出的位置记为a 。如果烟花放出的时候,你处在位置x,那么你将收获b-abs(a-x)点快乐值。初始你可在任意位置,你每个单位时间可以移动不大于d 个单位距离。现在你需要最大化你能获得的快乐值。(1 ≤ n ≤ 150000; 1 ≤ m ≤ 300; 1 ≤ d ≤ n).题解:怎么dp呢......设一维时间,一维位置,差不多了。但是位置有点大,如果.原创 2022-04-04 21:47:49 · 330 阅读 · 0 评论 -
P3812 线性基详解
【模板】线性基 - 洛谷将若干个数异或起来的的最大值是多少?题解:这里我们还是采用贪心的思想,从最高位开始异或,一直向下。这里我们可以使用线性基来保存二进制下的信息。void insert(int x){ for(int i=62;i>=0;i--){ if((x>>i)&1){ if(!p[i]) { p[i]=x; break; } x^=p[i]; } }}这样线性基就具有以下性质:1:查询是否能被其他数异或出原创 2022-04-03 12:19:30 · 486 阅读 · 0 评论 -
Poj2024 NOI2001 食物链(扩展域并查集)
原题链接:1182 -- 食物链题意:动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B, B吃C,C吃A。现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种。有人用两种说法对这N个动物所构成的食物链关系进行描述:第一种说法是"1 X Y",表示X和Y是同类。第二种说法是"2 X Y",表示X吃Y。此人对N个动物,用上述两种说法,一句接一句地说出K句话,这K句话有的是真的,有的是假的。当一句话满足下列三条之一时,这句话就是假话原创 2022-03-29 15:40:17 · 153 阅读 · 0 评论 -
P2251 质量检测(ST表 单调队列)
题目描述为了检测生产流水线上总共NN件产品的质量,我们首先给每一件产品打一个分数AA表示其品质,然后统计前MM件产品中质量最差的产品的分值Q[m] = min\{A_1, A_2, ... A_m\}Q[m]=min{A1,A2,...Am},以及第 2 至第M + 1M+1件的Q[m + 1], Q[m + 2]Q[m+1],Q[m+2]... 最后统计第N - M + 1N−M+1至第NN件的Q[n]Q[n]。根据QQ再做进一步评估。请你尽快求出QQ序...原创 2022-03-25 19:07:34 · 193 阅读 · 0 评论 -
牛客练习赛97 哦~唔西迪西小姐~ (优先队列 贪心)
链接:登录—专业IT笔试面试备考平台_牛客网来源:牛客网题目描述唔西迪西现在正处在一个冰火迷宫中,迷宫由nnn个格子组成,每个格子要么是冰之格,要么是火之格,唔西迪西刚开始可以选择从迷宫中任意一个开始走,走到第iii个位置时会得到值为aia_iai的积分。(注意:唔西迪西也可以选择一个格子都不走)如果唔西迪西当前在冰之格,那么她可以选择一个编号大于当前格子的冰之格,跳到那里。如果唔西迪西当前在火之格,那么她可以选择一个编号大于当前格子的火之格,跳到那里。如果唔西迪西目前没有格...原创 2022-03-22 22:13:29 · 361 阅读 · 0 评论 -
P2922 [USACO08DEC]Secret Message G (字典树 trie)
[USACO08DEC]Secret Message G - 洛谷题意贝茜正在领导奶牛们逃跑.为了联络,奶牛们互相发送秘密信息.信息是二进制的,共有 MM(1 \le M \le 500001≤M≤50000)条,反间谍能力很强的约翰已经部分拦截了这些信息,知道了第 ii 条二进制信息的前 b_ibi(l \le b_i \le 10000l≤bi≤10000)位,他同时知道,奶牛使用 NN(1 \le N \le 500001≤N≤50000)条暗号.但是,他仅仅知道第 jj 条暗号的前原创 2022-03-17 21:18:23 · 430 阅读 · 0 评论 -
P5149 会议座位(逆序对 离散化 hash 归并排序)
STL大法好~原创 2022-03-17 18:36:55 · 371 阅读 · 0 评论 -
Neat trees(单调栈)
原题链接:登录—专业IT笔试面试备考平台_牛客网题意:给定一个长度为1e6的序列hi(1e6),求所有连续区间的最大值减最小值的和。解题思路:首先暴力枚举每一个区间必定是超时的。那么考虑每个点对于答案的贡献值,可以这样想,对于点h[i]作为最大值在多少个区间出现,作为最小值在多少个区间出现?这个点对于答案的贡献就是h[i]作为最大值出现的次数 - h[i]作为最小值出现的次数,对于每个点,求一下贡献累加即可。求每个点贡献的过程用单调栈来维护,拿求最大值的次数来举例。对于点i,找到左端原创 2022-03-17 12:41:43 · 876 阅读 · 0 评论 -
P4551 最长异或路径(XOR 异或 dfs 字典树 trie 贪心)
题目描述给定一棵 n 个点的带权树,结点下标从 1 开始到 n。寻找树中找两个结点,求最长的异或路径。异或路径指的是指两个结点之间唯一路径上的所有边权的异或。输入格式第一行一个整数 nn,表示点数。接下来 n-1n−1 行,给出 u,v,w ,分别表示树上的 u 点和 v 点有连边,边的权值是 w。输出格式一行,一个整数表示答案。输入输出样例输入 #1复制41 2 32 3 42 4 6输出 #1复制7题解:一个数,如果它两次异或同一个数,那原创 2022-03-13 20:19:17 · 2249 阅读 · 0 评论 -
线段树 P3372 (模板)
题目描述如题,已知一个数列,你需要进行下面两种操作:将某区间每一个数加上kk。 求出某区间每一个数的和。输入格式第一行包含两个整数 n, mn,m,分别表示该数列数字的个数和操作的总个数。第二行包含 nn 个用空格分隔的整数,其中第 ii 个数字表示数列第 ii 项的初始值。接下来 mm 行每行包含 33 或 44 个整数,表示一个操作,具体如下:1 x y k:将区间[x, y][x,y]内每个数加上kk。 2 x y:输出区间[x, y][x,y]内每个数的和。...原创 2022-03-11 12:37:39 · 74 阅读 · 0 评论