![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
二分与倍增
文章平均质量分 58
从n到log的升华
wind__whisper
qwq
展开
-
AT5662 [AGC040D] Balance Beam(二分)
智慧题原创 2022-07-21 21:02:59 · 156 阅读 · 0 评论 -
洛谷P4007:小 Y 和恐怖的奴隶主(期望、矩阵快速幂)
矩阵快速幂原创 2022-04-20 10:42:12 · 188 阅读 · 1 评论 -
P3746 [六省联考 2017] 组合数问题(倍增、dp)
披着组合数外皮的dp原创 2022-03-20 20:08:16 · 223 阅读 · 0 评论 -
洛谷P7518:宝石(倍增、可撤销并查集)
倍增+可撤销并查集原创 2022-02-27 10:34:22 · 152 阅读 · 0 评论 -
模板:wqs二分
关于选取物品个数问题的处理技巧原创 2022-01-24 19:44:10 · 380 阅读 · 0 评论 -
P3242 [HNOI2015] 接水果(整体二分、扫描线、dfs序)
比较综合的整体二分应用原创 2021-12-27 23:20:47 · 150 阅读 · 0 评论 -
模板:整体二分
不太常见的科技原创 2021-12-26 00:56:59 · 142 阅读 · 0 评论 -
P4299 首都(LCT、重心)
利用LCT动态维护重心原创 2021-12-09 23:21:58 · 123 阅读 · 0 评论 -
YBTOJ&洛谷P3292:幸运数字(线性基、点分治/倍增)
一道比较难想到的点分治应用原创 2021-12-04 10:56:19 · 217 阅读 · 0 评论 -
CF1404C:Fixed Point Removal(离线)(树状数组二分)
解析写了不少线段树上二分,原来树状数组上也是可以二分的首先如果ai>ia_i>iai>i,那必然无法删除,下面只考虑ai<=ia_i<=iai<=i的情况本题试图离线不难想到,但我一开始总是按照刻板思维尝试按序移动左端点,结果根本没法做…反过来想,移动右端点就可做多了设fif_ifi表示当前右端点为r的情况下,[i,r]最多可以删掉的数量那么我们当把r移动到r+1时,只有fi>=i−aif_i>=i-a_ifi>=i−ai时才会对f原创 2021-11-11 20:35:12 · 141 阅读 · 0 评论 -
模板:树状数组二分
所谓树状数组二分,就是在树状数组上进行二分(逃)解析很巧妙我们都知道可以在线段树上利用其本身平衡二叉的性质进行二分,很多时候能剩下一个log但是树状数组其实也是可以二分的说是二分,其实更像倍增毕竟不同于线段树,树状数组这个数据结构本身就是基于二进制实现的从大到小枚举幂次,然后判断如果指针可以移过去就移动还需要一个累加器记录沿路累加的 f 数组的和代码长度再次吊打线段树代码这个是在单调不增的数组中找到最后一个>=val的位置inline int find(int val){.原创 2021-11-11 17:54:11 · 1315 阅读 · 0 评论 -
NOIP2012:疫情控制(二分、贪心、树上倍增)
解析二分的单调性较为明显,一路推导下去的性质都不算太难想,正解的思路还是不难想到的但从头到尾都实现很考验思维的严密性和代码能力然后我就双重被考验挂了qwq第一交的时候一个地方把倍增的dis数组写成pl,判断封口也有问题…但竟然有70真实考试的时候绝对不能出打错数组这种错!提交前还是要谨慎一些!另外那个判封口…只能说路漫漫其修远兮了…我对于最后根下方儿子(暂且叫它次根好了)与军队贪心匹配的地方写的和题解不太一样题解的实现是:爬到根下方的军队不考虑,然后把所有军队提出来一起贪心我的做法是先给原创 2021-11-07 02:35:57 · 183 阅读 · 0 评论 -
YBTOJ&洛谷P2839:最大中位数(主席树、二分答案)
遇事不决,二分试试解析很好的一道题真是把主席树玩明白了一个关于中位数的常用trick:二分答案mid,把>=mid的看成1,<mid的看成-1,然后看最大子段和是否>=0然而如果对离散化后的每一个值建一棵小白逛公园那样的线段树显然时空双炸这里主席树就用上了注意到关于相邻的值域所建的两棵主席树只有个别值从1变成-1所以就用主席树优化时空即可时间复杂度mlogn2mlogn^2mlogn2,空间复杂度nlognnlognnlogn代码#include<bi.原创 2021-10-24 17:26:46 · 98 阅读 · 0 评论 -
NOIP2018&洛谷P5021:修建赛道
没有证明的贪心就是乱搞解析把标签写在题面上的一道题…显然要二分答案然后看能不能分出来m个关键策略是每个结点内部尽可能的多匹配的前提下,给父亲传一个最大的这不纪念品分组?然后我就无脑的敲了个双指针的贪心上去然后就WA掉了qwq(由于带限制的点太多这竟然还有80)纪念品分组的贪心只保证了尽可能多匹配却不能保证剩下一个最大的一个简单的例子是较小值和次大值匹配,把最大值传上去然而如果按照从小往大扫,每一个贪心的想与尽可能小的匹配,这样就能保证贪心的正确性了代码#include<.原创 2021-10-19 21:33:24 · 103 阅读 · 0 评论 -
洛谷P1852:跳跳棋(LCA,树形结构)
解析考虑一个三元组(x,y,z)(x,y,z)(x,y,z),看它能如何跳要么是yyy往左右跳,左右边界会变大要么是两边往中间跳,由于最多跨过一个棋子,所以左右边界会变小当三点等距时,无法往中间跳于是我们惊喜的发现:可以互相转移的状态形成了一个二叉树形结构!!!往中间跳的时候,相当于跳父亲;往两边跳相当于跳儿子当且仅当两个状态的根相同时,有解又由于这个跳的操作是可逆的,所以我们的问题就可以转化为两个点在树上的距离于是我们就可以用类似倍增求LCA的思路解决本题代码#include<原创 2021-10-14 20:10:44 · 299 阅读 · 0 评论 -
YBTOJ:公共子串(KMP)
文章目录题目描述解析代码题目描述解析我的做法是二分答案,暴力枚举子串,对其他的字符串进行KMP。复杂度logL*L2没有一次AC,因为忘记了字符串清零!,否则它会和上次二分的字符串没被覆盖到的部分连在一起。之前遇到过类似的问题了,没有引起重视,需要注意一下做完后看了下题解,其实不用二分答案,用最短串枚举起点,对其他串进行KMP匹配,记录最大的失配位置就可以了,复杂度比我的做法少一个log代码(还是带log的做法。。。)#include<bits/stdc++.h>usin原创 2021-07-29 16:44:11 · 149 阅读 · 0 评论 -
P2601 [ZJOI2009]对称的正方形(二维哈希)(二分)
洛谷传送门文章目录题目描述解析代码题目描述解析做三个hash分一下正方形边长的奇偶性然后枚举中心点,二分边长即可有点类似模拟赛那道红十字的题我一开始觉得分奇偶好麻烦啊为什么不直接枚举左上方的点二分呢?awa很遗憾的是…那样答案就没有单调性了啊…我个傻子qwq代码#include<bits/stdc++.h>using namespace std;#define ll long longtypedef unsigned long long ull;const原创 2021-07-28 16:08:28 · 148 阅读 · 0 评论 -
P1081 [NOIP2012 提高组] 开车旅行(倍增)(动态规划)
洛谷传送门文章目录题目描述解析代码题目描述解析利用倍增,设计dp慢慢敲即可。。。注意距离累加在一起会爆int,需要ll特判条件非常之复杂。。。心力交瘁,就酱了代码#include <bits/stdc++.h>using namespace std;#define ll long longtypedef pair<ll,ll> pr;const int N = 3e5 + 100;int n,m;struct node{ int id,h; boo原创 2021-07-18 16:12:01 · 206 阅读 · 0 评论 -
洛谷P2680:运输计划(倍增、二分、树上差分)
传送门文章目录题目描述解析问题代码题目描述解析求最大值的最小值容易想到二分然后。。。就没有然后了。。。看了题解学会了一个新技能:树上差分(其实学长之前好像讲过。。。)一般的,对于一条A到B的路径,如果要将其全部加上一个值w。我们可以把AB两点的前缀加w,再把它们的lca及lca的父亲减去w,最后统计时用dfs统计,每个点的价值就是其本身及子树的前缀值之和画个图就能很直观的看出来,请读者自行动笔探究~~(绝对不是我懒)~~lca可以用许多算法优化到log,这样时间复杂度就很优秀啦本原创 2021-06-14 00:37:31 · 166 阅读 · 0 评论 -
猜数(二分、线段树)
题目描述对于一个长度为n的数列给出m个描述每一个描述给出一个区间[a,b]的最小值的x求从第几个描述开始矛盾解析本题关键是一个关于矛盾的充要条件:如果存在一个最小值x,其所在的区间的交集(就是它真正可以存在的区间)是比x大的所有最小值的区间的并集的子集,那么就会矛盾(因为x肯定在那些区间中的一个里,那么那个区间的最小值就应该是x了)知道这个之后后面就好做了把所有区间按最小值降序排序二分出现矛盾的位置mid每次按新顺序考虑mid之前的描述用线段树维护之前所有的并集并查询交集判断是否原创 2021-06-12 16:21:01 · 97 阅读 · 0 评论 -
货车运输(洛谷P1967)(倍增)
传送门文章目录题目描述题目解析代码题目描述题目解析本题如果告诉你,城市形成了一棵树,是不是就迎刃而解了呢?本题的关键就是把稠密图转化为一片森林(就是可能有很多棵树啦)怎么转化呢?考虑哪些边是没用的如果AB已经可以联通且限重很大,再给我一条A到B限重很小的边肯定没有用了换句话说,我们有用的边就是本图中的一座最大生成森林(不明白这个词的童鞋可以类比一下最小生成树的概念)怎么证明呢?很容易考虑怎么生成最大森林的:每次选出未选的权值最大的边,如果两边的点未联通就连上假设A到B的最好路原创 2021-06-08 00:32:40 · 134 阅读 · 0 评论 -
树的合并(ybtoj-树上dp)
文章目录题目描述前言解析代码thanks for reading!题目描述前言全网唯一AC!!!妙啊而且还是完全自己想出来的做法开心(APIO还是没白听)但是思路出来后代码实现十分坎坷建两个图分别dfs3次那个地方就算是写不明白了代码能力需要加强解析定义数组dis:dis[i]表示i在自己那棵树上所能连出的最长简单路径不难看出:对于将两棵树上的边x,y相连时新的直径要么是两棵树原来一棵的直径,要么就是经过了x和y也就是:max3(直径A,直径B,dis[x]+di原创 2021-05-23 01:10:16 · 385 阅读 · 0 评论 -
二分:[BJWC2008]秦腾与教学评估
洛谷传送门解析因为至多有一个单数假设其位置为k,1-i的累加和为s[i]则s[1]-s[k-1]全是偶数s[k]-s[max]全是奇数答案呈单调性,可以用二分算法check函数(计算前缀和)也很容易用O(n)写出:long long check(int x){ long long tot=0; for(int i=1;i<=n;i++){ if(p[i].b<=x){ tot += (p[i].b-p[i].a)/p[i].m+1; } else if(p原创 2021-01-26 18:11:09 · 104 阅读 · 0 评论 -
二分:路标设置(洛谷)
传送门.解析只需二分枚举空旷指数即可对于单次判断的check函数,可以相当于n个路标把路面分成n+1个间隔,而对于每个间隔[l,r]和空旷指数x(边界已有路标),所需路标应为:(r-l-1)/x(比如[2,5],x=3,显然不用,所以需减1)这样每段复杂度为O(1)check复杂度则为O(N)可以得到解决代码#include<cstdio>#include<cstring>#include<cmath>#include<algorith原创 2021-01-26 16:19:04 · 295 阅读 · 4 评论 -
二分算法:平均值(洛谷 UVA1451)
解析这道题寻找平均值的max,答案明显具有单调性,所以采用二分算法从0到1不断取中点mid作为平均值的可能点,看是否存在不短于l的数列均值>=mid不难得到以下代码:double st=0,ed=1; for(int i=1;i<=10;i++){ double mid=(st+ed)/2; if(check(mid)) st=mid; else ed=mid; }现在的问题就是要解决这个check函数的写法了因为N范围到1e5,暴力的On方肯定是会超的我们想.原创 2021-01-24 01:23:23 · 403 阅读 · 0 评论 -
RMQ问题:与众不同(st表的高端应用)
解析预处理用pre[i]表示以i结尾的最长完美序列起始点,用last[i]表示数字i最后出现的位置那么可以得到递推式:pre[i]=max(pre[i-1],last[x[i]]+1);也就是说这个pre要么是受前一位一样的限制,要么是受自己的限制用f[i]表示以i结尾的最长完美序列长度,那么显然:f[i]=i-pre[i]+1;以上可以用O(n)完成预处理询问接下来对于每次询问区间 [l,r] 中的每一位,只有两种可能:1.pre在l左侧或l上2.pre在l右侧根据之前的递.原创 2021-03-07 20:33:54 · 257 阅读 · 0 评论 -
倍增:喷泉 深度解析(洛谷P7167)
洛谷传送门解析什么破题数据范围来看很明显最多到nlogn我们想到用倍增算法首先,对于样例进行一下分析:我们可以把它转化为一棵树:既然是树,自然要找爸爸(滑稽)可以使用一个priority_queue来找:for(int i=1;i<=n;i++){ scanf("%d%d",&p[i].d,&p[i].c); p[i].id=i; while(!q.empty()){ node m=q.top(); if(m.d<p[i].d){原创 2021-01-27 21:03:43 · 260 阅读 · 0 评论 -
倍增:st表(模板)(洛谷P3865)
[传送门](https://www.luogu.com.cn/problem/P38解析板子题最棒了用mx[i][j]存储以i为起点,长度为2^j次方的区间内的max分成前后两段,则可以得到递推式:mx[i][k]=max(mx[i][k-1],mx[i+mi[k-1]][k-1]);而关于初始化,显然:mx[i][0]=a[i];预处理时间复杂度为nlogn对于任意长度[l,r]我们可以找到不大于其长度的最大的2^k则max[l,r]=max(mx[l][k],mx[r - (1原创 2021-01-27 20:38:12 · 124 阅读 · 0 评论