
二分
青烟绕指柔!
我不怕千万人阻挡,只怕自己投降。
展开
-
「EZEC-6」分组
题目链接:「EZEC-6」分组我们可以发现一个 n*log 值域的简单做法,但是复杂度过高。我们可以发现,一个数字我们可以看成由最高位贡献,然后从低位枚举上去看是否合并。所以只需要二分最高位即可。复杂度就变成:O(nlog60+6060)AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;原创 2021-03-01 17:53:15 · 246 阅读 · 0 评论 -
「EZEC-5」魔法
题目链接:「EZEC-5」魔法不难发现一定是先做操作2。然后操作2一共最多执行log次。所以我们可以枚举操作2的次数。然后判断最小次数的操作1,二分即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const int N=1e5+10;int n,A,B,s,a[N],res=1e原创 2021-01-23 23:40:51 · 260 阅读 · 0 评论 -
Delete Prime
题目链接:Delete Prime对每个问题单独考虑。第二个问题就是第k个位置的值,那么我们对当前的n分解,直到当前分解出来大于k了,那么问题转化为第 i 轮被移出的第 j 个数的问题,直接在第 i 轮出去的前缀和上面二分。第一个问题就是 k 是第几个位置,同理每次对n分解,然后求出某次大于k了,那么就是求出数字是第 i 轮,第几个出去的,前缀和预处理即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<原创 2020-11-28 00:22:35 · 628 阅读 · 0 评论 -
第 k 大区间
题目链接:第 k 大区间因为k很大,显然可以想到二分。利用前缀异或和变成两个点的异或。然后就是枚举每一个后缀,求异或大于某个数的个数。直接Trie上查询即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const int N=1e5+10;int n,k,a[N],ch[N*32]原创 2020-11-26 01:43:32 · 441 阅读 · 0 评论 -
区间价值
题目链接:区间价值显然可以二分。然后双指针判断即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const int N=2e5+10;int n,k,a[N],cnt[N];vector<int> v;inline int f(int x){return x*(x-原创 2020-09-17 11:00:04 · 219 阅读 · 0 评论 -
区间覆盖问题
题目链接:区间覆盖问题思路挺简单,不过细节挺多的。我们先对区间求并,然后可以找到合法可以选择的区间,然后存个前缀和,二分第一个合法的区间位置即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const int N=2e5+10;int n,q,m,sum[N],k,cnt;pai原创 2020-09-16 23:15:32 · 235 阅读 · 0 评论 -
HDU - 5699
题目链接:HDU - 5699显然可以二分时间,然后我们就只关注距离大于mid的任务即可。我们可以发现 |l-x| + |r-y| <= mid化简可以达到:r-l-mid <= y-x <= mid+r-ll+r-mid <= x+y <= l+r+midAC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int l原创 2020-08-12 16:00:57 · 192 阅读 · 0 评论 -
HDU - 6769
题目链接:HDU - 6769考虑二分。然后dp[i][j]为当前到节点 i,选了 j 个权值A的边的到 i 节点能达到的最长的最短链长。然后初始化为INF,只要任意组合可以满足加起来小于mid,那么我们就可以更新当前节点的 dp 值。最后只需要看dp[1][k]的点是否被更新即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long原创 2020-07-24 23:02:47 · 363 阅读 · 0 评论 -
Codeforces - Pair of Numbers
题目链接:Codeforces - Pair of Numbers不难发现,如果我们枚举区间的每个值作为区间的gcd,那么左右端点是具有二分性的,然后二分即可。然后ST表维护区间gcdAC代码:#include<bits/stdc++.h>using namespace std;const int N=3e5+10;int n,f[N][20],a[N],k,ans[N],cnt,res;int ask(int l,int r){k=log2(r-l+1); return原创 2020-07-19 22:32:50 · 210 阅读 · 0 评论 -
Codeforces - Packmen
题目链接:Codeforces - Packmen显然可以二分。然后从左往右扫人的合法的位置,然后让第一个合法的人过来,那么有3种情况:人在左边:直接向右走即可。人在右边:先向左然后向右,先向右后向左,取max即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const in原创 2020-07-17 23:01:16 · 228 阅读 · 0 评论 -
Codeforces - Thwarting Demonstrations
题目链接:Codeforces - Thwarting Demonstrations显然可以二分,然后利用前缀和check即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const int N=1e5+10;int n,k,d[N],a[N],l=-1e14,r=1e14,m;v原创 2020-07-17 16:45:45 · 221 阅读 · 0 评论 -
Financial Aid
题目链接:Financial Aid可以用堆维护,也可以二分,都挺简单的。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=1e5+10;int m,n,F,l=1,r=2e9,nd;struct node{int a,b;}t[N];inline int原创 2020-07-15 13:39:06 · 216 阅读 · 0 评论 -
Delegation P
题目链接:Delegation P显然可以二分,然后我们从下到上贪心选择即可。如果当前子树中有奇数条路径,那么肯定用两两最小的满足的去组合,然后往父亲节点返回大的权值。否则如果有偶数条路径,那我们加一个0变成奇数条。要注意如果非根节点,有一次找不到另一个值的时候,这个值可以直接转移到父亲节点。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int原创 2020-07-14 22:21:38 · 191 阅读 · 0 评论 -
中位数
题目链接:中位数显然可二分,然后把小于的看成-1,然后大于等于的看成1.就是找是否存在一条1到n长度大于等于0的路径。直接DAG上最长路即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=1e6+10;int n,m,a[N],x[N],y[N],deg原创 2020-07-03 19:33:40 · 142 阅读 · 0 评论 -
[JXOI2017]加法
题目链接:[JXOI2017]加法显然可以二分,然后我们就可以得到每个点需要被多少个区间覆盖。然后左端点从小到大排序,然后贪心选择即可。但是有区间覆盖的次数计算,我们可以直接差分,从前往后计算前缀和,用fenwick也可以。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const原创 2020-06-28 10:59:21 · 266 阅读 · 0 评论 -
Widespread
题目链接:Widespread显然有一个贪心,每次选择最大的,然后减去A,其他的减去B。那么就变成线段树区间减,维护区间max的位置即可。但是显然可以二分,就不用写线段树了。先假设全用B,然后多出来的再用A。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const int N=1e5+原创 2020-06-27 11:11:26 · 477 阅读 · 0 评论 -
骚区间
题目链接:骚区间显然我们对每个左端点,可以ST表上二分,找到对应的合法右端点区间。然后枚举右端点,可以在ST表上二分,找到合法的左端点区间,我们把左端点区间排序一下,维护当前合法的左端点位置,然后fenwick上面查询即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const原创 2020-06-26 22:09:19 · 278 阅读 · 0 评论 -
HDU - 4560
题目链接:HDU - 4560显然可以二分最大次数。然后因为把歌曲分为喜欢点和不喜欢点,不喜欢点到汇点T限制流量为K即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int inf=0x3f3f3f3f;const int N=410,M=1e6+10;int t原创 2020-06-16 10:22:57 · 165 阅读 · 0 评论 -
Easter Eggs
题目链接:Easter Eggs显然可以二分。然后怎么check呢?显然我们把距离小于mid的点连起来,那么就相当于找一个最大独立集,然后最大独立集的个数要大于等于n。然后因为连边的只是蓝色和红色之间,所以这是一个二分图,之间匈牙利即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std原创 2020-06-03 12:02:24 · 942 阅读 · 0 评论 -
[HNOI2006]公路修建问题
题目链接:[HNOI2006]公路修建问题显然可以二分。二分一个最大值之后,只要能建造1级公路肯定直接建造,然后看能不能建k条。然后能建2级公路就建造,然后看能不能形成一颗树即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=2e4+10;int n,k原创 2020-05-26 11:07:30 · 226 阅读 · 0 评论 -
Auto-complete S
题目链接:Auto-complete S因为前缀是有单调性的,所以我们可以按照字典序排序,然后我们就可以二分到某个需要的前缀。然后看当前前缀的第k个是否前缀也是这个,不是就输出-1,否则输出下标即可。所以我们用个pair<string,int>存一下即可,当然也有一个很显然的做法,就是Trie上面找。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#de原创 2020-05-26 10:48:03 · 280 阅读 · 0 评论 -
运输计划
题目链接:运输计划考虑二分。二分之后我们就可以找到必须要链,然后做树上差分,找到公共的需要割的边。然后找到公共的最大值,和当前最大的链的值比较即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=6e5+10,M=N<<1;int n,m,po原创 2020-05-25 17:47:55 · 270 阅读 · 0 评论 -
Cow Calisthenics G
题目链接:Cow Calisthenics G显然可以二分。然后我们从上往下dfs,然后贪心判定即可。每种情况都讨论一下,不得已断边的时候才断边。不过贪心不太好验证正确性,跟着感觉走就AC了。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=1e5+10;原创 2020-05-15 12:25:15 · 205 阅读 · 0 评论 -
Subarrays OR
题目链接:Subarrays OR我们以每个数字为左端点的区间记录答案。显然每个数字向右有效区间不超过30个,因为每次有效区间肯定会多或上一个1。所以暴力计算每一位二进制的位置,二分向后跳即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=1e5+10;原创 2020-05-09 19:19:11 · 249 阅读 · 0 评论 -
牛牛的揠苗助长
题目链接:牛牛的揠苗助长显然可以二分,然后怎么check呢?肯定中位数。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const int N=1e5+10;int n,a[N];inline int check(int mid){ vector<int> v; int原创 2020-05-08 21:17:29 · 246 阅读 · 0 评论 -
Best Subsequence
题目链接:Best Subsequence首先考虑二分答案。对于当前的mid,如果数字小于[mid/2]那么肯定是要选的,然后对于这些数字中间的数字,最多选一个。枚举一下即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long l...原创 2020-04-27 21:48:50 · 294 阅读 · 0 评论 -
K-th Number
题目链接:K-th Number最开始以为m和n同阶,没想太多直接打了个 堆+主席树。。。然后TLE。其实m很大的时候,我们可以想到二分,然后就是把大于等于mid 的看成1,小于的看成0.找有多少个区间1的个数有k个。尺取做一做即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/s...原创 2020-04-21 12:18:35 · 285 阅读 · 0 评论 -
科大讯飞杯 动物森友会
题目链接:科大讯飞杯 动物森友会显然时间可以二分。然后就找到每个星期的操作次数。然后最大流即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const int inf=0x...原创 2020-04-18 16:55:05 · 309 阅读 · 0 评论 -
HDU - 6070
题目链接:HDU - 6070首先可以想到二分最小值,类似于分数规划。式子变为: r*mid>=(l-1)*mid + sz(l,r)是否有解。对于带有mid的式子最开始建树的时候直接赋值即可,对于sz也就是不同元素的个数求解,直接记录上一个相同元素位置,区间加。然后枚举右端点,就完了。AC代码:#pragma GCC optimize("-Ofast","-funroll-...原创 2020-04-17 12:44:10 · 244 阅读 · 0 评论 -
晾衣服
题目链接:晾衣服显然可以直接二分。然后每次贪心,如果不超过二分的mid就竖放,否则横放。其实有一种常数更小的log做法就是排序后贪心。先假设全部都是竖放的,然后在从竖放是时间大的当中考虑横放即可。第二种方法直接 效率Rank1了。第一种AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits...原创 2020-04-15 17:04:02 · 296 阅读 · 0 评论 -
[USACO17DEC]Haybale Feast G
题目链接:[USACO17DEC]Haybale Feast G很显然s具有二分性,然后check每一个字段的和即可。因为s为正,所以全部加起来肯定是最优的。不知道为什么没人写二分。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int lo...原创 2020-04-09 21:11:27 · 323 阅读 · 0 评论 -
Codeforces - Robin Hood
题目链接:Codeforces - Robin Hood首先我们要求 最小的 max-min。直接二分这个答案是不行的。我们可以二分最小的max和最大的min做差即可。但是我们要注意如果 sum%n!=0,那么答案至少为1。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h...原创 2020-03-25 20:25:25 · 265 阅读 · 0 评论 -
Codeforces - Colonial Mansions
题目链接:Codeforces - Colonial Mansions两个之间能否连通,只在于相互之间的差值。我们用线段树维护差值即可,每个点的值是当前点和前一个点的差的绝对值。然后二分找位置即可,注意细节。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//...原创 2020-03-05 19:58:03 · 187 阅读 · 0 评论 -
Codeforces - Cartons of milk
题目链接:codeforces - Cartons of milk显然,我们如果可以购买,那么肯定买保质期最长的牛奶。其次,买的个数具有二分性,所以我们可以二分个数。然后对于两个东西,已经是有序的,那么我们加入的时候,就不用排序了,直接归并就行了。否则会TLE。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#inc...原创 2020-03-04 21:07:43 · 321 阅读 · 0 评论 -
Codeforces - Increasing by Modulo
题目链接:Codeforces - Increasing by Modulo直接去dp,复杂度是n*m的。进而我们可以发现,答案其实就是合法的,最多改变的数字的改变次数。显然,具有二分性。所以我们二分出每个数字的最大改变次数即可。然后每次贪心地尽量放小的数字。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#incl...原创 2020-03-03 17:46:58 · 211 阅读 · 0 评论 -
Codeforces - Match Points
题目链接:Codeforces - Match Points首先考虑二分答案。怎么check呢?肯定是最小的mid个和最大的mid个匹配。然后就做完了。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing ...原创 2020-02-22 16:57:47 · 223 阅读 · 0 评论 -
2019 ICPC Asia Shanghai - Tree Partition
题目链接:2019 ICPC Asia Shanghai - Tree Partition首先权值最大的块,最小。我们可以想到二分。然后看是否能够满足。我们对于每个点,假设子树都是小于当前二分的值mid,对于当前点,如果把全部子树加上都是合法的,那么肯定直接加上即可。如果全部加上不合法,肯定就需要丢弃一些子树。肯定贪心丢掉最大的子树,直到合法。AC代码:#pragma GCC opt...原创 2020-02-16 17:07:52 · 611 阅读 · 0 评论 -
[USACO14MAR]破坏Sabotage
题目链接:[USACO14MAR]破坏Sabotage首先肯定二分最小值。然后找到是否存在一个前缀min和后缀min之和小于0即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace ...原创 2020-02-14 12:13:36 · 308 阅读 · 0 评论 -
Codeforces - Delivery Club
题目链接:Codeforces - Delivery Club首先二分最长距离。然后按照任务顺序,加入点到set当中。对于当前点,排序无用的点,也就是距离a[i]大于mid 的点。如果某一时刻set为空则无解,否则有解。为什么只要不为空就有解呢?因为只要不为空证明存在一个位置到当前点的距离小于等于mid,我们提前让另一个人到达即可。AC代码:#pragma GCC optimize...原创 2020-02-12 20:12:57 · 390 阅读 · 0 评论 -
Codeforces - Multiplication Table
题目链接:Codeforces - Multiplication Table被题目坑了一下, 应该是第k小,题目说第k大。。。其实转化一下就行第k大 = 第 n*m-k+1小。比较明显的二分答案,然后判断比mid大的个数,因为是乘法表所以很好判断。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<...原创 2020-02-10 14:36:20 · 220 阅读 · 0 评论