随笔分类 - 高效算法思想
摘要:问一副排n张,n<=23最少打几次打完,数据组数T<=100。 面向数据编程。。 前30分:乱暴力?没有顺子,把单、对子、炸弹、三张、王炸、三带一判一次即可。 前70分:状压,先预处理哪些状态能一次出完,用这些状态来转移,2^n*n*T。实际得分可能比期望的高一些?? 满分:如果不打顺子,最优策略是
阅读全文
摘要:n<=1e5个东西,从左往右买,有K<=16个钱,每次花一个钱买可以买多个,买完不找零,问所有买完最多剩多少钱,无解-1. 一开始以为物品要做状态一直想不出来。。。。 f(i)--钱的状态为i最多能买多少个东西,f(i)=从f(j)+1开始买能买到哪里,其中j是i某一位少一个1的状态。最多买多少,在
阅读全文
摘要:n<=3e5的数列,m<=3e5个操作:把第x个数修改成y,或询问从x到y这个区间能否构成公差z的等差数列。 二逼做法:考虑一个序列在什么情况下才能构成公差z的等差数列。 首先,最大值和最小值的差是z*(y-x)。 其次,相邻两数的差的gcd是z。 再者,没有重复的数字。 前两个比较好搞,线段树,第
阅读全文
摘要:n<=100000栋楼房,第i栋在位置i,一开始全没建成高度0,m<=1e5个操作,每次操作把一栋楼x的高度修改为y,并问这次修改后从0位置往右边看能看到多少栋楼。他能看到一栋楼,必须这栋楼有高度,并且设楼高度Hi,那么(0,0)到(i,Hi)这条线段上没有其他的楼。1<=y<=1e9 说半天就是维
阅读全文
摘要:n<=10000个人,第L个人最高,所有人最高高度H,r个关系表示Ai能看到Bi,也就是,Ai到Bi中间的人都比Ai和Bi矮且Bi不比Ai矮,求每个人最高的可能高度,保证有解。 不知道这个L是来搞笑还是干嘛的 假设一开始所有人最高,一个关系就把Ai到Bi间的点做区间减1,最后单点查询,差分下即可。
阅读全文
摘要:n<=1e5个点的树有边权,m个询问,每次问max dis(i,j) a<=i<=b,c<=j<=d。 结论:一个区间的最远点对,要么是其左半区间的最远点对,要么是其右半区间的最远点对,要么是左右半区间最远点对的四个点的互相组合之一。如下图: 两个集合最远点对分别是A-B,A并B的最远点对是红A-蓝
阅读全文
摘要:n<=10000个点,求欧几里德距离最小的一对点。 经典分治,把这些点按x排序,分成两半,每边分别算答案,答案是左边的最小,右边的最小,左右组起来的最小三者的最小。发现只有左右组的有点难写。 假设左右两半各自的最小中的最小是d,左半边最右的点横坐标是X1,右半边最左的点的横坐标是X2。那么只需要坐标
阅读全文
摘要:求三个人从a,b,c这三个位置跳到x,y,z最少多少步。跳:任意选一颗棋子,对一颗中轴棋子跳动。跳动后两颗棋子距离不变。一次只允许跳过1颗棋子。 从它跳的性质出发,向内跳只有一种操作,而向外跳有两种。这就是说,每个状态可以找到一个唯一前趋,有两个后继。这是一棵二叉树!求两个状态的最短路就是求他们到l
阅读全文
摘要:n<=1e5个数字,做m<=1e5次操作:把第Li到Ri的数字升序/降序排,求最后第Q位的数字。 似乎没有什么数据结构可以做这个?但可以转判定性问题。就是说,把一段数排序是没法的,但把一个01串排序是可以线段树乱搞的。 所以二分一个答案,比它小(等)的数都记0,比它大的都记1,如果最后第Q位0就没毛
阅读全文
摘要:给n<=1e6的序列每个数<=1e6,求m<=1e6个询问,每次问一个长度L<=n的序列是不是一开始给的序列的子序列。 贪心一波,每进来一个数就找他最早的可能位置,这样是比后面的位置要好的。一开始预处理,把每个数字的编号,按数字大小第一关键字,编号第二,放在一个表里,在表里面二分即可。 1 #inc
阅读全文
摘要:n<=25000个牛,挤奶两道工序两个人来做,要先第一道工序才能第二道,先第一道工序的牛要先第二道工序,一个人同时最多挤奶一头牛,给每头牛两道工序时间求最少用多长时间。 AC率这么高的题又不会。很好。 看两头牛,第一头A1,B1,第二头A2,B2,要1在前面,除非: 这个化简就是: 按这个排序即可。
阅读全文
摘要:n<=100000个数,求删掉K种相同的数之后最长的相同数区间长度。 原来是2指针裸题。两个指针,一个左边开始扫,一个右边找最长的区间,使得数字种数不超过K+1即可,然后统计答案。 统计答案时,如果枚举左端点就用左端点更新答案,枚举右端点就用右。因为这个WA了两次。 1 #include<stdio
阅读全文
摘要:n<=50000组数Ai,Bi,Ai>=Bi,最多K<=n个组选Bi,其他组选Ai,求最多能选中几组数使选数总和不超过M<=1e14。 一开始,肯定是在Bi里面选K个最小的,然后M有剩的再来调整。如何调整呢?现在我有两个选择:在没选的数里面选个最小的Aj,否则在选的K个最小Bi的里面,把某个Bi换成
阅读全文
摘要:n<=50000个区间,求哪个点被覆盖区间数量最多,输出这个数量。 差分模板。。然而数组忘开两倍。。 1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #include<algorithm> 5 #include<queu
阅读全文
摘要:n<=500 * m<=500的方阵,先沿横坐标切A-1刀,再把每一块切B-1刀,得到A*B块,求这A*B块的数字之和的最小值的最大值。 最小值最大--二分,然后贪心切。每次扫一行,看这一行能不能切成满足二分值的B块,如果能就记可行横条块多一,最后看可行横条块能否到A,如不能则继续扫下一行,把没满足
阅读全文
摘要:n<=200个点m<=40000条边无向图,求 t次走不经过同条边的路径从1到n的经过的边的最大值 的最小值。 最大值最小--二分,t次不重边路径--边权1的最大流。 1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #i
阅读全文
摘要:n<=200个点m<=1500条无向带权边的图,每个点有人和容量,人可以移动,代价为所有人走过的边的权和,求使所有点人不超过容量的最小代价。 方法一:费用流。 错误!答案与边权不成比例。 方法二:二分一个答案,然后根据floyd求出的最短路看每个点在二分的答案下能去到哪些点,跑最大流检查是否合法。
阅读全文
摘要:n<=100000的树,砍S<n条边,求砍完后S+1棵树的最大直径的最小值。 树的直径要小小哒,那考虑一棵子树的情况吧!一棵子树的直径,就是子树根节点各儿子的最大深度+次大深度。就下面这样: 最大值最小肯定二分答案啦,那这棵子树如果有毛病呢,砍谁呢?肯定砍最大深度啦!所以就子树最大深度+次大深度有毛
阅读全文
摘要:h<=10000 * w<=10000的矩阵,每个格填不超过m<=10000的数,外加n<=10的限制,描述n个子矩阵中最大值一定要是多少,求方案数。 首先一块地能填的数就是1~这块地经过多重矩形覆盖后的最小值,然后要排除那些规定矩形填不到最大值的情况,所以答案为:每块地都满足<=该块地被限制矩形覆
阅读全文
摘要:n<=1000000个数互不相同,我回答m<=25000个询问说Li到Ri最小值是Xi,求最早第几次答得互相矛盾。 首先找到矛盾的情况:一是两个无交区间最小值相同,二是大区间最小值比它子区间的最小值大。 方法一:二分答案,每次看一段里面有没有这两种冲突。先把询问按Xi排个序扫一次就知道有没有冲突一,
阅读全文

浙公网安备 33010602011771号