随笔分类 - 高效算法思想--二分
摘要:$n \leq 300000$的一个排列,每次能交换相邻两个数,并且有一次机会交换不相邻的两个数,可以不用这个机会。问使这个排列升序最少操作几次。 如果没有“不相邻”,那就是当年入门的时候学的逆序对了。也就是说,这次机会希望把逆序对数尽可能减少。把排列变成点放在二维平面上,$(i,a_i)$,可以发
阅读全文
摘要:$n \leq 100000$个点在数轴上运动,给初始位置和速度。能删$k$个点,问最晚什么时候发生第一次碰撞。 这个贪心题有点惊。。 首先肯定二分答案,然后就是判断怎么删这$k$个点。我想可以把有冲突的点连条边,虽然是平方的但可能可以用数据结构优化,实际上就是求这个图的。。最大独立集?还要一般图匹
阅读全文
摘要:$n \leq 100000$的数列,数字范围$-1e9,1e9$,现$q \leq 1e5$个每次问在一个区间玩游戏,能得到的最大的数。“游戏”:选相邻两个数$a_x,a_y$,然后把他们删掉,变成$a_x+2a_y$,直到序列中只剩一个数。答案$\mod \ \ 1e9+7$。 单次询问可用贪心
阅读全文
摘要:数轴上$n \leq 100000$个不重叠的云,给坐标,长度都是$l$,有些云速度1,有些云速度-1,风速记为$w$,问在风速不大于$w_{max}$时,有几对云可能在0相遇。每一对云单独考虑。 多动一不动--相对运动。假设是原点在左右跑(当然这只是一种观点,暴力解不等式也是可以的),风速$w$时
阅读全文
摘要:$n \leq 1e5$,$x \leq 1e9$。 1e9呵呵,暴力处理$a_n$的前几项直到1e9。然后处理出差的数列,每次在这里面找,找得到就回答,找不到,那有贡献的只有$a_i-a_{i-1},a_i>1e9$,并且是越来越大的,那在原有的里面二分一下看要补几个即可。 注意$Max=1e9+
阅读全文
摘要:$n \leq 1e6$,$n$进制下的$0,1,...,n-1$每个数有$a_i$个,$1 \leq a_i \leq 1e6$。$q \leq 1e5$个询问,每次问用这些数字拼成的$n-1$的倍数的最大的那个数(不一定全选),它的某一位是多少。 这个数字用传统十进制表示就是$\sum_{i=0
阅读全文
摘要:$n \leq 2000$的树有$m \leq 40$个洞,其他点上有各不相同的人,人走一个单位要一个时间,每个洞一秒只能让一人过。问最少多少时间所有人通过洞。 二分答案,然后由于洞口不多,可以把洞口每个时间的状态都表示出来,一个人如果能在$t$时间到达洞就可以向$t,t+1,...$连边。 但边太
阅读全文
摘要:$n \leq 1000,m \leq 2000$的图,每条边是双向的,双向分别有边权,求从1号点的最大边权最小的欧拉回路。 最大值最小--二分,注意图不连通时直接不合法。 接下来就是找是否有欧拉回路,注意这里有些边是不定向的有些边是定向的。为使每个点的入度等于出度,在调整边的时候会有类似“增广”的
阅读全文
摘要:$n \leq 100000$的$a$序列和$m \leq n$的$b$序列,问$a$有多少子串和$b$能匹配。匹配:俩串长度相同,且俩串的数存在一种一一对应的关系使得每一对的和都$>=h$。 把$b$排个序,这样一个$a_i$就能配$b$的一个后缀。设$a_i$能配上后缀$p_i$。一个$b_j$
阅读全文
摘要:$n \leq 1000000$的字符串,对每一个子串$i$~$n-i+1$,求他最长的一个既是前缀又是后缀的子串。 这题要求的东西具有“对称性”,不充分利用难以解决。这里的“对称性”不仅指询问是对称的,更指要求的那个公共部分是对称的——不对称的相同的子串对答案没有丝毫贡献。 从贡献的角度入手,就是
阅读全文
摘要:$n \leq 100000$的俩序列,数字范围$2^{28}$,问所有$a_i+b_j$的$n^2$个数字的异或和。 这种东西肯定是按位考虑嘛,从低位开始然后补上进位。比如说第一位俩串分别有$c$个$1$和$e$个$1$,$d$个$0$和$f$个$0$,然后这一位就是$c*f+e*d$个$1$,会
阅读全文
摘要:n<=1e5个东西,从左往右买,有K<=16个钱,每次花一个钱买可以买多个,买完不找零,问所有买完最多剩多少钱,无解-1. 一开始以为物品要做状态一直想不出来。。。。 f(i)--钱的状态为i最多能买多少个东西,f(i)=从f(j)+1开始买能买到哪里,其中j是i某一位少一个1的状态。最多买多少,在
阅读全文
摘要:求三个人从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<=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棵树的最大直径的最小值。 树的直径要小小哒,那考虑一棵子树的情况吧!一棵子树的直径,就是子树根节点各儿子的最大深度+次大深度。就下面这样: 最大值最小肯定二分答案啦,那这棵子树如果有毛病呢,砍谁呢?肯定砍最大深度啦!所以就子树最大深度+次大深度有毛
阅读全文