
数据结构
nymph181
这个作者很懒,什么都没留下…
展开
-
【数据结构 扫描线】空间简单度
题意给出一棵树,其中有一些点对是不合法的,求一共有多少条路径中是没有不合法的点对。思路考虑用所有路径-不合法的路径得出答案。对于每个点对(x,y),dfn[x]<dfn[y]:如果x为y的祖宗,那么y的子树到除了x~y这条链上其它的节点都是不合法的如果x不为y的祖宗,那么x的子树到y的子树中的点都是不合法的因为会有重复的不合法点对被计算,我们就把它们...原创 2020-08-12 16:25:38 · 231 阅读 · 0 评论 -
【并查集】JZOJ_3301 家族
题意你需要选定一个范围,边权在这个范围内的边才看做存在,若干边把图分成若干个集合,点不同数量的集合,会获得相应不同的价值。求一个最小的范围使得价值超过k。思路一开始以为是二分,结果多加了一个没必要的时间复杂度,这里也没有单调性可言。利用并查集对集合进行操作,统计一下答案即可。把边权排序可进行小小剪枝。代码#include<cstdio>#include<algor...原创 2019-07-05 14:34:14 · 224 阅读 · 0 评论 -
【数据结构 并查集 主席树】洛谷_3402 可持久化并查集
题意顾名思义,写出一个支持可持久化的并查集。思路用可持久化数据结构记录每个版本时每个点的父亲,然后我觉得就没什么好讲的了。值得一提,在此用路径压缩会炸空间,因为每次路径压缩会新增很多节点,所以我们采用按秩合并来优化查询时间。所谓按秩合并,就是通过特殊方法合并,你可以把“秩”视作集合大小,或树的深度,当两个集合合并时,令查询代价小的连向查询代价大的,就只会增加少量的查询代价。还有很多关于...原创 2019-07-04 21:47:18 · 190 阅读 · 0 评论 -
【数据结构 堆】luogu_4597 序列sequence
题意给定一个序列,每次操作可以把某个数+1-1。要求把序列变成非降数列。而且要求修改后的数列只能出现修改前的数。思路当前的数为xxx,之前的最大值为yyy,为了满足非降,我们要在[x,y][x,y][x,y]找到一个值zzz,让xxx和yyy变成zzz,无论zzz是什么,代价都为y−xy-xy−x,但选的更小更容易满足非降,所以我们改成xxx。那么yyy改成xxx后,yyy之前有最大值z&...原创 2019-07-07 16:58:28 · 284 阅读 · 0 评论 -
【主席树】luogu_3919 可持久化数组(可持久化线段树/平衡树)
题意如题,你需要维护这样的一个长度为NNN的数组,支持如下几种操作:1、在某个历史版本上修改某一个位置上的值2、访问某个历史版本上的某一位置的值思路主席树模板代码#include<cstdio>#include<algorithm>struct SegmentTree { int lc, rc; int dat;} tree[20000...原创 2019-06-01 17:07:27 · 170 阅读 · 0 评论 -
【线段树 数学】JZOJ_4638 第三条跑道
题意给出一个序列,对它有两种操作:1、区间乘。2、求区间中每个数值φ\varphiφ的积。思路φ(n)=n∗∏pi−1pi\varphi(n)=n*\prod\frac{p_i-1}{p_i}φ(n)=n∗∏pipi−1根据这个性质,我们可以维护区间数的乘积以及区间中质因子的指数就好了。由于题中给出的数据600600600内只有109109109个质数,所以我们就可以用1091...原创 2019-05-10 21:21:39 · 186 阅读 · 0 评论 -
【线段树】Contest Hunter_4301 Can you answer on these queries III
题意给出一个序列,给出MMM次操作,按照要求输出。 “2“2“2 xxx y”y”y”,把A[x]A[x]A[x]改成yyy。 “1“1“1 xxx y”y”y”,查询区间[x,y][x,y][x,y]中的最大连续子段和。思路我们可以用线段树来维护区间的最大连续子段和。 新开四个变量dat,sum,lmax,rmaxdat,sum,lmax,rmaxdat,sum,lmax,rm...原创 2018-08-22 16:28:01 · 319 阅读 · 0 评论 -
【线段树】JZOJ_7.12C组第二题 圣章-精灵使的魔法语
题意给出一个字符串,里面都是’(‘或者’)’,左边的’(‘可以匹配右边的’)’,但是像)(这样的就不匹配了。现在有2种操作: 1、Change x:表示把字符串里的第x位进行修改,如果是’(‘就改成’)’,如果是’)’就改成’(‘。 2、Query a b:询问在a~b这个区间中,我们在最左边至少要加多少’(‘和在最右边至少加上多少’)’可以使得这个区间内的括号是都匹配的。思路...原创 2018-07-12 21:01:14 · 318 阅读 · 0 评论 -
【线段树】SSL_2648 线段树练习题五
题意给出几个刚开始为0的格子,我们可以进行两种操作: 1、修改:M x y(给格子x加上y) 2、查询:C x y(格子x到格子y上的数的总和)思路线段树。用cover表示当前这个区间里的格子的总和,每次修改的时候我们查询到代表它那个范围的节点,然后递归回它的根节累加,查询就是查到了代表x到y的那个区间就返回cover,否则我们判断然后向它的子节点查找累加。代码...原创 2018-05-09 20:33:54 · 223 阅读 · 0 评论 -
【线段树】SSL_2646 线段树练习题三
题意在一条线上染上几种颜色,求这些颜色把这条线分为几段。思路这道题的插入算法和练习题二差不多,只不过统计的时候要改一下。代码#include&amp;lt;cstdio&amp;gt;int n,m,x,y,ans,z,f;struct tr{ int b,e,cover;}tree[400001];void creat(int p,int l,int r){ ...原创 2018-05-08 21:12:59 · 347 阅读 · 0 评论 -
【线段树 数学】JZOJ_4231 寻找神格
题意给出一个数列,我们对它进行操作。输入操作符ttt1、当t=0t=0t=0时,这一行还有两个数aaa,bbb,表示编号为aaa的部落增加了bbb个人(如果b&amp;lt;0b&amp;lt;0b&lt;0则表示减少了∣b∣|b|∣b∣个人)。2、当t=1t=1t=1时,这一行还有三个数a,b,ca,b,ca,b,c,表示编号为a∼ba\sim ba∼b的部落增加了ccc个人(如果c&a...原创 2019-01-20 17:06:15 · 241 阅读 · 0 评论 -
【线段树】SSL_2645 线段树练习题二
题意与练习题一不同的是,现在给出的每个盒子的颜色都不相同,我们要求出一共能看到几种盒子。思路定义一个cover记录颜色,如果有多种颜色我们就把它赋值为-1,之后统计的话我们可以定义一个flag来表示颜色i是否存在,存在的话我们就可以让答案+1。代码#include&lt;cstdio&gt;int n,m,x,y,flag[400001],ans;struct tr...原创 2018-05-08 21:02:34 · 192 阅读 · 0 评论 -
【线段树】SSL_2647 线段树练习题四
题意在平面内有一条长度为n的线段(也算一条线段),上面有m条线段,问x到y之间有多少条线段。思路用cover统计当前区间有多少条线段,统计的时候我们先找到x到y这个区间所代表的节点,然后从这个节点往它的根结点去统计,因为cover可能不会下传到x到y这个区间里,而是到它的父节点上。代码#include&lt;cstdio&gt;int n,m,x,y,ans,z,f;...原创 2018-05-08 21:19:53 · 269 阅读 · 0 评论 -
【权值线段树】JZOJ_3236 矮人排队
题意给出NNN个人的身高,有两种操作:1、1、1、交换两人位置。2、2、2、查询a∼ba\sim ba∼b这些身高的人在序列中是否是一个连续子序列。思路一开始我用线段树记录当前区间的最大值和最小值,然后查询时就把在a∼ba\sim ba∼b的区间拿出来,暴力判断一下是否连续,事实证明我是∗∗**∗∗。其实要用线段树维护高度为iii的人位置在哪,以及区间最大最小值,在查询时,我们利用线段...原创 2019-07-11 20:53:46 · 182 阅读 · 0 评论 -
【数据结构 线段树】JZOJ_1214 【NOI2007】项链工厂
题意给出一串项链。编写软件系统支持如下命令:1.RRR kkk 意为RotateRotateRotate kkk。将项链在平板上顺时针旋转kkk个位置, 即原来处于位置1的珠子将转至位置k+1k+1k+1,处于位置2的珠子将转至位置k+2k+2k+2,依次类推。2. FFF 意为FlipFlipFlip。将平板沿着给定的对称轴翻转,原来处于位置1 的珠子不动,位置2 上的珠子与位置NNN上...原创 2019-07-07 09:24:29 · 180 阅读 · 0 评论 -
【数据结构 单调栈】SSL_1337 矩形统计
题意给出一个矩形,其中000代表完好,111代表破损,求出从中能截出的矩形个数。思路容斥思想,用总的−-−破损的方案自然得出答案。对于一个点,我们发现只有它左边和上面的破点对它有贡献,且破点的坐标是单调递减的,即当我们的xxx坐标越大,yyy坐标就要越小,这里使用单调栈维护距离每一列最近的破点。代码#include<stack>#include<cstdio>...原创 2019-08-07 07:37:49 · 227 阅读 · 0 评论 -
【数据结构 树状数组】JZOJ_6342 Tiny Counting
没人再像我这样的超级无敌大傻逼了原创 2019-09-07 16:26:04 · 214 阅读 · 1 评论 -
【数据结构 树 树链剖分】luogu_3178 [HAOI2015]树上操作
菜鸡默写剖剖乐原创 2019-08-22 21:21:08 · 183 阅读 · 0 评论 -
【数据结构 树 树链剖分】luogu_2590 [ZJOI2008]树的统计
菜鸡只能做这种水题续命了原创 2019-08-22 16:40:17 · 179 阅读 · 0 评论 -
【数据结构 动态规划 单调栈】JZOJ_6305 最小值
在线口胡原创 2019-08-17 20:41:01 · 254 阅读 · 0 评论 -
【数据结构 树 树链剖分】luogu_2486 [SDOI2011]染色
菜鸡剖剖乐原创 2019-08-22 11:35:16 · 219 阅读 · 0 评论 -
【数据结构 线段树合并】CF600E Lomsat gelral
性感理解线段树合并原创 2019-08-16 21:18:15 · 224 阅读 · 0 评论 -
【数据结构 数学 线段树 矩阵乘法 动态dp】SP1716 GSS3 Can you answer these queries III
题意见之前思路考虑动态规划求最大子段和。设fif_ifi为以aia_iai结尾的最大子段和,gig_igi为aia_iai前的最大子段和,得出方程:fi=max(fi−1+ai,ai)、gi=max(gi−1,fi)f_i=max(f_{i-1}+a_i,a_i)、g_i=max(g_{i-1},f_i)fi=max(fi−1+ai,ai)、gi=max(gi−1,f...原创 2019-08-13 00:35:54 · 455 阅读 · 2 评论 -
【数据结构 线段树 动态规划 动态dp】JZOJ_6293 迷宫
题意给出一个矩阵,里面有些墙,有两种操作:1、改变矩阵的一个点的状态(有墙->无墙)(无墙->有墙)2、询问一个点到另一个点的最短路思路利用线段树维护fx,yf_{x,y}fx,y代表当前区间最左端的第xxx行到最右端的第yyy行。两个线段树合并时fx,y=fx,k+fk,y+1f_{x,y}=f_{x,k}+f_{k,y}+1fx,y=fx,k+fk,y+1,可看...原创 2019-08-15 21:02:02 · 256 阅读 · 0 评论 -
【数据结构 树状数组 整体二分】JZOJ_2908 luogu_1527 矩阵乘法
日常挖坑,我好菜啊原创 2019-08-24 09:42:07 · 199 阅读 · 0 评论 -
【数据结构 二维树状数组】luogu_ 4514 上帝造题的七分钟
待填坑原创 2019-08-23 21:37:45 · 248 阅读 · 0 评论 -
【数据结构 树 树链剖分】luogu_2146 [NOI2015]软件包管理器
fread出锅,-1s原创 2019-08-19 20:36:55 · 175 阅读 · 0 评论 -
【数据结构 树 树链剖分】luogu_3384 树链剖分
菜鸡性感解理熟练匍匐原创 2019-08-19 15:55:13 · 312 阅读 · 0 评论 -
【线段树】SSL_2644 线段树练习题一
题意给出若干盒子,从前面看,求它们不重复的总宽度。思路可以用离散化也可以用线段树,线段树会比离散化快。代码#include&lt;cstdio&gt;struct pfa{ int b,e,v;//b和e代表这个节点所代表的区间的两个范围,v代表此处有没有盒子覆盖}tree[400001];int n,m,x,y;void creat(int p,int...原创 2018-05-08 20:52:33 · 254 阅读 · 0 评论 -
【线段树 懒惰标记】JZOJ_1380 最大值(新版)
题目 题意: 在一个长度为n的序列里进行两种操作:(1)1 x y c表示把a[x]到a[y]增加c,(2)2 x y表示询问区间[x~y]的最大值。思路: 这题和1379的差不多,就是第一个操作的时候我们可以先做一个标记,等到查找的时候我们再把标记下传下去,可以使时间得到优化。代码: #include<cstdio>#include&l...原创 2018-02-08 09:21:37 · 340 阅读 · 0 评论 -
【并查集】洛谷_2700 逐个击破(平津战役)
题意给出NNN个点,它们之间有N−1N-1N−1条路径相连,其中KKK个特殊点,我们要删去一些边使得这KKK个点不连通,求最少的删除代价。思路可以想到构图。我们删边的最小代价等于用总代价减去构图的最大代价,于是我们可以把边从大到小排序来放入并查集里。当加入一条边时,判断两个点是不是特殊点,还有特殊点的集合里的点都要标记成特殊点,代表特殊点连到这个集合的某一个点都会与另一个特殊点连通,就不符题...原创 2018-10-19 22:14:25 · 266 阅读 · 0 评论 -
【并查集】洛谷_1955 程序自动分析
题意给出几个约束条件,求出这些条件是否都能满足。思路我们可以先让等于的合并到一个集合里,之后再判断不等于的,如果两个变量在同一个集合里说明矛盾就是不能满足。 这里数据可能较大,要离散一下给出的点。代码#include<cstdio>#include<algorithm>using namespace std;struct node{...原创 2018-08-21 21:27:26 · 243 阅读 · 0 评论 -
SSL_2435 航空公司
题意有个飞机,要飞过每个岛,飞的顺序不分先后。给出这个地图上所有的岛和它们的半径,求出它飞完所有岛的最长的路径最短。思路我们可以用最小生成树就可以包括了每一个岛,上面的长度也是最短的,用并查集来实现。代码#include<cstdio>#include<cmath>#include<algorithm>using names...原创 2018-05-21 20:57:09 · 180 阅读 · 0 评论 -
SSL_2415 连通块
题意给出一个n×nn×nn \times n的矩阵,有m次操作,可以在第(x,y)格放上颜色为z的方块,与它上左下右相连的方块与它是同一块,求每次操作时,在这个矩阵里共有多少块方块(颜色0代表白,1代表黑)。思路每次插入时先让答案+1,利用并查集,判断与这个方块相连的方块是否和它为同一个集合,如果为同一个集合我们就让它们合并并且让答案-1,如果它们已经为同一个集合我们就不用让答案-1了...原创 2018-05-12 13:58:26 · 219 阅读 · 0 评论 -
SSL_1312 旅行
题意给出一个图,求从A点走到B点的路径中最大长度/最小长度的值最大,答案要化成最简分数的形式。思路先给每个边从大到小排序,然后枚举第一条边,再枚举其它的边加入集合里,直到A到B都在这个集合里,然后我们就可以判断当前枚举的最小的边和最大的边(最小的边为我们枚举的第一条边,因为我们排序过了,最大的边就是我们枚举的其它的边)是否比之前求出的答案的比例大,我们就可以替换,最后化成最简输出就...原创 2018-03-24 16:41:28 · 240 阅读 · 0 评论 -
poj_2560 Freckles
题意给出每个点的坐标,求这个图中的最小生成树。思路比起普通的最小生成树,我们这题要用勾股定律求出两个点之间的直线距离,剩下的最小生成树我们用并查集来做就好了。代码#include<cstdio>#include<cmath>#include<algorithm>using namespace std;int m,n;doub...原创 2018-03-23 20:40:38 · 227 阅读 · 0 评论 -
poj_2524 Ubiquitous Religions
题意求一个图中互相连通的块数。思路每次读入两个点,我们就把第二个点的祖先指向第一个点的祖先,最后判断祖先没有改变的点,就是一个连通的块了,很简单。代码#include<cstdio>int n,m,father[50001],a,b;int find(int x){ int f1=x,f2; while (x!=father[x]) x...原创 2018-03-23 19:47:07 · 204 阅读 · 0 评论 -
poj_1611 The Suspects
题意有n个学生,m个组,每个组有k个学生,一开始学生0感染了病毒,如果一个组里有一个学生感染了病毒那么这个组里的人都会被传染上病毒,有多组数据,n和m为0时表示输入结束。思路这道题是一个比较简单的并查集题目,我们每次读入一个组学生的编号时,就把2~k学生的编号和编号1学生的编号连在一起,表示他们是同一个组的,我们在操作“集”的时候要判断一下,如果这两个要连起来的学生不是同一个组的,...原创 2018-03-23 19:21:43 · 160 阅读 · 0 评论 -
【数据结构 并查集】luogu_2449 矩形
题意给出几块矩形,如果两两之间相重合那我们就把它们看成同一个矩形,现在给出n个矩形左下角的坐标和右上角的坐标,求里面一共有多少个矩形。思路用并查集来存两个矩形是否为同一个矩形,我们读入后枚举两个矩形,如果它们两个重合并且之前没有存到并查集里,我们就让ans+1,最后输出n-ans就是答案了,这题我去看了洛谷大佬的题解,他说样例是错的,所以我一直被样例卡住了。代码#i...原创 2018-03-22 16:59:53 · 245 阅读 · 0 评论 -
SSL_1764 最小生成树
题意给出点数为n的一个图,求里面的最小生成树。思路这里我用的是并查集的方法,先给边的权值排序,从最短的边开始选,如果连接这条边的两个点不在同一个集合里面我们就把它们放进去,答案加上这条边的权值就可以了。代码#include<cstdio>#include<algorithm>using namespace std;int n,ans,m,fat...原创 2018-03-22 16:52:02 · 150 阅读 · 0 评论