二分法(二分答案、二分搜索)
ProLightsfxjh
这个作者很懒,什么都没留下…
展开
-
Codeforces Round #371 (Div. 2) D. Searching Rectangles 平面矩形二分法、交互题
平面矩形二分法、交互题先切一条与x轴平行的线把 2个矩形分隔开, 然后变成从 框框类确定一个矩形的坐标这样的子问题,对于那条与x轴平行且把2个矩形分隔开的线可以通过 二分法 logn的复杂度找到,如果没有与x轴平行且把2个矩形分隔开的线, 则 比有一条 与 y轴平行且把2个矩形分隔开的线, 也是 logn的复杂度可以找到然后确定单个矩形所在的大致区域以后 可以 分成4次 用 4个二分 分别二分x = x1, x = x2, y = y1, y = y2 这4条线, 确定一条线以后就确定了一个相应的坐原创 2016-09-16 03:44:46 · 1339 阅读 · 0 评论 -
URAL - 1486 Equal Squares 哈希、二维hash、二分、卡大素数
题意:给出n个长度为m的字符串(n,m <= 500),然后问选取一个最大的正方形,使得有2个正方形区域的字符串是相同的,求出这个最大正方形的边长即两次出现位置的正方形左上角坐标。哈希、二维hash、二分、卡大素数题目直接就暗示着用哈希来做 ^_^,然后可以把每个字符串分别用同一个大素数hash掉,然后二分边长,check的时候,检查每个长度为mid的正方形是否再次出现,检查的时候再去另一个大素数pt,把横向的第一次哈希得到的一段字符串的哈希值作为一个元素,把这些元素再次进行哈希,然后在纵向的原创 2017-03-12 15:10:28 · 1232 阅读 · 0 评论 -
HDU - 5769 Substring 后缀自动机+二分、新增distinct子串的个数和位置
题意:每次给出一个字母ch和一个字符串s,求s中有多少个不同的子串含有字母ch。后缀自动机+二分、新增distinct子串的个数和位置首先这里要用到后缀自动机的一个性质,添加第i个字符时,自动机里新增了diff = val[np] - val[pre[np]] 个与原先不同的子串,它们分别是 s[0......i],s[1......i],……,s[diff-1......i],这里可以证明,当k < j < i 时,如果 s[j......i]是新增的不同子串,则s[k......i]包括了s[j原创 2017-03-12 22:48:34 · 692 阅读 · 0 评论 -
Codeforces Round #404 (Div. 2) C. Anton and Fairy Tale 贪心+二分
题意:初始是n,每次放入m,然后拿走i, n' = max(n, n' + m),问i为多少的时候剩余的数为0.贪心+二分首先如果 m >= n 则ans = n;否则贪心,前m天,必定是拿完之后就重新填满的,这个时候剩余 n -= m;然后对这个新的n进行二分,找到最大的cnt,使得 (cnt + 1)*cnt / 2 <= n;然后如果最后得到的cnt,有 (cnt + 1)*cnt / 2 < n; 则还可以再拿一次,最后只有部分人可以拿到1个,cnt ++最后答案就是 ans = m原创 2017-03-16 01:29:18 · 1123 阅读 · 0 评论 -
Codeforces Round #409 (Div. 2) C. Voltage Keepsake 二分
题意:每个设备初始电量为bi,每秒消耗ai,然后充电器每秒可以给一个设备充电p,问所有设备同时工作的最长时长。二分很显然的要用二分来做,然后check函数该怎么写呢?这里题目中说 You can switch which device is charging at any arbitrary unit of time (including real numbers) ,这就表示可以整体处理,也就是说,首先把设备按照只用初始电量的工作时间(real number)排序,然后对于每个mid 进行che原创 2017-04-17 23:14:43 · 1024 阅读 · 0 评论 -
HDU - 4417 Super Mario 主席树+二分
题意:给出一个长度为n(1<=n<=1e5)的数组,m(1<=m<=1e5)次询问,每次询问在区间[L,R]中小于等于X的数的个数。主席树+二分朴素的主席树是查询区间第k大(从小到大第k大),所以只需要在每次询问的时候二分的找出在此区间里比X大的最小的数的大小,比如这个值为y(初始化为-1),则答案为y-1,即把这个比X大的数去掉(因为X可能不止一个,所以要这样处理),此外如果y未被刷新则说明X是这个区间最大的数了 此时y = R-L+1。 所以时间复杂度原创 2017-07-31 16:05:55 · 858 阅读 · 0 评论 -
Codeforces Round #447 (Div. 2) D. Ralph And His Tour in Binary Country 二叉树、预处理、二分、数据结构
题意:给出一颗二叉树,每条边有一个权值,q个询问,每次询问以x为起点,到yi点,求max(H - xyi, 0)求和。二叉树、预处理、二分、数据结构先在每个节点维护 该点 到 以其为根的点 的距离,且排序(笔者用的c++的sort所以比归并排序多出一个logn),并维护n个前缀和。这里时间复杂度 O(nlognlogn) 空间复杂度 O(nlogn)。然后查询的时候,对于x点进行二分可以找出答案,然后向上回溯,且维护一个变量sumlx为其祖先节点到x的距离。查找该节点所在的链的隔壁的子树,进行二分原创 2017-12-08 13:34:43 · 564 阅读 · 0 评论 -
Codeforces Hello 2018 D. Too Easy Problems 二分+贪心
题意:有m个题目,每个题目有个需要花费的时间ti,以及ai,表示只要最终过题数不超过ai这个题才count。求最大的过题数以及过了哪些题,多种答案则输出任一答案。二分+贪心首先把题目按照ti的为优先级排序,时间少的在前面。然后二分答案,mid表示最终的过题数,check的时候,维护剩余的时间tmp,用cnt表示已选的题目数量,对于题目从左向右扫,每次如果该题的ai<= mid 则 tmp -= ti,当tmp >= 0是cnt++,然后tmp <= 0时break。之后cnt >= mid则返回真原创 2018-01-13 17:45:08 · 567 阅读 · 0 评论 -
Codecraft-18 and Codeforces Round #458 (combined) D. Bash and a Tough Math Puzzle 线段树+二分+卡时间+优化
题意:给出一个长度为n的序列,q个操作,每次询问区间[a,b]内最多改一个数,能不能变成gcd(a~b)== x;或者把第i个数改成y。线段树单点修改区间查询+二分+卡时间+优化用线段树单点修改区间查询来维护一段区间的gcd,然后对于修改操作可以直接修改,而对于询问操作则要二分出一个最大的区间[a,mid]满足gcd(gcd(a~mid),x) == x,此时如果mid == b 或者 mid == b-1或者 gcd(gcd(mid+2~b),x) == x 则 Yes,否则No。当mid不存原创 2018-02-01 12:57:12 · 519 阅读 · 0 评论 -
AtCoder Petrozavodsk Contest 001 C - Vacant Seat 交互题、带分类讨论的二分
题意:交互题,有一个周长为n的环形(3<=n<=99999),每一格是一个座位,每个位置要么坐着一个男人M要么女人F要么空的V,但安排座位M和M不能并列且F和F不能并列,所以n个座位中至少一个座位是空着的,通过交换的方式在20步之内找出一个空着的座位的坐标。交互题、带分类讨论的二分先输出l = 0 和 r = n-1,分别记录 a[l] 和 a[r]的是M或者F或者V。然后二分mid,然后r和mid之间有(r - mid - 1)个位置,如果有奇数个位置,则当a[r] == a[mid]时,则在(原创 2018-02-05 20:50:01 · 867 阅读 · 0 评论 -
Codeforces Round #402 (Div. 2) D. String Game 二分+优先队列+字符串匹配
题意:给出文本串和目标串,然后给出一个文本串删除字符的序列,从a1~an,要求删除s[a1 ~ ak]时剩下的字符串依然可以匹配,求尽可能大的k。二分+优先队列+字符串匹配从左往右是删除字符的顺序,倒着做,从右往做是添加字符的顺序,故check mid~n这个序列能否满足目标串的匹配,要求mid尽可能小,故二分这个剩余序列长度即可,每次check是用优先队列priority_queue<int, vector<int>, greater<int>> pq;,然后依次进行匹配。复杂度 O(nlognl原创 2017-02-26 21:41:34 · 1039 阅读 · 0 评论 -
HDU - 2890 Longest Repeated subsequence 后缀数组+二分+贪心、不可重叠子串、离散化
题意:给出一个序列,要求找出出现过至少m次的最长(连续)子序列,求其最长长度和具体字典序最小的序列,且不能有重叠。后缀数组+二分+贪心先离散化,然后跑出后缀数组sa和height数组,然后二分答案,检查的时候,维护height[i] > mid 的sa[i]值及个数,日光个数大于等于m,则把这段区间的sa[i],排序,然后从小的开始贪,相邻的2个,如果间隔小于mid,则去掉大的比去掉小的sa[i]更好,然后讨论下一个,最后判断剩余的sa[i]的两两间隔不小于mid的sa[i]的个数大于等于m,则这就原创 2017-02-19 00:01:41 · 870 阅读 · 0 评论 -
POJ - 3882 Stammering Aliens 后缀数组、二分、二叉堆、ST表
题意:给出一个字符串,要求找出至少出现m次的最长子串长度。后缀数组、二分、二叉堆、ST表所求的就是相邻的m个后缀的LCP,即这m-1个height[i]的最小值,所以可以二分答案,或者用ST表(O(nlogn)预处理,O(1)查询)来维护,或者用二叉堆也可以,这三种方法的运行速度依次降低。原创 2017-02-17 21:27:08 · 713 阅读 · 0 评论 -
Codeforces Round #364 (Div. 2) C. They Are Everywhere __ two pointers or binary search
two pointers or binary search1、binary searchint l = 0, r = n;while(l + 1 < r){ x = (l + r) >> 1; if(check(x)) r = x; //O(n)的检查 sz = x 时是否满足条件, 如果满足则 r = x, 然后继续检查x更小的情况, 最后 ans == x; else l = x;}复杂度 O(nlogn)2、two pointers用 sz 维护区间内的种类数 //原创 2016-09-25 22:21:47 · 1196 阅读 · 1 评论 -
Codeforces Round #377 (Div. 2) D. Exams 二分+贪心 or 纯贪心水过
二分+贪心 or 纯贪心水过/*!!!!!!1、纯贪心水过,事实上并不对比赛的时候是纯贪心水过了,后来经过同学和热心读者们的提醒,发现纯贪心是水过去的,事实上并不对,抱歉......2、二分+贪心二分右端点,然后check [0, x) 能不能满足条件,然后可以则 r = x, 否则l = x;关于check()函数,从右端点往左扫一遍,只留下最靠右的相同d[j]值,然后从左往右贪/*贪心的策略就是"1、纯贪心水过的策略"*/最后的r就是答案了,当 r == l 是 可能是没有答案也可能答案原创 2016-10-18 02:26:21 · 1313 阅读 · 8 评论 -
Codeforces Round #364 (Div. 2) D. As Fast As Possible __ binary search、方程 或解方程 直接解出答案
binary search、方程1、binary search、方程每个pupil 坐车的时间相同、走路的时间相同、总时间相同。所以 l = 0, r = INF;对于 每个答案 x,验证总时间 cnt <= x,即车跑的总时间要小于等于 总的总时间t1 + t2 == x // t1 为每个pupil 走路的总时间, t2 为每个pupil坐车的总时间,每个pupil 都必须且只做一次车v1 * t1 + v2 * t2 == l(路程) //求出 t2就像图中所原创 2016-09-25 22:56:17 · 1252 阅读 · 0 评论 -
Codeforces Round #379 (Div. 2) C. Anton and Making Potions 前缀最小值+贪心+二分搜索
题意:要合成n瓶要,合成每瓶药水需要的初始时间是x,并且总可以使用的法力值是s,然后有2种Spells,其中一种是可以把每瓶要的时间从x变成ai,并消耗bi点法力值;另一种是可以瞬间生成ci瓶药水,并消耗di点法力值,且ci、di是非递减的。这2种Spells分别每种最多使用其中的一个Spell。求配置这些药水需要消耗的最短的时间。前缀最小值+贪心+二分搜索先预处理出前缀最小值,及先把ab按照b优先升序排列,a为第二优先级,然后预处理以后 ab[i].a表示 消耗法力值<= ab[i].b是所能达到的最原创 2016-11-16 21:14:15 · 988 阅读 · 0 评论 -
Codeforces Round #380 (Div. 2) C. Road to Cinema 预处理+二重二分法+贪心
题意:从出发点0到目标点s,经过k个加油站,每个加油站可以在瞬间把车子的油箱加油加满,然后有n辆车子可以选择,每辆车有两个属性c、v分别表示花费、油箱容量,此外如果车慢速行驶,则每km耗油1升花时间2mins;如果高速行驶,则每km耗油2升花时间一分钟。求能够在 t 内从0到达s的情况下的最小花费。预处理+二重二分法+贪心把所有的车根据花费为第一优先级升序以容量为第二优先级降序排列然后预处理,使得,排在后面的车子的油箱容量必然大于等于前面的车子的容量,即把那些花费多但油箱容量小的车去掉。扫完后排个原创 2016-11-20 21:36:10 · 782 阅读 · 0 评论 -
Codeforces Round #299 (Div. 2) C. Tavas and Karafs 二分搜索+数列
题意:每个萝卜长度为 hi = a + (i - 1) * b,然后每次询问是每次操作最多把 m 个不同的未吃完的萝卜每个咬掉1单位长度,最多 t 次操作,其中求最大的r,是的[l......r]访问内的萝卜被这 t,m的操作吃完二分搜索+数列首先r必须且只要满足2个条件即可,1)a + (r - 1) * b <= t,2) sum{hi | l <= i <= r } <= t * m所以对于每个询问进行一次二分搜索即可。suml = (2 * a + ((l - 1) - 1) * b) *原创 2016-11-21 23:54:47 · 730 阅读 · 0 评论 -
Codeforces Round #381 (Div. 2) D. Alyona and a tree dfs+二分+线段树延迟操作、树形化线性
题意:一颗树,以有向图的方式读入,每个节点都有一个权值,每条边也有一条权值,当u在v的子树中,且u到v的边权和 <= u的点权时称v可以控制u。求出每个点可以控制 的结点的个数。dfs+二分+线段树延迟操作、树形化线性线段树延迟操作区间修改单点查询 O(nlogn)前缀和sum[ptr]维护的是u到根的路径上的边权和 O(n)用 树形转化为线性的思想 做,dfs到u的子节点v时,用二分的方法找到最靠近根的节点lr, 然后用把[lr, ptr-1]加1。当当前结点u,开始回溯的时候,此时单点查询,线原创 2016-11-27 17:26:36 · 831 阅读 · 0 评论 -
Codeforces Round #389 (Div. 2) E. Santa Claus and Tangerines 二分+贪心+记忆化搜索
题意:有n个橘子,每个橘子可以分成ai瓣,但每次只能把 一个完整的橘子或者由一些把构成的部分橘子 分成尽可能相等的两部分,即如果瓣数是偶数则当前只能分成相等的2部分,如果是奇数则分成2部分其中一部分比另一部分多1,然后把这些得到的橘子或者瓣分给k个小朋友,其中小朋友们得到瓣数中的最小值是答案,要求这个答案尽可能大二分+贪心+记忆化搜索由于每个小朋友只能得到一个橘子或者一些由瓣构成的部分橘子,所答案最大为max{ai} 这里ans 属于[1, 1e7],故在(0, 1e7 + 1)内]对答案进行二分(不会原创 2017-01-12 01:25:00 · 942 阅读 · 0 评论 -
AtCoder - 2159 Connectivity 并查集+二分、快速的求出2个集合的交集
题意:分别有一个road网络和一个railway网络,求每个点在2个网络中都连通的点的个数。并查集+二分先用并查集维护出2个网络的连通关系,然后把这些树转移到 map<int, vector<int>> mp里,//bitset 超时每次对于每个i,如果没有计算过ans,则比较mp1[_find(i)]和mp2[_find2(2)]这2个vector里相同的元素的个数,并且这些相同的数它们的ans都是一样的,比如把这些相同元素维护到一个map<int, bool> m里,则所有的m.first的a原创 2017-01-17 19:27:48 · 955 阅读 · 0 评论 -
Codeforces Round #365 (Div. 2) C. Chris and Road 实数级的二分法、几何
实数级的二分法、几何可以把问题分成2种情况第一种情况:车到线之前, 行人通过 //遍历 n 个点第二种情况:车到线之后,行人通过 //即行人等了x分钟之后, 开始过马路, 刚好可以安全通过, nlogn 二分答案 + 遍历 n 个点Y ( ^ _ ^ ) Y 实数级的二分法最开始用的 eps = 1e-6, Wrong answer on test 3然后改成 eps = 1e-9 就过了。二分部分的代码 double l =原创 2016-09-16 21:30:33 · 1322 阅读 · 0 评论