二分
文章平均质量分 83
我要看无刺有刺
阿里嘎多扩赛以马斯
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【题解】LuoGu1083:借教室
原题传送门 不能满足的方案满足二分性 二分枚举什么时候无法满足 然后O(n)O(n)O(n)用差分算出每天需要的教师数量进行判断 Code: #include <bits/stdc++.h> #define maxn 1000010 #define LL long long using namespace std; int n, m; LL a[maxn], b[maxn], d[maxn], s[maxn], t[maxn]; inline int read(){ int s = 0, w原创 2020-12-03 20:17:06 · 333 阅读 · 0 评论 -
【题解】AT4520:[AGC032E] Modulo Pairing
原题传送门 首先想到的当然是二分答案+贪心 但是正解二分的并不是答案 结论:最终的正确答案一定存在一个分界点,满足 蓝线表示x+y<Mx+y<Mx+y<M 红线表示x+y>=Mx+y>=Mx+y>=M 给出证明 情况1: 任意两个数加起来都<M<M<M的情况,Ⅰ最优 令从左到右分别为a<b<c<da<b<c<da<b<c<d 计算出三种方案的价值 Ⅰ:max(a+d,b+c)max(a+d,b+c原创 2020-11-01 11:32:11 · 401 阅读 · 0 评论 -
【题解】AT4502:[AGC029C] Lexicographic constraints
原题传送门 首先想到类似进制或是全排列一样的操作 假如k=3k=3k=3 可以 111 1111 1112 1113 1131 12 121 13 2 2111 2112 可以总结出一些规律 若ai>ai−1a_i>a_{i-1}ai>ai−1,就直接在si−1s_{i-1}si−1的末尾补1,补到当前长度为止 若ai=ai−1a_i=a_{i-1}ai=ai−1,sis_isi就是si−1s_{i-1}si−1的下一个排列 若ai<ai−1a_i<a_{i原创 2020-10-30 21:05:22 · 368 阅读 · 0 评论 -
【题解】AT4501:[AGC029B] Powers of two
原题传送门 手玩数据 以5为例 00000101 比5大的最小的能和5匹配的是11(00001011) 再大,就是 00011011 00111011 01111011 11111011 …… 再假如10 00001010 与之匹配可以是 00010110(22) 00110110(54) 01110110 11110110 …… 结论,对于一个数xxx,另一个数y>=xy>=xy>=x x+y=2px+y=2^px+y=2p yyy一定是xxx最后一位1不动,之前全部取反,然后最原创 2020-10-30 20:07:04 · 200 阅读 · 0 评论 -
【题解】CF1175C:Electrification
原题传送门 二分最优值,然后O(n)O(n)O(n)验证 对于每个iii,就是看[i,i+k][i,i+k][i,i+k]这段区间能不能达到这个最优值 就是[ai+k−ai+12]<=mid[\frac{a_{i+k}-a_i+1}{2}]<=mid[2ai+k−ai+1]<=mid,可行的话,答案就是[ai+k+ai+12][\frac{a_{i+k}+a_i+1}{2}][2ai+k+ai+1] Code: #include <bits/stdc++.h> #d原创 2020-10-19 09:16:35 · 380 阅读 · 0 评论 -
【题解】CF993D:Compute Power
原题传送门 01分数规划 ∑a∑b<=mid\frac{\sum a}{\sum b}<=mid∑b∑a<=mid ∑a<=mid∗∑b\sum a<=mid*\sum b∑a<=mid∗∑b wi=ai−mid∗biw_i=a_i-mid*b_iwi=ai−mid∗bi 问是否存在∑wi<=0\sum w_i<=0∑wi<=0 先根据aaa从大到小分组,相同的aaa一组,组内按照bbb升序 这样满足严格小于的那个条件 可以dpi,jdp_{i原创 2020-09-20 11:12:24 · 384 阅读 · 0 评论 -
【题解】LuoGu4951:[USACO01OPEN]Earthquake
原题传送门 01分数规划 f−∑cx∑tx=ans\frac{f-\sum c_x}{\sum t_x}=ans∑txf−∑cx=ans f−∑cx−∑tx∗ans=0f-\sum c_x-\sum t_x*ans=0f−∑cx−∑tx∗ans=0 f>=∑cx+∑tx∗ansf>=\sum c_x+\sum t_x*ansf>=∑cx+∑tx∗ans 二分答案midmidmid,将边权赋为cx+tx∗midc_x+t_x*midcx+tx∗mid 求最小生成树,总边权和原创 2020-09-05 21:07:53 · 374 阅读 · 0 评论 -
【题解】LuoGu6142:[USACO20FEB]Delegation P
原题传送门 跟赛道修建很像的一道题目 不同的是,现在要全选 依然二分答案,然后dfsdfsdfs 对于某点的所有儿子里面传上来的链,二分出能和自己组成一条链的往上传,剩下的是通过两两贪心组合判断可行性 注意两个点,若有偶数条链,加一条长度为0的链;根节点直接判断可行性 Code: #include <bits/stdc++.h> #define maxn 100010 using namespace std; struct Edge{ int to, next; }edge[maxn <原创 2020-09-04 21:15:20 · 387 阅读 · 0 评论 -
【题解】NOIp模拟:比赛
比赛 Description 有两个队伍A和B,每个队伍都有n个人。这两支队伍之间进行n场1对1比赛,每一场都是由A中的一个选手与B中的一个选手对抗。同一个人不会参加多场比赛,每个人的对手都是随机而等概率的。例如A队有A1和A2两个人,B队有B1和B2两个人,那么(A1 vs B1,A2 vs B2)和(A1 vs B2,A2 vs B1)的概率都是均等的50%。 每个选手都有一个非负的实力值。如果实力值为X和Y的选手对抗,那么实力值较强的选手所在的队伍将会获得(X-Y)^2的得分。 求A的得分减B的得分的原创 2020-08-26 13:58:04 · 590 阅读 · 0 评论 -
【题解】NOIp模拟:四轮车
在地图上散落着 n 个车轮,小 J 想用它们造一辆车。要求如下: 一辆车需要四个车轮,且四个车轮构成一个正方形 车轮不能移动你需要计算有多少种造车的方案(两个方案不同当且仅当所用车轮不全相同,坐标相同的两个车轮视为不同车轮)。 30%的数据保证 n ≤ 30 100%的数据保证 1 ≤ n ≤ 1000; |x|, |y| < 20000 O(n2)O(n^2)O(n2)枚举两个点,计算出另外两个点,用二分求出另外两个点的方案数,用乘法原理乘起来,最终要除以2 Code: #include原创 2020-08-25 13:35:57 · 418 阅读 · 0 评论 -
【题解】CF883I:Photo Processing
原题传送门 先排个序 最大值最小,用二分 然后用dp验证 dpidp_idpi表示当前到iii,最后一个分组是否可以以iii结尾 dpi∣=dpj−1(j<i,ai−aj<=mid)dp_i|=dp_{j-1}(j<i,a_i-a_j<=mid)dpi∣=dpj−1(j<i,ai−aj<=mid) 但是这个是O(n2)O(n^2)O(n2)的,可以优化 发现对于一对(i,j)(i>j)(i,j)(i>j)(i,j)(i>j),若[j,i][j,原创 2020-08-20 16:24:19 · 360 阅读 · 0 评论 -
【题解】LuoGu3853:[TJOI2007]路标设置
原题传送门 二分+贪心 对于两个路标l,rl,rl,r,之间最少放r−l−1mid\frac{r-l-1}{mid}midr−l−1个 Code: #include <bits/stdc++.h> #define maxn 100010 using namespace std; int a[maxn], L, n, k; inline int read(){ int s = 0, w = 1; char c = getchar(); for (; !isdigit(c); c = ge原创 2020-08-09 18:38:23 · 306 阅读 · 0 评论 -
【题解】LuoGu4047: [JSOI2010]部落划分
原题传送门 二分答案,然后用类似kruskalkruskalkruskal的方法验证 把n2n^2n2条边从小到大排序,加边 对于每个midmidmid,如果两点之间距离x<midx<midx<mid,那么这两个点必须是同一部落的;如果两点之间距离x>=midx>=midx>=mid,那么这两点可以不同部落 所以就看看哪些x<midx<midx<mid的边必须加,因为要划分成kkk个部落,所以一共要加n−kn-kn−k条边 Code: #include原创 2020-08-08 12:34:47 · 302 阅读 · 0 评论 -
【题解】LuoGu5815:[CQOI2010]扑克牌
原题传送门 二分+贪心 目标是组出midmidmid副牌,所以有两个要求 JOKERJOKERJOKER不能不够 JOKERJOKERJOKER最多用midmidmid张 Code: #include <bits/stdc++.h> #define maxn 110 #define int long long using namespace std; int n, m, a[maxn]; inline int read(){ int s = 0, w = 1; char c = get原创 2020-08-07 12:22:00 · 313 阅读 · 0 评论 -
【题解】LuoGu4343:[SHOI2015]自动刷题机
原题传送门 这里不能直接二分答案可不可行 发现随着nnn变大,切题数是递减的,可以二分切题数于目标的关系 二分两遍分别求出两个答案 Code: #include <bits/stdc++.h> #define maxn 100010 #define LL long long using namespace std; int n, k; LL a[maxn]; inline int read(){ int s = 0, w = 1; char c = getchar(); for (; !原创 2020-08-06 12:49:31 · 335 阅读 · 0 评论 -
【题解】LuoGu5368: [PKUSC2018]真实排名
原题传送门 冷静分析了一下,貌似很可做的样子 数据范围告诉我要用一个O(nlogn)O(nlogn)O(nlogn)的做法 对于每个数aia_iai,可以分类讨论,是否把这个数翻倍 aia_iai不翻倍,[ai+12,ai−1][\frac{a_i+1}{2},a_i-1][2ai+1,ai−1]也不能翻倍,剩下的数假设有xxx个,答案为CxkC_{x}^{k}Cxk aia_iai...原创 2019-12-08 15:57:32 · 428 阅读 · 0 评论 -
【题解】LuoGu1083:借教室
原题传送门 刚开始我想到了差分方法 可以O(n)O(n)O(n)检验是否所有订单均可满足 然后我就想到这道题是否和飞扬的小鸟一样的套路再去用什么方法找到第一个不能满足的点 发现答案满足二分性,那么就直接二分好了,然后每次都用差分数组O(n)checkO(n)\text{check}O(n)check 把所有均可满足的情况一并包括进二分一起做 Code: #include <bits/stdc...原创 2019-11-14 09:17:03 · 339 阅读 · 0 评论 -
【题解】BZOJ4326:NOIP2015 运输计划【二分+LCA+树上差分】
题目描述 公元 2044 年,人类进入了宇宙纪元。L 国有 n 个星球,还有 n?1 条双向航道,每条航道建立在两个星球之间, 这 n?1 条航道连通了 L 国的所有星球。小 P 掌管一家物流公司, 该公司有很多个运输计划,每个运输计划形如 :有一艘物流飞船需要从 ui 号星球沿最快的宇航路径飞行到 vi 号星球去。显然,飞船驶过一条航道是需要时间 的,对于航道 j,任意飞船驶过它所花费的...原创 2018-08-01 19:46:46 · 502 阅读 · 0 评论 -
[题解]LuoGu2698: [USACO12MAR]花盆Flowerpot
原题传送门 这道题在洛谷难度为蓝题(提高+省选-)个人认为难度普及+够了吧 不难想到单调队列的做法,首先二分答案,对于每个花盆宽度,我们进行O(n)的验证 维护两个单调队列,分别维护纵坐标的最小值与最大值,从左往右枚举横轴坐标,每个时刻都能计算出题目里说的时间差D,与输入的进行比较,若满足要求,则返回true Code: /* q1维护最小值,q2维护最大值 */ #include <bi...原创 2019-03-06 19:05:17 · 440 阅读 · 0 评论 -
【题解】LuoGu5021/NOIp2018:赛道修建
原题传送门 蓝题难度吧?怎么上升到紫题了? 考场里,作为一个真·蒟蒻,自然是没想到打满分的,于是疯狂打子任务,于是乎,我把四个子任务都打了。 m=1m=1m=1, 也就是求直径,比赛时我还不知道树的直径这种东西,于是我写了个树形dp,那部分的分数应该拿到了 ai=1a_i=1ai=1, 也就是菊花图,想到一条赛道最多由两条边组成(根据菊花图的特点),考虑使用二分+头尾指针移动贪心解决,这部分现...原创 2019-04-06 16:05:11 · 468 阅读 · 0 评论 -
【题解】LuoGu4403:[BJWC2008]秦腾与教学评估
原题传送门 小思维难度 核心思想:奇偶性 注意到要么无解,要么有且仅有一解(人数为奇) 想到二分 用一个calc(i)calc(i)calc(i)函数计算“前缀和”,就是点1到点i人数之和,可以O(n)O(n)O(n)得到 然后就是针对这个前缀和的分类讨论 calc(maxr)calc(maxr)calc(maxr) modmodmod 2==02==02==0,无解 calc(mid)calc...原创 2019-07-09 21:38:56 · 292 阅读 · 0 评论 -
【题解】慈溪中学-8.15-T1
传送门 二分,枚举答案 如果验证是否能给mid个充电器都充电 那当然是给更安全的充电器充电 然后对于每个充电器是否能充电,总是先尽可能插插线板,然后充电 Code: #include <bits/stdc++.h> #define maxn 400010 #define LL long long using namespace std; int n, m, a[maxn], b[max...原创 2019-08-16 08:05:04 · 380 阅读 · 0 评论 -
【题解】CF875E:Delivery Club
原题传送门 二分答案+贪心 对于每个midmidmid,需要倒着做,贪心 我们记当前其中一个快递员在xi+1x_{i+1}xi+1,另一个快递员在[l,r][l,r][l,r],当前那么分类讨论 ...原创 2019-08-12 19:07:22 · 659 阅读 · 0 评论 -
【题解】CF760B:Frodo and pillows
原题传送门 还是挺好做的吧 首先可以想到二分答案 想一想枕头个数如何分配最好,自然是呈现金字塔形式分配 即k号床最多,旁边两个床少一个,再旁边少两个…… check就是直接数学计算一下,用等差数列求和,注意一下细节处理 Code: #include <bits/stdc++.h> #define LL long long using namespace std; LL n, m, k;...原创 2019-08-23 11:52:21 · 377 阅读 · 0 评论 -
【题解】CF460C:Present
原题传送门 最小值最大当然是二分答案 然后O(n)O(n)O(n)扫,如果当前数未达到midmidmid,就加到midmidmid,并且这个数是作为区间左端点的 如何实现区间加法,差分数组就行了 Code: #include <bits/stdc++.h> #define maxn 1000010 #define LL long long using namespace std; LL...原创 2019-09-08 21:27:52 · 479 阅读 · 0 评论 -
【题解】CF567D:One-Dimensional Battle Ships
原题传送门 直接模拟的话比较麻烦,可能需要用上一些数据结构之类的 但是这道题目不需要数据结构,直接二分即可 先把坐标排序,二分答案,checkcheckcheck里面计算可以放多少船 ididid小于midmidmid的断点是合理的 对于一段区间[l,r][l,r][l,r],可以放[r−l+1a+1][\frac{r-l+1}{a+1}][a+1r−l+1]条船 Code: #include ...原创 2019-09-22 10:45:13 · 448 阅读 · 0 评论 -
【题解】LuoGu4105:[HEOI2014]南园满地堆轻絮
原题传送门 二分+贪心不解释 Code: #include <bits/stdc++.h> #define maxn 5000010 #define LL long long using namespace std; LL a[maxn], n, sa, sb, sc, sd, qy, b[maxn], ans; LL F(LL x){ return sa * x % qy * x ...原创 2019-10-07 21:14:30 · 368 阅读 · 0 评论
分享