随笔分类 -  数据结构

摘要:n<=1e5个点,每个点有排名,m次连接把某两个岛屿连起来,然后q次操作:合并两个岛屿;查询某个岛屿能到的所有岛屿的第k名次是哪一个。 线段树合并,并查集! 小坑:合并两棵线段树之前,记得判断这两棵树是不是已经在一起了,如果是就不理他; 合并线段树用的是并查集根节点对应的线段树。 1 #includ 阅读全文
posted @ 2017-10-25 07:33 Blue233333 阅读(131) 评论(0) 推荐(0)
摘要:n<=100000的点权树,问每个点子树内有多少个比他大。 方法一:区间第K大!…… 方法二:线段树合并,值为下标,每次把所有的孩子和自己合并起来,然后线段树中直接查找即可。 1 #include<cstring> 2 #include<cstdlib> 3 #include<cstdio> 4 / 阅读全文
posted @ 2017-10-24 19:58 Blue233333 阅读(135) 评论(0) 推荐(0)
摘要:n<=3e5的数列,m<=3e5个操作:把第x个数修改成y,或询问从x到y这个区间能否构成公差z的等差数列。 二逼做法:考虑一个序列在什么情况下才能构成公差z的等差数列。 首先,最大值和最小值的差是z*(y-x)。 其次,相邻两数的差的gcd是z。 再者,没有重复的数字。 前两个比较好搞,线段树,第 阅读全文
posted @ 2017-10-20 08:01 Blue233333 阅读(245) 评论(0) 推荐(0)
摘要:1~n<=1e5依次插入序列中某一个位置,求每次插入后的最长上升子序列。 因为新插入的数对前面插入的答案没影响,所以只要能想方设法构造出最终序列即可。 方法一:平衡树!。。。。 方法二:在树状数组上倍增求第K大 然而LIS写残了。。记得是lowerbound不是upper。。 然后最后输出记得和前面 阅读全文
posted @ 2017-10-20 07:13 Blue233333 阅读(331) 评论(0) 推荐(0)
摘要:n<=1e5的有根点权树,m<=1e5个操作:换根,修改点权,查询子树最小值。 维护子树信息--dfs序,至于换根只需要分类讨论一下现在根和查询点的关系。 如果查询的点是根节点,就输出整颗树的最小值。 如果查询的点5在1到7的路径上,那以7为根的时候查询5,就是整颗树排除粉红色部分--5的儿子中,是 阅读全文
posted @ 2017-10-19 10:55 Blue233333 阅读(496) 评论(0) 推荐(0)
摘要:n<=100000栋楼房,第i栋在位置i,一开始全没建成高度0,m<=1e5个操作,每次操作把一栋楼x的高度修改为y,并问这次修改后从0位置往右边看能看到多少栋楼。他能看到一栋楼,必须这栋楼有高度,并且设楼高度Hi,那么(0,0)到(i,Hi)这条线段上没有其他的楼。1<=y<=1e9 说半天就是维 阅读全文
posted @ 2017-10-18 19:51 Blue233333 阅读(234) 评论(0) 推荐(0)
摘要:n<=1e6个数字,开始都是0,m<=1e6个操作:1、把第x个数修改成y;2、询问:对序列中的数字进行c次操作,每次选s个正数把他们-1,问能否进行。 一个数字Ai,如果Ai>=s,那它可以被选中s次;如果Ai<s,那就Ai次。设k个数字大于等于s,小于s的数字的和是sum,只需要:sum<=(c 阅读全文
posted @ 2017-10-18 09:15 Blue233333 阅读(287) 评论(0) 推荐(0)
摘要:n<=50000个数字,m<=200000个查询,每次问L到R之间有多少不同的数字。 这个询问可以离线的,为使L到R之间的数字只被算一次,可以从左往右扫,扫到一个数字就把上一个该数字出现的地方--,把现在这里++,为了配合这种操作,把所有询问按右端点排序,扫到一个地方就把该处所有右端点在这里的询问回 阅读全文
posted @ 2017-10-18 06:47 Blue233333 阅读(134) 评论(0) 推荐(0)
摘要:n<=100000个操作:添加一个不等式ax+b>c,删除一个不等式,查询当x=k时有多少不等式组满足要求,abs(k)<=1e6。 按a的正负来分情况,然后树状数组维护即可。 a=0:b>c就全部+1否则不理,注意不要忘了把他扔进数组里!!!!! a>0:x>(c-b)/a,把它向上取整,并且在- 阅读全文
posted @ 2017-10-17 21:19 Blue233333 阅读(384) 评论(0) 推荐(0)
摘要:n,m<=300,n*m的一个矩阵,q<=200000个操作:修改某个点权值;查询某个矩形范围内某个权值有多少个点。权值<=100。 二维树状数组的模板! 1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 //#inclu 阅读全文
posted @ 2017-10-17 18:27 Blue233333 阅读(169) 评论(0) 推荐(0)
摘要:n<=200000个点m<=500000条边的图,问是否存在一种黑白染色方案使每个点满足:要么它是白色,要么它相邻点是白色;并且,要么它是黑色,要么它相邻点是黑色。 除非某个联通块只有一个点,否则一定有解。并查集维护连通性。 1 #include<stdio.h> 2 #include<string 阅读全文
posted @ 2017-10-12 16:31 Blue233333 阅读(130) 评论(0) 推荐(0)
摘要:n<=1e5个点的树有边权,m个询问,每次问max dis(i,j) a<=i<=b,c<=j<=d。 结论:一个区间的最远点对,要么是其左半区间的最远点对,要么是其右半区间的最远点对,要么是左右半区间最远点对的四个点的互相组合之一。如下图: 两个集合最远点对分别是A-B,A并B的最远点对是红A-蓝 阅读全文
posted @ 2017-10-10 22:08 Blue233333 阅读(439) 评论(0) 推荐(0)
摘要:n<=1e5个数字,做m<=1e5次操作:把第Li到Ri的数字升序/降序排,求最后第Q位的数字。 似乎没有什么数据结构可以做这个?但可以转判定性问题。就是说,把一段数排序是没法的,但把一个01串排序是可以线段树乱搞的。 所以二分一个答案,比它小(等)的数都记0,比它大的都记1,如果最后第Q位0就没毛 阅读全文
posted @ 2017-10-07 21:50 Blue233333 阅读(186) 评论(0) 推荐(0)
摘要:求半径d<=50000的圆(不含边界)内n<=50000条直线有多少交点,给直线的解析式。 一开始就想,如果能求出直线交点与原点距离<d的条件,那么从中不重复地筛选即可。然而两个kx+b联立起来加勾股定理特别丑。。 换个想法,一条线在圆上就截了两个点。把这些点做极角排序后(即从y轴正半轴的射线顺时针 阅读全文
posted @ 2017-10-01 17:22 Blue233333 阅读(332) 评论(0) 推荐(0)
摘要:数轴上n<=500个站可以买东西,每个站位置Xi,库存Fi,价格Ci,运东西价格是当前运载重量的平方乘距离,求买K<=10000个东西到达点E的最小代价。 f[i,j]--到第i站不买第i站东西的最大值,转移时决策的是买上一个站的东西,f[i,j]=f(i-1,k)+(j-k)*C(i-1)+j*j 阅读全文
posted @ 2017-09-22 14:35 Blue233333 阅读(274) 评论(0) 推荐(0)
摘要:L<=1000000的土地上用长度在2*A~2*B的线段覆盖所有点,且给定n<=1000个区间,每个区间上只允许有一条线段,求最少多少线段,无解-1。 f[i]表示填前i个土地最少线段,f(i)=f(j)+1,2*A<=i-j<=2*B,用个单调队列就行。注意区间是左闭右开。 至于那些坏区间,如果某 阅读全文
posted @ 2017-09-22 14:30 Blue233333 阅读(189) 评论(0) 推荐(0)
摘要:n<=200000个点,m<=100000个区间,每个区间有且仅有一个点,求最多几个点,无解-1。 http://www.cnblogs.com/Chorolop/p/7570191.html WA了两次:看成最少几个点;判无解是<0而不一定=-inf。 1 #include<stdio.h> 2 阅读全文
posted @ 2017-09-21 20:44 Blue233333 阅读(177) 评论(0) 推荐(0)
摘要:n<=50000组数Ai,Bi,Ai>=Bi,最多K<=n个组选Bi,其他组选Ai,求最多能选中几组数使选数总和不超过M<=1e14。 一开始,肯定是在Bi里面选K个最小的,然后M有剩的再来调整。如何调整呢?现在我有两个选择:在没选的数里面选个最小的Aj,否则在选的K个最小Bi的里面,把某个Bi换成 阅读全文
posted @ 2017-09-19 21:41 Blue233333 阅读(315) 评论(0) 推荐(0)
摘要:n<=400个东西,每个东西有高度<=100,这种东西在堆放过程中不得超过的最大高度<=40000,以及每个东西的个数<=10,求最高能堆多高。 算了下背包复杂度不太对然后开了bitset。。 1 #include<stdio.h> 2 #include<string.h> 3 #include<s 阅读全文
posted @ 2017-09-19 19:14 Blue233333 阅读(505) 评论(0) 推荐(0)
摘要:n<=1000000个数,每个数的选择范围在Li到Ri<=1000000000之间,求最长能得到多长的连续不下降序列。 首先可以暴力,f[i][j]表示前i个数,最后一个数取j,然后瞎转移就好了,显然过不了。 仔细一想,转移过来的状态只有几个,用{x,y}表示一个路径,最后一个数为x,答案为y。x越 阅读全文
posted @ 2017-09-17 20:59 Blue233333 阅读(298) 评论(0) 推荐(0)