BZOJ 4525 二分

思路:

满足二分性质...

二分一下      就完了

//By SiriusRen
#include <cstdio>
#include <algorithm>
using namespace std;
int n,k,a[500050],ans;
bool check(int x){
    int rec=0;
    for(int i=1;i<=n;){
        int temp=a[i]+2*x;rec++;
        while(a[i]<=temp&&i<=n)i++;
    }return rec<=k;
}
int main(){
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    sort(a+1,a+1+n);
    int l=0,r=0x3f3f3f3f;
    while(l<=r){
        int mid=(l+r)>>1;
        if(check(mid))ans=mid,r=mid-1;
        else l=mid+1;
    }printf("%d\n",ans);
}
时间: 2025-01-04 10:10:52

BZOJ 4525 二分的相关文章

BZOJ 4753 二分+树形DP

思路: 先二分答案 f[x][j]表示在x的子树里选j个点 f[x][j+k]=max(f[x][j+k],f[x][j]+f[v[i]][k]); 初始化 x!=0 -> f[x][1]=p[x]-s[x]*mid x=0 -> f[x][0]=0 类似4033的那样转移 看似O(n^3)实际O(n^2) 加一个二分 复杂度O(能过) //By SiriusRen #include <cstdio> #include <cstring> #include <al

BZOJ 2406 二分+有上下界的网络流判定

思路: 求出每行的和  sum_row 每列的和   sum_line 二分最后的答案mid S->i  流量[sum_row[i]-mid,sum_row[i]+mid] i->n+j 流量[L,R] n+j->T 流量 [sum_line[i]-mid,sum_line[i]+mid] 套用有上下界的网络流 判一下就好了.. 这是道有上下界网络流的裸题 //By SiriusRen #include <queue> #include <cstdio> #inc

BZOJ 2084 二分+hash OR Manacher

思路: 二分+哈希 //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; const int N=500050; const ll mod=1000000007; int n; ll hs1[N],hs2[N],base[N],Ans; char s1[N],s2[N]; int main(){

bzoj 2406 二分+有源有汇上下界网络流可行流判定

弱爆了,典型的行列建模方式,居然想不到,题做少了,总结少了...... 二分答案mid s----------------------->i行----------------------->j列----------------------------->t [si-mid,si+mid]                  [L,R]                 [s[j]-mid,s[j]+mid] 即对每一行建一个点,每一列建一个点,用边来表示某一行某一列上的东西. 这种建模方式一

BZOJ 1196 二分答案+并查集

http://www.lydsy.com/JudgeOnline/problem.php?id=1196 题目大意:n个城市,m-1条路,每条路有一级公路和二级公路之分,你要造n-1条路,一级公路至少要造k条,求出所造路的最大所需的val的最小值. 思路:首先我们一定要明确这个不是一题求所有花费的最小值的问题.然后我们只要二分答案就可以了.最后注意一下条件的拜访即可. //看看会不会爆int!数组会不会少了一维! //取物问题一定要小心先手胜利的条件 #include <bits/stdc++.

bzoj 1816 二分

思路:二分答案,然后我们贪心地先不填最小的一堆,看在最小的一堆消耗完之前能不能填满其他堆. #include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk make_pair #define PII pair<int, int> #define y1 skldjfskldjg #define y2 skldfjsklejg using namespace std;

bzoj 1189 二分+最大流

题目传送门 思路: 先预处理出每个人到每扇门的时间,用门作为起点进行bfs处理. 然后二分时间,假设时间为x,将每扇门拆成1到x,x个时间点,表示这扇门有几个时间点是可以出去的.对于一扇门,每个时间点都向后一个时间点建边,表示人在当前时间点到达,可以在下一时间点出去. 先将s连上所有的空地,流量为1,建立每个空地每个门的对应的时间点流量为1的边,表示这个空地的人会再某一时间点到达这扇门.然后每个门流向t,流量为inf.只要最大流为空地的数量,则代表该时间是可以的,继续向下二分. #include

[除一波线段树和平衡树的草]

bzoj 1691 口感从大到小排序 从大到小插入价格的set里面 在set里面lower_bound一下 bzoj 1577 右端点排序 相同左端点小的在前 然后能下就下 先让先上的上 一定最优 bzoj 4094 线段树维护 0 1 2 3 表示左右端点状态 bzoj 1594 二分离线 按权排序 从大到小插入 有两种情况不合法 1.没有交集两个最小值相同的区间 2.交集在之前权值比较大的并集中 bzoj 3387 从上到下做 挡住的删掉 添加栅栏两边的节点的最小值 其它值保留 维护的时候维

9.29 奶牛练习题

/*bzoj 1613*/ /*暴力5884ms*/ #include<cstdio> #define maxn 10010 using namespace std; int n,m,a[maxn],f[maxn][510]; int max(int x,int y){ return x>y?x:y; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d&