【二分/尺取/差分】
张松超
这个作者很懒,什么都没留下…
展开
-
codeforces 485D. Maximum Value(二分+思维)
题意:给你N个元素,求出这N个元素中a[j]%a[i]的最大值, 且 a[j] ≥ a[i](1 ≤ i, j ≤ N)。思路:枚举a[i],二分查找a[j]。我们可以发现对于a[i]这个值,a[j]%a[i]的值是如图一个以a[i]为周期的变化过程,所以我们找到一个距k*a[i]最近的那个值便是对于a[i]这个值a[j]%a[i]的最大值。我们先排序然后去重(因为重复的数字对答案没有贡献但是原创 2017-12-11 20:12:34 · 414 阅读 · 0 评论 -
CodeForces ~ 999D ~ Equalize the Remainders (思维 + set二分)
题意n个数字,对m取余有m种情况,使得每种情况的个数都为n/m个(保证n%m=0),最少需要操作多少次? 操作:把某个数字+1。输出最少操作次数,和操作后的序列(可以输出任意一种)。思路对于余数x来说,如果余数为x的数没凑够n/m个,那么就让他不变,如果已经凑够了,我们就让他变为距离他最近的没凑够的余数(且通过+1得到的)。 所以,C[i]数组维护余数为iii的数的个数,定...原创 2018-06-24 17:21:11 · 1058 阅读 · 0 评论 -
CodeForces ~ 991C ~ Candies(二分)
题意有N个糖果,Vasya每天早起吃k个,Petya每天晚上吃%10。Vasya至少要吃一半,最小的k为多少?思路二分答案,注意开long long,奇数的情况,n=1的时候。#include <bits/stdc++.h>using namespace std;const int MAXN = 105;typedef long long ll;ll n, ...原创 2018-06-24 14:30:42 · 766 阅读 · 0 评论 -
UVA ~ 11572 ~ Unique Snowflakes(滑动窗口)
题意:输入一个长度为N的序列A,找到一个尽量长的连续序列,使得该序列中没有相同的元素。思路:滑动窗口模板题。假设序列元素从0开始编号,所求连续子序列的左端点为L,右端点R。首先考虑L=0的情况。可以从R=0开始不断增加R,相当于把所求序列的右端点往右延伸。当无法延伸(即A[R+1]在子序列A[L~R]中出现过)时,只需要增大L,然后继续延伸R。既然当前的A[L~R]是可行解,L增大之后必然还是原创 2017-12-09 21:30:30 · 311 阅读 · 0 评论 -
哈尔滨理工大学第七届程序设计竞赛初赛(高年级组)F.苦逼单身狗(滑动窗口 or DP or 二分)
链接:苦逼的单身狗思路:滑动窗口 or DP or 二分。滑动窗口:#include using namespace std;const int MAXN = 100005;int num[4];//L,O,V,E的个数const string LOVE = "LOVE";char str[MAXN];int main(){ int T; scan原创 2018-01-26 14:44:52 · 563 阅读 · 0 评论 -
HDU ~ 6287 ~ 口算训练 (思维 + 分解质因数 + 二分)
题意:小Q非常喜欢数学,但是他的口算能力非常弱。因此他找到了小T,给了小T一个长度为nn的正整数序列a1,a2,...,ana1,a2,...,an,要求小T抛出mm个问题以训练他的口算能力。 每个问题给出三个正整数l,r,dl,r,d,小Q需要通过口算快速判断al×al+1×...×ar−1×aral×al+1×...×ar−1×ar是不是dd的倍数。 小Q迅速地回答了出来,但是小T并不知道正确...原创 2018-05-29 15:36:51 · 1107 阅读 · 0 评论 -
HDU ~ 1551 ~ Cable master (二分)
题意:有N条绳子,从他们中切割出来K条长度相同的绳子的话,这K条绳子每条最长能有多长?输入N,K然后输入N条绳子长度。答案保留两位小数。思路:直接二分答案,长度为m时,如果切出来的段数大于等于k,那么就增大m,否则就减小。最小为0,最大为所有绳子长度和。#include<bits/stdc++.h>using namespace std;const int MAXN = 10005...原创 2018-05-17 10:57:53 · 246 阅读 · 0 评论 -
POJ ~ 3104 ~ Drying (二分)
题意:先输入N表示现在要烘干N件衣服,然后输入这N件衣服的含水量。每件衣服的含水量每分钟会减少1,当含水量为0时表示这个衣服干了。现在还有一个烘干机,烘干机上可以放一件衣服,烘干机每分钟可以使该衣服的含水量减少k。问最少需要多长时间可以把所有衣服都弄干?思路:二分最短时间t,如果a[i] <= t 说明不需要对他进行烘干操作,如过a[i] > t那么我们需要用烘干机对他烘干(t-a[i...原创 2018-04-07 13:43:40 · 227 阅读 · 0 评论 -
POJ ~ 2110 ~ Mountain Walking (二分+枚举+BFS)
题意:输入N,给你一个N*N的海拔地图,让你找一条从左上角到右下角的路。要求该条路上的最高海拔 - 最低海拔值最小,输出这个值。思路:暴力DFS搜索所有路,路上维护最高和最低海拔,求一个最小值就是答案,但是时间复杂度太高。我们可以考虑二分求一个这个差值,然后判断看能否找到一条左上角到右下角的路,但是这样只能用DFS,只有这个差的话DFS还是会超时。我们有了这个差值,我们在枚举最小海拔,然后在这个区...原创 2018-04-09 16:05:49 · 392 阅读 · 0 评论 -
Codeforces ~ 1005C ~ Summarize to the Power of Two (枚举 + map二分)
题意n个数字,问最少删除多少个数字可以使得每个数字a[i]都能找到一个数字a[j](i != j)a[i]+a[j]为2次方?题解因为1e9以内2的次方共有30多个,我们可以枚举每一个数字a[i],然后再枚举2的次幂j,然后查找数组中有没有 j-a[i] 这个值且不是a[i]本身,如果没有这个数字就要删去。#include <bits/stdc++.h>using namespace...原创 2018-07-10 20:36:00 · 422 阅读 · 1 评论 -
Codeforces ~ 1006C ~ Three Parts of the Array(前缀和 + 二分)
题意将一个长度为n的数组划分为a,b,c三段(每一段都可以为空),使得a段和c段的和相等,问a段的和的最大值是多少?思路求前缀和,后缀和。然后从大到小枚举后缀,在前缀中查找相等,如果能找到且a,c两段不重叠,那么就是答案。注意开long long#include <bits/stdc++.h>using namespace std;const int MAXN ...原创 2018-07-17 10:50:26 · 511 阅读 · 0 评论 -
CodeForces ~ 1000C ~ Covered Points Count (差分 + 离散化)
题意n个现在数轴上,每个段的每个端点都有整数坐标。有些线段可能退化为点。段可以相互交叉,相互嵌套或甚至重合。你的任务是:计算整数坐标的点,使得覆盖这些点的线段数等于k(1≤k≤n)。输出被k(1≤k≤n)个线段覆盖的点的个数。思路将线段拆成点,左端点权值为1,右端点权值为-1,离散化端点从左往右扫即可。 神奇的差分。#include&amp;amp;amp;amp;lt;bits/stdc++.h&amp;amp;amp;amp;gt;...原创 2018-06-29 11:44:54 · 601 阅读 · 2 评论 -
HDU ~ 6273 ~ Master of GCD (差分数组 + 快速幂)
题意T组测试数据,每组给出一个N和M,N表示有一个长度为N初始值全为1的序列,现在有M次操作,每次把[L,R]区间乘上x(x只可能是2或者3),问最终整个序列的最大公约数是多少?题目PDF地址思路答案就是:22出现最小次数∗33出现的最小次数2^{2出现最小次数}* 3^{3出现的最小次数}22出现最小次数∗33出现的最小次数。解释一下,第一个数被乘了2次2,4次3,第二个数被乘了3次...原创 2018-12-25 20:44:17 · 520 阅读 · 0 评论 -
POJ ~ 3263 ~ Tallest Cow(差分数组)
题意有N头牛,最高的是第i头,身高是H,现在有R组相对关系。每组相对关系有两个数A和B,表示A和B能相互看见,也就是他们中间的牛都比他俩低。输出所有牛的最大的可能身高。思路我们只要找到每个牛最大可能是第几高的就OK。A和B可以相互看见,其实就是[A+1,B-1]区间的牛都比他俩低,也就是我们把这个区间的值都 -1即可。很明显是在修改完之后在查询,直接用差分数组就OK。==坑点:==相...原创 2018-12-25 20:14:45 · 394 阅读 · 0 评论 -
GYM ~ 101775J ~ Straight Master(思维,差分数组)
题意T组测试数据,每次给你一个长度为N的序列,每次可以选择一个长度3,4,5的区间将这个区间内的数都减一,问能否经过若干次操作后使得数组全变为0?思路首先将数组进行差分获得差分数组diff(diff[i]=a[i]-a[i-1])。diff[i]为+++就相当于以 i 为起点的区间有diff[i]个。diff[i]为−-−就相当于以 i 为终点的区间有diff[i]个。对于区间长度如何...原创 2018-12-25 19:41:21 · 345 阅读 · 0 评论 -
洛谷 ~ P3948 ~ 数据结构 (差分数组)
思路直接差分数组搞一搞就OK了。因为前面的查询和修改掺杂在一起的询问很少,所以对于那些询问我们暴力去查询就OK。在final询问之前求一个符合要求的前缀和就可以O(1)输出了。#include <bits/stdc++.h>using namespace std;const int MAXN = 8e4 + 5;typedef long long LL;int n, opt...原创 2018-12-24 14:52:29 · 394 阅读 · 0 评论 -
洛谷 ~ P1083 ~ 借教室 (差分数组 + 二分)
思路很容易想到暴力的写法,对于一个订单来说,直接从第一天到最后一天都减去d[i]即可,每个订单复杂度为O(n),总的复杂度为O(n*m)明显超时。可以发现如果前x个订单不符合要求,那么往后一定不符合,这个性质使得我们可以使用二分来求答案。我们每次二分一个答案,对于当前答案x,我们需要判断前x个订单是否可以符合要求。如果每一个订单都去暴力去减的话,那么依旧会超时。对于区间减法的操作很容易想...原创 2018-12-21 21:35:03 · 378 阅读 · 0 评论 -
HDU ~ 1556 ~ Color the ball (差分数组)
思路差分数组模板题。学习链接#include <bits/stdc++.h>using namespace std;const int MAXN = 1e5 + 5;int n, a[MAXN];int main(){ while (~scanf("%d", &n) && n) { memset(a, 0, si...原创 2018-12-21 20:21:52 · 258 阅读 · 0 评论 -
Codeforces ~ 1063C ~ Dwarves, Hats and Extrasensory Abilities (交互题,二分)
题意交互题。N次,让你每次输出一个点的坐标,然后他告诉你当前点的颜色(黑或白)。使得可以找到一条直线把黑点和白点分隔开。最终输出这条直线过的两个点。输入输出均为正数,分为为0~1e9 思路我们把所有点摆在y=2的这条线上。输出这条直线的时候比较方便。每次输出中间点,然后其实就是个二分了?黑就是小了,白就是大了。#include <bits/stdc++....原创 2018-10-15 18:15:34 · 451 阅读 · 0 评论 -
二分
二分思想:我们对于一个已经排好序的数组,查找某个值的位置(一般为从小到大排序,如为从大到小排序代码会有变动,以下代码均为从小到大排序的代码) 首先最简单的思想肯定是一个for循环扫一遍数组,找到就跳出。因为这样效率太低了,所以就有了二分查找。假定我们查询的范围在a数组(假设a数组中的数值不重复),我们定义一个左端点为L,右端点为R,M为L,R中点,那么原创 2017-11-01 18:19:07 · 1440 阅读 · 0 评论 -
UVA ~ 10341 ~ Solve It(二分+精度)
题意:给你一个公式,,除了x所有的未知数都给你,问有没有一个x且0思路:p, q, r, s, t and u (where 0 ≤ p, r ≤ 20 and −20 ≤ q, s, t ≤ 0)。根据p,r大于等于0,q, s, t 小于等于0且x属于[0,1]可以判断出前面这个式子是个单调递减的函数,所以我们可以可以通过二分求得一个满足要求的x,那么什么时候没答案呢,因为函数时单调的,所原创 2017-11-29 19:39:27 · 260 阅读 · 0 评论 -
codeForces 535C.Tavas and Karafs(二分+思维)
题意:给你一个首项为A,公差为B的等差数列,再给你一个N代表有N次询问,每次询问会有三个值L,T,M代表在经过T次操作之后以L为左端点的等于0的串最长能有多长。操作为每次使任意M个不为0的数字的值都减一。思路:首先我们应该明确一点,对于这个为零的区间[L,R]的区间和一定小于等于T*M。对于每次询问我们可以通过枚举右端点来找到答案,因为是无法避免的,如果再去枚举右端点R会超时,我们可以原创 2017-11-17 17:17:31 · 414 阅读 · 0 评论 -
codeForces 672D.Robin Hood(思维+二分)
题意:给你一个N,K。表示又N个人,每个人有一定的钱数,每天最富有的人要给最穷的人给一块钱,问k天后最富有的人(最大值)跟最穷的人(最小值)的差值为多少?思路:因为时间越长(天数经过的越多),最大值就会越小,同理最小值就会越大,所以分别二分最富有的人的钱数(最大值),最穷的人的钱数(最小值),两个相减为答案,注意要用long long。#includeusing namespace st原创 2017-11-21 09:18:15 · 380 阅读 · 0 评论 -
UVA ~ 714 ~ Copying Books(二分+最大值最小化)
题意:给你K本书分给M个人抄,这M个人抄书的速度相同,每个人抄的书的编号必须连续,问怎么划分可以最快的抄完这M本书?思路:典型的最大值最小化的问题,原创 2017-11-28 18:02:14 · 408 阅读 · 0 评论 -
HDU ~ 2199 ~ Can you solve this equation?(二分+精度)
题意:给你一个Y,问有没有一个x且0思路:很容易看出函数在[0,100]是单调递增的,所以Y F(100)这两种情况无解,有解的时候二分找X就可以#include using namespace std; const double eps = 1e-8;double Y;double F(double x)//返回等号左边的值 { return 8.0*pow(x,4)原创 2017-11-30 08:18:10 · 247 阅读 · 0 评论 -
UVA ~ 12124 ~ Assemble(map+二分)
题意:先给你一个数字T表示有T组数据,然后给你N,B,下面有N个配件,你有B元钱,下面N行表示N个物品,每个物品有四个属性:类型,名字,价格,质量,你要配出来一台尽可能好的computer,一台computer的好坏是由它质量最坏的配件决定的,要求每种类型的配件都至少有一个。思路:典型的最小值最大化的题目,所以我们直接二分这个答案就好了。难就难在输入数据的处理,这里我采取的方法是使用map把每原创 2017-11-30 14:24:22 · 374 阅读 · 0 评论 -
codeforces 895B. XK Segments(二分)
题意:给你N个数字,问有多少对L,R(L 思路:先排序,对于a[i],[1,a[i])中含有temp = (a[i] - 1) / X个被整除X的数,那么满足要求的右端点的区间为[X * (temp + k),X * (temp + k + 1))。然后枚举左端点二分查找满足要求的右端点区间。然后统计答案就可以了。有两个个细节需要注意 ①对数可能会很多,要用long原创 2017-12-05 19:49:55 · 286 阅读 · 0 评论 -
HDU ~ 4024 ~ Dwarven Sniper’s hunting(二分or数学)
题意:Dw要在充分展现自己枪法的前提下用最少的时间杀死Ly,Dw的枪的射程为L。Ly起始坐标为(X1,Y1),且Ly一直以(Lx,Ly)的速度矢量在前进。Dw的起始坐标为(X2,Y2),Dw的速度为vD,子弹的速度为vB。问子弹飞的距离最远为多少,杀死Ly最少要多少秒?思路:第一个问题很傻逼感觉...因为都说了要充分展现枪法所以子弹飞的最远距离肯定为L。所以子弹飞的时间也确定了为。题目中(Lx原创 2017-12-05 08:55:00 · 473 阅读 · 1 评论 -
HDU ~ 4430 ~ Yukari's Birthday(二分or数学)
题意:将蛋糕化作R个同心圆插N根蜡烛,同心圆从内到外编号为1~i,第i个圆上需要插K^i根蜡烛,让你找到一组满足组条件且R * K最小的R,K。如果 R1 * K1 = R2 * K2,那么取R较小的那个。同心圆的圆心可以放一根蜡烛或者不放。思路一(好想但是容易BUG):首先一定存在答案为R = 1,K = n - 1。我们可以发现R不可能太大,于是简单计算一下R不超40。所以我们可以枚原创 2017-12-07 19:45:15 · 236 阅读 · 0 评论 -
codeForces 448D.Multiplication Table (二分+数学)
题意:给你三个数字N,M,K,给你个N*M的矩阵,对于[i][j]位置的值为i*j,问第K小的数字为多少?思路:因为第K小得数字一定小于K,我们可以枚举答案这个数字ans从1-K,然后对于每一个ans算出来小于等于的ans数字有多少个(这里不必用N方的,因为每一行是倍增的,所以对于第i行,ans/i就等于这一行小于ans的个数,这个个数不能比这一行数字的总数还多,也就是列数M,这两个值取较小的原创 2017-11-15 21:59:24 · 489 阅读 · 0 评论 -
codeForces 660C.Hard Process(二分+前缀和)
题意:先给你一个n,k,n表示下面会有n个数字,这些数字只有0和1,k表示你最多可以将k个0变为1。问变完后连续的最长的全是1的串的长度是多少,并且输出最后得串;思路:我们可以做一个有几个0的前缀和sum,然后枚举左端点二分查找含有k个0的序列的右端点,找到一个最长的序列就是答案。#includeusing namespace std;const int MAXN = 3e5 + 5;原创 2017-11-17 19:34:11 · 352 阅读 · 0 评论 -
UVA ~ 10474 ~ Where is the Marble? (二分)
题意:现在有N个大理石,每个大历史上写了一个非负整数。首先把各数从小到大排序,然后回答Q个问题。每个问题问是否有一个大理石写着某个整数x,如果是,还要回答哪个大理石上写着x。排序后所有的大理石从上到下编号为1~N。思路:排序+二分。#includeusing namespace std;const int maxn=10005;int main(){ int n,q,a[maxn原创 2017-12-29 15:39:14 · 416 阅读 · 0 评论 -
UVA ~ 1152 ~ 4 Values whose Sum is 0 (二分or尺取)
题意:给你四个集合,让你从每个集合中挑选一个数字使他们的和为0,问共有多少种方法。思路:首先四重for循环4000的四次方肯定超时,我们将这四个集合进行两两加和变为两个集合,n^2复杂度,这时我们再枚举一个加和集合的值,然后将另一个加和后的集合排序二分查找答案就行,总复杂度为n^2*log n;注意输出!!!#includeusing namespace std;int n,a原创 2017-10-19 15:35:15 · 390 阅读 · 0 评论 -
HDU ~ 1007 ~ Quoit Design(分治法)(最近点对)
#include<bits/stdc++.h>using namespace std;const double INF = 0x3f3f3f3f;struct Point{ double x,y;}point[100005];int p[100005];bool cmpx(struct Point a,struct Point b){ return a.x < b...原创 2017-10-26 10:28:49 · 439 阅读 · 0 评论 -
codeForces 192A.Funky Numbers(二分)
题意:给你一个数字N,问你是否存在两个数字A,B使得N=A(A+1)2+B(B+1)2N=\frac{A(A+1)}{2}+\frac{B(B+1)}{2} 思路:上面这个式子等价于2N=A(A+1)+B(B+1)2N=A(A+1)+B(B+1),最简单想到的方法就是两重for循环枚举A,B的值从1−n√1-\sqrt{n},这样复杂度为n2n^2,看一下数据范围为1≤n≤1091\leq n\l原创 2017-10-31 15:34:58 · 631 阅读 · 0 评论 -
ACdream ~ 1066 ~ Bet(数学 or 二分+精度)
思路:因为我们要使最坏的情况获得钱最多,肯定要让不管哪一个赢都能得到一样的钱average。在总钱数X一定的情况下,如果有某个赢之后获得的钱大于average,那么肯定有某个赢之后的钱少于average,如果是其他都输了而这个赢钱少的赢了那么得到的钱就比average少。题目中问的就是最坏情况下的最大收益(最大化平均值),所以我们应该让不管哪个赢获得钱都一样的钱v。那么怎么求average呢?有两原创 2017-11-10 17:29:19 · 476 阅读 · 0 评论 -
codeForces 165B.Burning Midnight Oil(二分)
题意:给你两个数字N,K。N表示有个人要写N行东西,K是跟他的写东西效率有关的额一个系数。这个人写东西写一会就累了就必须喝杯茶再写,他的效率会越来越低,V表示他第一天能写V行,然后依次能写等等,当这个值为零时他就睡着了。问你V最小为多少时,他才能写完这N行东西?思路:二分V,原创 2017-11-12 21:52:57 · 415 阅读 · 0 评论 -
51Nod ~ 1267 ~ 4个数和为0(二分or尺取)
思路:N的范围为1000,所以四重for循环枚举显然不行。所以我们可以先将两个不同数字相加的结果算出来,然后在枚举一个数字,在这个集合中寻找它的负数,可是我们这样复杂度依旧为n^2*n^2=n^4,我们就想到了二分查找,先对数组排序,枚举一个数二分查找他的负数,这样差不多就能过了。可是你在仔细想想这四个数字不能重叠,可能会出现A+B+B+C=0的情况,所以这样写是有BUG的,所以我们要对每两个数字原创 2017-11-13 17:50:10 · 629 阅读 · 3 评论 -
codeForces 165C.Another Problem on Strings (二分+前缀和)
题意:给你一个整数K和一个只含01的字符串s,问你在这个字符串s中有多少个含有k个‘1’的子串。思路:k和字符串长度都为10^6,所以暴力枚举所有子串不行,我们可先求一个前缀和统计到当前位置有多少个1,这样我们每次只需要用O(1)的负责度就可以知道任意两个位置之间(也就是某个子串中)有多少个‘1’了,然后我们枚举子串起点i,然后对于每一个起点寻找sum[i] + k - (s[i] - '0'原创 2017-11-14 16:08:48 · 538 阅读 · 0 评论 -
Codeforces Round #532 (Div. 2) (A,B,C,D,E,F)
A. Roman and Browsern个数只有(1/-1),你可以选择一个位置b,然后把所有c位置的数删除,c=b+i*k ( i 可以为任意整数),求的最大值思路直接暴力枚举b然后搞一遍就OK#include <bits/stdc++.h>using namespace std;const int MAXN = 1e5 + 5;int n, k, a[M...原创 2019-03-27 17:07:26 · 539 阅读 · 0 评论