随笔分类 -  高效算法思想

摘要:n<=20000个车站,车能同时载C<=100个人,求能满足K<=50000群人的多少个。每群人给起点终点和人数,一群人不一定要都满足。 一开始想DP,想不出,很菜。 贪心即可。如果有右端点相同的几群人,那肯定优先满足左端点大的;如果有两群人发生冲突,而我们从左到右考虑区间的话,那肯定让左边的人先满 阅读全文
posted @ 2017-08-31 10:11 Blue233333 阅读(185) 评论(0) 推荐(0)
摘要:n<=5000个数0或1,每次可以连续对固定长度区间取反,目标把所有1变0,求一个取反区间的固定长度K使取反次数最少。 答案关于K不单调,因此枚举K,对每个K扫一遍区间,遇到1就把连续K个数反转,看最后K-1个数是否在这样一番操作后都为0。为什么?不知道。 区间取反后查询,用差分。n2可过。 1 # 阅读全文
posted @ 2017-08-26 14:40 Blue233333 阅读(203) 评论(0) 推荐(0)
摘要:n<=100000个点在坐标系上,选m个点使点间最小距离最大。 二分模板?? 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<algorithm> 5 #include<math.h> 6 //#inc 阅读全文
posted @ 2017-08-14 18:50 Blue233333 阅读(235) 评论(0) 推荐(0)
摘要:给出n<=100000个已覆盖的区间[Li,Ri],Li,Ri<=1e9,求再覆盖m<=1e9个点如何使最长覆盖区间最大。 感谢KPM大爷的题解!! 首先把重复区间处理掉,剩下若干个不重区间。这采用类似于差分的“事件法”,左边+1,右边-1,>0的部分即是区间。 接下来,“求满足某个条件的最长区间” 阅读全文
posted @ 2017-08-13 19:42 Blue233333 阅读(271) 评论(0) 推荐(0)
摘要:数轴上n<=500000个点,点i在Xi处有Ai个东西,Xi递增,每秒钟可移动一单位并瞬间拿或放一个东西,最多能同时拿一个东西,任选择一个点在T<=1e18秒内把尽可能多的东西拿到该点。 感谢KPM大佬提供的解法!方便快捷! 最优方案一定是在这n个点上,因此枚举点看如何计算最优答案。 越往右边的点取 阅读全文
posted @ 2017-08-11 21:34 Blue233333 阅读(351) 评论(0) 推荐(0)
摘要:给出平面上n<=100个点,求最少用多少面积≤S<=200000的矩形能全覆盖。 第一想法是区间DP,f[i,j]表示覆盖第i到j的点最少矩形数,$f[i,j]=∑f[i,x]+f[x+1,j],x∈[i,j)$,但好在样例良心,这样的方案过不了样例。怎么把两个矩形相交的方案处理出来呢? f[i,j 阅读全文
posted @ 2017-08-08 06:56 Blue233333 阅读(439) 评论(0) 推荐(0)
摘要:n个数,分组,数Ai要在至少含有Ai个数的组,求最多分多少组。 方法一:大的数应该尽量跟大的在一起,这样才能让小的出现很多很多组,所以从大到小排序,给当前序列中最大的数x分x个数。代码如下: 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<st 阅读全文
posted @ 2017-08-07 20:08 Blue233333 阅读(172) 评论(0) 推荐(0)
摘要:n<=100000个点m<=300000条边有权无向联通图,给出K<=10000个特殊点求K个点中任意两点最短路的最小值。 方法一:K小,随便搞。先构造最短路树,在最短路树上Dijkstra,遇到第一个特殊点就返回。代码如下: 如下个头。首先时间复杂度显然超了,其次建树时要考虑重边,比较难搞。 方法 阅读全文
posted @ 2017-07-27 17:26 Blue233333 阅读(173) 评论(0) 推荐(0)
摘要:n<=100000个房容量Ai,m<=100000头牛分别要占Li~Ri的房,求能同时满足的牛最多有多少。 先把这些各种各样要求的牛排个序观察一下,可以发现,如果若干头牛的Li是一样的,而Li处的容量不允许它们同时放,这时就要舍弃Ri大的那几头,因为价值相同,舍弃谁都不会影响当前的答案,但Ri大的对 阅读全文
posted @ 2017-07-21 10:58 Blue233333 阅读(174) 评论(0) 推荐(0)
摘要:给n<=100对点,从每对点里面挑一个并以这些挑出的点为圆心画圆,并且这些圆不能互相覆盖,找出一种方案使得这些圆半径中最小的那个最大。 “最小值最大”就是二分答案啦!考虑现在每个点都画出半径x的圆,如何选点呢? 可以发现选了一个点P之后与其距离相差2x内的点Q都不能被选,也就是“与P在同一对的另一个 阅读全文
posted @ 2017-07-20 10:42 Blue233333 阅读(201) 评论(0) 推荐(0)
摘要:n个数字中,每个数有数字A和属性B,每次操作将某个点x的属性B改变为0或1,求满足这样要求的子序列的个数: 下标a<b<c<d<e,而Aa<=Ab=Ac=Ad>=Ae且Bb=Bc=Bd=1。 区间操作,首推线段树!(然后就不会了,跑去看别人的代码) 是这样的,重点在于中间那三个点,因为我们的修改操作 阅读全文
posted @ 2017-07-18 00:01 Blue233333 阅读(193) 评论(0) 推荐(0)
摘要:给出字符串s和t,以及s的长度n的一个全排列,求按照这个排列依次删除s的字符,删到何时s中不含子序列t。 解法一: t中的每个字符的位置在s中跳啊跳,合法的情况下t中的字符在s中的位置应该是单调递增的,因此让t中的字符在s中建的邻接表里跳啊跳就好了。 1 #include<cstdio> 2 #in 阅读全文
posted @ 2017-07-17 11:09 Blue233333 阅读(255) 评论(0) 推荐(0)
摘要:用一个圆心在(x,y)的圆环覆盖一个n边形,顺或逆时针给出n边形所有顶点,求圆环最小面积。 卡了好久,各种傻逼错误。。 题目就是让我们固定一大一小两个边界圆,我们来看看这两个圆满足什么条件。 首先外面的那个圆肯定是经过n边形的某个顶点,所以外圆半径就是最大的点距。 其次内圆呢,可能经过一个点,也可能 阅读全文
posted @ 2017-07-17 10:54 Blue233333 阅读(192) 评论(0) 推荐(0)
摘要:n头牛,第i头要SPF(某个参数)在Lowi到Highi的药,药m种每种SPF为Vi,数量为Numi,求最多能满足几头牛。 方法一:什么都看不出来,只知道第i头牛能和一些药匹配,于是网络流,牛向药连容量1的边,起点向牛容量1,药向终点容量为药数量,最大流。 1 #include<cstdio> 2 阅读全文
posted @ 2017-07-11 17:25 Blue233333 阅读(206) 评论(0) 推荐(0)