ACM-二分
文章平均质量分 62
二分
Echo_ac
不知未来怎样,现在一定全力以赴
展开
-
Codeforces Round #763 (Div. 2) C. Balanced Stone Heaps(弱鸡分析)
题目链接思路正解是二分答案+贪心,很多人可能不明白为何检验的时候能从后往前检验,这里来分析一波。对于每次二分枚举到的最小值 xxx , 我们要保证每一堆石头的数量最后都 ≥x\geq x≥x ,如果从前往后分配,对于当前堆的石头数量 aia_iai , 我们无法知道该分配多少给 ai−1,ai−2a_{i-1}, a_{i-2}ai−1,ai−2 ,也无法知道分配了aia_iai以后能不能再让 ai≥xa_i \geq xai≥x。如果从后往前, 如果当前 bi≤xb_i \leq xbi原创 2022-01-02 11:06:26 · 475 阅读 · 0 评论 -
CCPC.2017哈尔滨站 K-th Number——二分答案,加套路
题目链接这道题本蒟弱拿到时不会做,参考了博客: 大佬题意每次对于数组A中的每一个连续的长度大于等于k的区间中第k大的数,加入B数组中,最后求B数组中第m大的数思路先说坑点,这里输入的m要开long lognB数组中第m大的数,我们可以假设为x。由于B数组中的每一个数都是A中某一个长度大于等于k的区间的第k大的数,所以B数组有m个大于等于x的数,相当于A中有m个区间,这些区间的第k大数都大于等于x。所以问题转换成,我们二分枚举每一个x,然后去检查,A当中是否有至少m个区间,这些区间的第k大数都原创 2021-08-25 10:14:41 · 131 阅读 · 0 评论 -
[HNOI2006]公路修建问题 ——二分答案+krukal(蒟弱个人总结)
题目链接文章目录题意:题解:AC代码题意:题目要求我们在n个景点之间建立n-1条公路,在花费尽量少的情况下至少有k条一级公路,求花费最多的一条公路的最小花费题解:二分答案+kruskal,在[l,r]之间二分答案,l为输入的最小花费,r为输入的最大花费check函数里面跑两次kruskal,第一次选一级公路,第二次选二级公路,如果选的一级公路的条数>=k,并且一级公路数量和二级公路数量==n-1,那么return true,继续二分更小的mid;否则mid太小了,return false原创 2021-01-29 16:14:47 · 170 阅读 · 2 评论 -
蓝桥杯 递增三元组(枚举,二分,思维)
我是题目,快点我思路;枚举数组b,傻傻的我开始枚举数组a,然后二分查找就行详细见注释代码:#include<bits/stdc++.h>using namespace std;typedef long long LL;const int N = 1e5+9;int a[N],b[N],c[N];int main(){ int n; cin>>n; for(int i=1;i<=n;i++) scanf("%d",&原创 2020-07-31 22:17:47 · 163 阅读 · 0 评论 -
机器人跳跃问题——二分优化加注意事项
题目链接思路:思路很简单,首先获取输入的H(min)和H(max),在这之间二分枚举,每一次判断是否合法,如果合法则r=mid继续枚举注意:每一次判断时,可能会出现爆数据的现象,两种方法解决1取模,这里取模方式很重要,单独取模e%=mod会出错2判断 if(e>=ma) return true;#include<bits/stdc++.h>using namespace std;const int N = 1e5+9;typedef long long LL;co原创 2020-07-24 22:07:08 · 128 阅读 · 0 评论 -
P1102 A-B 数对(二分 STL函数的运用)
题目思路:查找A-B = C的对数,则A = B+C,等价于枚举B,查找,数组中有多少个等于B+C的个数,再累加起来upper_bound():返回的是被查序列中第一个大于查找值得位置;lower_bound():返回的是被查序列中第一个大于等于查找值的位置#include <bits/stdc++.h>using namespace std;typedef long long LL;const int maxn = 2e5+7;LL num[maxn];LL cnt = 0原创 2020-06-22 18:15:20 · 103 阅读 · 0 评论 -
P2249 【深基13.例1】查找(挂个代码)
题目方便自己以后复习代码:#include <bits/stdc++.h>using namespace std;typedef long long LL;const int maxn = 1e6+9;int a[maxn];int main(){ int m,n; cin>>n>>m; for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=m原创 2020-06-22 08:56:26 · 325 阅读 · 0 评论