![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
二分
酷酷的Herio
这个作者很懒,什么都没留下…
展开
-
E - Average and Median(二分)
二分原创 2022-06-24 20:15:41 · 184 阅读 · 0 评论 -
C - Safe Distance(二分&DSU)
C - Safe Distance(二分&DSU)显然答案具有二分性,然后就是套路性对每个点化圆。考虑无解的情况,假设分成上下左右四个区域,显然上下连通或者左右连通无解,通路左下或右上连通无解。因此考虑对于相交的两圆进行并查集合并。然后就裸了。参考别人代码#include <bits/stdc++.h>using namespace std;const int N = 1e3 + 10;struct Res { double x, y; void read原创 2021-10-01 20:04:41 · 240 阅读 · 0 评论 -
P4322 [JSOI2016]最佳团体(分数规划&树上背包)
P4322 [JSOI2016]最佳团体(分数规划&树上背包)分数问题,首先转为二分性判定问题。每个结点的值变为:vali=ai−mid×bival_i=a_i-mid\times b_ivali=ai−mid×bi然后此题转化为一棵树。令f(i,j)f(i,j)f(i,j)以iii为结点的子树选择jjj个的最大值。对于二分的midmidmid,f(i,k+1)≥0f(i,k+1)\ge 0f(i,k+1)≥0则满足要求。时间复杂度:O(logMn2)O(logM n^2)O(lo原创 2021-08-23 14:28:01 · 310 阅读 · 0 评论 -
E. Water Taps(贪心&二分)
E. Water Taps(贪心&二分)∑i=1nxiti∑i=1nxi\dfrac{\sum\limits_{i=1}^n x_it_i}{\sum\limits_{i=1}^n x_i}i=1∑nxii=1∑nxiti 这个函数有单调性,因为分子增大得更快。且答案具有二分性,因为减少相同流量,温度大的下降的更快。我们把水管按照温度排序。所以对于当前答案ansansans,我们可以分别按顺序和逆序贪心求出最小和最大值。看T×ans∈[min,max]T\times ans原创 2021-08-14 10:11:12 · 292 阅读 · 0 评论 -
D. Vitya and Strange Lesson(01-Trie)
D. Vitya and Strange Lesson(01-Trie)全局异或、然后全局mexmexmex,可以用01−Trie01-Trie01−Trie。具体就是先把数组aaa插入到01−Trie01-Trie01−Trie中,每次尽可能往异或为000的方向走。维护一个sizesizesize,当size=2isize=2^isize=2i,就只能往另一个方向走了。注意维护sizesizesize之前需要去重,因为mexmexmex是不含重复的。// Problem: D. Vitya a原创 2021-08-13 10:04:12 · 224 阅读 · 0 评论 -
J. Journey to the “The World’s Start”(二分线段树dp)
J. Journey to the “The World’s Start”(二分线段树dp)显然卡的范围rrr是可以二分的,如果r1<r2r_1< r_2r1<r2 ,r1r_1r1 能满足显然r2r_2r2也能满足。然后考虑对于某个rrr,能否在ttt内到达nnn。这可以通过dp。显然由状态转移方程:dpi=max(dpj)+ti,j∈[i−r,i−1]dp_i=max(dp_j)+t_i ,j\in [i-r,i-1]dpi=max(dpj)+ti,j∈[i−r,原创 2021-08-12 18:24:04 · 265 阅读 · 0 评论 -
D. Minimax Problem(二分&状压)
D. Minimax Problem(二分&状压)答案具有二分性。二分答案ansansans,将所有≥ans\ge ans≥ans的数置为1,否则置为0。问题等价为是否存在两个数组 或运算 结果为:111111=2m−1111111=2^m-1111111=2m−1因为mmm较小,考虑状压表示一个数组。数组可以相同,所以2m−12^m-12m−1出现过直接输出。否则直接二重循环枚举状态4m4^m4m。时间复杂度:O(logA(4m+nm))O(logA(4^m+nm))O(logA原创 2021-08-11 16:08:28 · 293 阅读 · 0 评论 -
D. Pair of Numbers (ST表&二分&双指针)
D. Pair of Numbers (ST表&二分&双指针)显然就是找最大区间gcd=mingcd=mingcd=min ,且长度具有二分性,然后没了,代码懒得写,参考的题解区。#include <stdio.h>inline int read(){ int num=0;char c=getchar(); while(c<48||c>57)c=getchar(); while(c>47&&c<58)num=num*10+(原创 2021-08-04 16:28:31 · 304 阅读 · 0 评论 -
P3527 [POI2011]MET-Meteors(整体二分)
P3527 [POI2011]MET-Meteors(整体二分)考虑整体二分答案kkk。每次对于[l,m][l,m][l,m]区间使用BITBITBIT维护差分进行区间修改。然后对于[ql,qr][ql,qr][ql,qr]就单点查询然后求和,特判是否满足,若大于等于丢左子区间,否则丢右子区间,注意丢右子区间之后要减丢之前的贡献。然后递归处理即可。因为是环,所以考虑断环成链,将操作区间l>rl>rl>r的修改成[l,r+m][l,r+m][l,r+m],每次询问就加两个点。原创 2021-07-26 10:18:35 · 260 阅读 · 0 评论 -
P1084 [NOIP2012 提高组] 疫情控制(倍增&贪心&二分)
P1084 [NOIP2012 提高组] 疫情控制(倍增&贪心&二分)1.倍增预处理出f[i][j],d[i][j]f[i][j],d[i][j]f[i][j],d[i][j] 即结点iii到自己第2j2^j2j个父亲是谁、距离是多少。2.二分答案3.每次二分时,每个结点尽靠近根结点,即向上提,这样是最优的,能控制更多叶子。4.把不能到达的树根的儿子结点的所有位置标记为驻扎,因此这个点不能再往上走了。5.把能到达树根的儿子结点的位置和多余时间记录。6.dfs搜一下哪些树根的儿子结原创 2021-07-14 15:45:30 · 565 阅读 · 0 评论 -
P1314 [NOIP2011 提高组] 聪明的质监员(二分&前缀和)
P1314 [NOIP2011 提高组] 聪明的质监员(二分&前缀和)1.二分W2.每次预处理出w,v得为前缀和。3.如果sum>s 说明W要增大,否则W减小,这样才会更接近s,因此二分W正确性有保证。时间复杂度:O(nlog(n+m))O(nlog(n+m))O(nlog(n+m))// Problem: P1314 [NOIP2011 提高组] 聪明的质监员// Contest: Luogu// URL: https://www.luogu.com.cn/problem/P1原创 2021-05-13 17:17:51 · 330 阅读 · 1 评论 -
CF1073C Vasya and Robot(前缀和&二分)
CF1073C Vasya and Robot(前缀和&二分)1.二分答案2.对于当前答案长度lenlenlen,预处理出x,Yx,Yx,Y的前缀和,求出除了[l,r][l,r][l,r]的两端的操作得到的坐标,然后我们特判len≥abs(X−dx)+abs(Y−dy)len\ge abs(X-dx)+abs(Y-dy)len≥abs(X−dx)+abs(Y−dy)注意还需要特判(len−abs(X−dx)+abs(Y−dy))(mod2)=0(len-abs(X-dx)+abs(Y-dy))原创 2021-05-11 11:16:45 · 266 阅读 · 0 评论 -
P1419 寻找段落(二分&单调队列)
P1419 寻找段落(二分&单调队列)1.二分答案2.∑i=lrai≥ans×(r−l+1)\sum\limits_{i=l}^r a_i\ge ans\times (r-l+1)i=l∑rai≥ans×(r−l+1)⇒∑i=lr(ai−ans)≥0\Rightarrow \sum\limits_{i=l}^r (a_i-ans)\ge 0⇒i=l∑r(ai−ans)≥0令bi=ai−ansb_i=a_i-ansbi=ai−ans我们只需要判断∑len∈[s,t]b[i]≥0\原创 2021-05-11 10:46:27 · 321 阅读 · 0 评论 -
D.Sabotage(二分)
D.Sabotage(二分)思路考虑二分答案。sn−(sr−sl−1)n−(r−l+1)≤x\dfrac{s_n-(s_r-s_{l-1})}{n-(r-l+1)}\le xn−(r−l+1)sn−(sr−sl−1)≤x化简一下:sn−nx−(sr−rx)+[sl−1−(l−1)x]≤0s_n-nx-(s_r-rx)+[s_{l-1}-(l-1)x]\le 0sn−nx−(sr−rx)+[sl−1−(l−1)x]≤0因此可以枚举rrr,然后不断取sl−1−(l−1)xs_{l-1}-原创 2021-03-09 11:30:38 · 229 阅读 · 0 评论 -
01分数规划的学习(二分)
01分数规划的学习(二分) 01分数规划用于解决给定nnn个物品,有两个属性a,ba,ba,b,找出一个子集满足∑ai∑bi\dfrac{\sum a_i}{\sum b_i}∑bi∑ai最大。思路 此类题型,一般转化为∑ai−x∑bi≥0\sum a_i-x\sum b_i\ge 0∑ai−x∑bi≥0。我们可以二分xxx,即题意转化为求∑ai∑bi≥x\dfrac{\sum a_i}{\sum b_i}\ge x∑bi∑ai≥x中最小值最大化。而ai−xbia_i-原创 2021-02-08 17:13:53 · 268 阅读 · 0 评论 -
LC.1631. 最小体力消耗路径(二分&BFS)
LC.1631. 最小体力消耗路径(二分&BFS)题意给定n×mn\times mn×m矩阵,每个点有一个高度hhh,求从(0,0)(0,0)(0,0)走到(n−1,m−1)(n-1,m-1)(n−1,m−1)的路径中相连高度差最大值的最小化。思路最大值最小化问题,考虑二分答案,因此我们只需要判断能否在w≤answ\le answ≤ans的情况下从(0,0)(0,0)(0,0)走到(n−1,m−1)(n-1,m-1)(n−1,m−1)这个bfsbfsbfs一下即可。时间复杂度:O(nm原创 2021-01-29 15:58:19 · 348 阅读 · 1 评论 -
P7287 「EZEC-5」魔法(贪心&二分)
P7287 「EZEC-5」魔法(贪心&二分)思路一开想枚举答案区间[l,r][l,r][l,r],发现这样枚举会炸。正解是枚举操作次数,而且注意到最优的操作肯定是先+++再乘的。所以我们可以枚举乘的次数,然后二分加的次数,至于找最大区间就可以贪心,O(n)O(n)O(n)求出最大字段和即可。时间复杂度:O(nlog2s)O(nlog^2s)O(nlog2s)代码#include<bits/stdc++.h>using namespace std;typedef lo原创 2021-01-24 14:32:44 · 412 阅读 · 0 评论 -
P1182 数列分段 Section II (贪心&二分)
P1182 数列分段 Section II(贪心&二分)思路 贪心+二分,考虑二分答案,然后贪心地分组。需要注意的是l,rl,rl,r的开始范围,lll数列最大值,rrr是数列之和,不然二分的时候可能会有的组是空的,造成答案错误。代码#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=1e5+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;#def原创 2021-01-19 14:51:05 · 304 阅读 · 0 评论 -
K. Master of Sequence (转化&二分)
K. Master of Sequence (转化&二分)对于操作3:肯定要考虑将除法转化为求和才能方便计算。令t=ai×k1+c1,bi=ai×k2+c2t=a_i\times k_1+c_1,b_i=a_i\times k_2+c_2t=ai×k1+c1,bi=ai×k2+c2⌊t−biai⌋=k1−k2+[c1−c2]\lfloor\dfrac{t-b_i}{a_i}\rfloor\\=k_1-k_2+[c_1-c_2]⌊ait−bi⌋=k1−k2+[c1−原创 2020-10-30 15:14:18 · 433 阅读 · 2 评论 -
1057 Stack (树状数组+二分)
1057 Stack (树状数组+二分)用stackstackstack+权值树状数组储存对应值,然后二分查找中间值即可。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=1e3+5,M=1e5+5,inf=0x3f3f3f3f,mod=1e9+7;#define mst(a,b) memset(a,b,sizeof a)#define lx x<<1#define原创 2020-10-09 20:21:13 · 339 阅读 · 0 评论 -
1044 Shopping in Mars(枚举&二分)
1044 Shopping in Mars(枚举&二分)思路:枚举+++二分。假设答案区间为[l,r][l,r][l,r],预处理出前缀和,因为前缀和的非递减性。因此,对于每个lll,可以进行二分找到最小大于等于mmm的rrr。时间复杂度:O(nlogn)O(nlogn)O(nlogn)#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=1e5+5,M=2e4+5,inf=原创 2020-10-06 18:58:13 · 225 阅读 · 0 评论 -
牛牛找子集(二分)
牛牛找子集(二分)思路:经典二分题,具体看代码。#define se second#define fi firstclass Solution {public: /** * 返回找到能够满足游戏胜利条件的子集,如果有多个子集满足条件,返回字典序最小的即可。 * @param n int整型 代表数字的数量 * @param k int整型 代表子集的大小 * @param s int整型vector 代表数字数组 * @return int原创 2020-08-14 11:40:58 · 336 阅读 · 0 评论 -
P1663 山(二分&数学)
P1663 山(二分&数学)思路:二分+++数学.题意转化为:求在所有直线上方的点的最小yyy值。考虑二分yyy,判断xxx是否成立即可。令任意一条直线y=kx+by=kx+by=kx+b。1.若k>0→x≤y−bkk>0\rightarrow x\le\dfrac{y-b}{k}k>0→x≤ky−b2.若k<0→x≥y−bkk<0\rightarrow x\ge\dfrac{y-b}{k}k<0→x≥ky−b3.若k=0→y≥bk=0\righ原创 2020-08-04 16:20:48 · 377 阅读 · 0 评论 -
P1396 营救(最小瓶颈路)
P1396 营救(最小瓶颈路)这个题貌似时最小瓶颈路的前身,单词离线查询。思路:1.最小生成树kruskalkruskalkruskal,当s,ts,ts,t联通时的对应边权值为答案。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=1e4+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;#define mst(a) memset(a,0,sizeof a)原创 2020-07-31 16:41:25 · 591 阅读 · 0 评论 -
LC.410.分割数组的最大值(DP&二分)
LC.410.分割数组的最大值(DP&二分)感觉这个题挺好的。思路:1.dpdpdp。看到分割成mmm个数组就会想到用dpdpdp做,显然设dp[i][j]dp[i][j]dp[i][j]前iii个数分割成jjj个组的最小值。对于状态转移我们需要枚举第j−1j-1j−1组的最后一个数的位置kkk。即:dp[i][j]=max(dp[k][j−1],pre[i]−pre[k])dp[i][j]=max(dp[k][j-1],pre[i]-pre[k])dp[i][j]=max(dp[k][原创 2020-07-25 11:38:04 · 367 阅读 · 0 评论 -
牛牛分蛋糕(暴力&二分)
牛牛分蛋糕(暴力&二分)思路:暴力ororor二分。1.可以直接暴力枚举aaa分配盘子的个数,根据贪心的原则,分配平均值就是最优的。时间复杂度:O(n)O(n)O(n)class Solution {public: int solve(int n, int a, int b) { int ans=1; for(int i=1;i<n;i++) ans=max(ans,min(a/i,b/(n-i))); return ans;原创 2020-07-19 13:39:28 · 566 阅读 · 0 评论 -
P3718 [AHOI2017初中组]alter
P3718 [AHOI2017初中组]alter传送门思路:二分+贪心。一开始用了一下优先队列+贪心取中间,搞了727272分。后来看了下,这不是最大值最小化,二分裸题吗。就写了二分+贪心取第一次超过xxx的位置。但是这样做是有点问题的。以111为灯开着的状态,0为关着的状态。ep:1100011,k=1ep:1100011,k=1ep:1100011,k=1。这题ans=2ans=2ans=2,但是按照上述算法答案是333。因为遍历到000000000的最后一个0时,cnt=3>原创 2020-07-10 12:40:52 · 525 阅读 · 1 评论 -
LC.378. 有序矩阵中第K小的元
LC.378. 有序矩阵中第K小的元素传送门思路:1.对所有元素排序,时间复杂度:O(n2logn2)O(n^2logn^2)O(n2logn2)class Solution {public: int kthSmallest(vector<vector<int>>& a, int k) { int cnt=0; vector<int>b; for(int i=0;i<a.size();i原创 2020-07-02 10:33:55 · 261 阅读 · 0 评论 -
LC.209. 长度最小的子数组
LC.209. 长度最小的子数组方法1:前缀和+二分。考虑将其转化为具有单调性的前缀和数组,然后枚举区间左端点进行二分找答案即可。时间复杂度:O(nlogn)O(nlogn)O(nlogn)class Solution {public: int minSubArrayLen(int s, vector<int>& a) { vector<int>pre(a.size()+1); for(int i=1;i<=a.si原创 2020-06-28 08:52:17 · 530 阅读 · 0 评论 -
P1542 包裹快递(二分)
P1542 包裹快递(二分)传送门思路:显然答案具有单调性,考虑二分答案,判断一下每次的时间,如果超过y[i]y[i]y[i]返回000,若小于x[i]x[i]x[i],则将时间置为x[i]x[i]x[i]即可。注意数据卡精度,用Long doubleLong\ doubleLong double才能过所有点。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=2e原创 2020-06-25 10:50:17 · 656 阅读 · 0 评论 -
D. Odd-Even Subsequence(贪心+二分)
D. Odd-Even Subsequence(贪心+二分)传送门思路:贪心+二分。因为答案具有单调性,考虑二分,因为只需要取奇区间和偶区间的最小值,所以我们看可以分别计算答案的奇区间的情况和偶区间的情况,贪心的选取一个满足a[i]≤ansa[i]\leq ansa[i]≤ans的数,然后立马将后面一个数给另一个区间,这样能为该区间选取数有更多机会,因为若后面一个数也是≤ans\leq ans≤ans,贡献是一样的。#include<bits/stdc++.h>using namesp原创 2020-06-23 21:41:39 · 549 阅读 · 0 评论 -
失忆药水(二分图结论)
失忆药水(二分图结论)传送门挺好的一个图论结论题,nnn阶无向完全图,求最少删去多少边得到二分图。也就是最多有多少边能组成二分图。显然两边取一半顶点是最优的情况。nnn是偶数是取两个n2\dfrac{n}{2}2n,当nnn是奇数时取n2和(n−1)2\dfrac{n}{2}和\dfrac{(n-1)}{2}2n和2(n−1)所以答案是{n(n−1)2−n2×n2,n为偶数n(n−1)2−(n−1)2×n2,n为奇数\begin{cases}\dfrac{n(n-1)}{2}-\dfra原创 2020-06-22 17:32:35 · 608 阅读 · 0 评论 -
牛牛爱学习(贪心&二分)
牛牛爱学习(贪心&二分)传送门思路:二分的练手好题,显然枚举的天数是有单调性的,然后就是贪心的计算天数为xxx的最大贡献,显然是从大到小取即可,每xxx个为一类,一开始减0,再减1知道某一个物品贡献小于等于0.#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=1e6+5,M=1e6+5,inf=0x3f3f3f3f,mod=1e9+7;#define mst(a) mems原创 2020-06-22 17:11:32 · 568 阅读 · 2 评论 -
Min Value(二分)
Min Value(二分)传送门思路:排序后二分,注意下细节+特判。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=1e5+5,inf=0x3f3f3f3f;#define mst(a) memset(a,0,sizeof a)#define lx x<<1#define rx x<<1|1#define reg register#define P原创 2020-06-14 19:29:49 · 403 阅读 · 0 评论 -
跳石头(二分)
跳石头(二分)思路:二分中:最小值最大化问题。传送门#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=1e5+5;#define mst(a) memset(a,0,sizeof a)#define lx x<<1#define rx x<<1|1#define reg register#define PII pair<int,int>原创 2020-06-10 12:24:18 · 456 阅读 · 0 评论 -
关于二分的具体类型及实现方法。
关于二分的具体类型及实现方法。1.将最大值最小化 while(l<r){ //最大值最小化 int mid=(l+r)>>1; //总是检查区间靠左部分 if(check(mid)) r=mid;//答案在[l,mid]. else l=mid+1;//答案在[mid+1,r]内. } //此时 l==r 为答案. 此时的l==rl==rl==r就是答案,每次检查区间靠左的部分。2.将最小值最大化 while(l<r){原创 2020-06-10 12:20:36 · 510 阅读 · 0 评论 -
D. Guess The Maximums(简单二分)
E. Tree Shuffling(简单二分)传送门思路:题意太迷惑了,它的意思是只要找到一个满足条件的数组PPP即可,而不是要求跟预设的数字一模一样,真实迷惑,显然二分找到最大元素下标所在集合SSS.然后除了PiP_iPi其他都为最大元素,PiP_iPi的求法就是所有集合去掉SiS_iSi再询问一次最大元素答案就是PiP_iPi 。MDZZ#include<bits/stdc++.h>using namespace std;typedef long long ll;con原创 2020-06-01 10:40:02 · 456 阅读 · 0 评论 -
P1083 借教室(差分前缀和&二分)
P1083 借教室(差分前缀和&二分)传送门思路:差分前缀和+二分。对于区间的加减可以用通过差分数组实现,因为要求最小不满足条件的编号,因为此情况具有单调性,所以可以二分答案。时间复杂度:O(nlogn)O(nlogn)O(nlogn)AC代码:#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=1e6+5;struct p{ int d,l,r;}a[N];int原创 2020-05-15 18:21:36 · 313 阅读 · 0 评论 -
P1102 A-B 数对(二分&尺取)
P1102 A-B 数对(二分&尺取)思路:二分或者尺取,枚举每个bbb找到对应的等于b+cb+cb+c最大区间。时间复杂度:O(nlogn)O(nlogn)O(nlogn)AC代码:#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<string>#include<cmath>#include<s原创 2020-05-14 13:22:23 · 357 阅读 · 0 评论 -
Subsequence(尺取法&二分)
Subsequence(尺取法&二分)传送门法1:前缀和+二分思想。预处理前缀和以便于求区间和,然后枚举所有区间左端,二分查找右端,用STLSTLSTL自带的lower_boundlower\_boundlower_bound即可。时间复杂度:O(nlogn)O(nlogn)O(nlogn)法2:尺取法,枚举区间左端点,根据区间单调性,让区间右端点不断增加并更新答案。时间复杂度:O(n)O(n)O(n)法1代码:#include<cstdio>#include<i原创 2020-05-14 09:41:33 · 379 阅读 · 0 评论