首页 > 其他分享 >Gym - 100851L [二分+线性推导]

Gym - 100851L [二分+线性推导]

时间:2023-05-31 10:04:48浏览次数:43  
标签:二分 pre return int Gym mx 100851L cal ll


题目链接:https://vjudge.net/problem/Gym-100851L

 

解题思路:

根据题目知道,墙的两边是不能放石头的,所以最终的结果肯定会收到两边墙的限制,从而使得答案不会超过1e9+1e5。

此外我们再去二分最大高度,一个明显的结论就是以i为最高点建墙的话最少花费肯定是建一个金字塔形的墙面。但由于原始的墙面,有可能花费的更少,也就是当某一竖墙在金字塔的位置的高度小于等于原始该竖墙的高度时,相当于金字塔被隔断了,不用再考虑往下面建上来了,所以我们就要去找到以i为金字塔顶端,它的左右隔断位置,显然这是一个线性单调的结果,所以只要从后往前和从前往后扫一遍就可以找到了。

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int mx = 1e5+10;
int n,K,L[mx],R[mx];
ll m,a[mx],pre[mx];
ll cal(ll x,ll d){
	return x*d + d*(d-1)/2;
}	
bool check(ll x){
	int r = n,l = 1;
	for(int i=r-1;i>=0&&r>=1;i--){
		while(i<r&&r>=x+i-a[i])
		L[r--] = i;
	}
	for(int i=l+1;i<=n+1&&l<=n;i++){
		while(i>l&&l<=a[i]+i-x)
		R[l++] = i;
	}
	for(int i=1;i<=n;i++){
		if(a[i]>=x) return 1;
		int l = i - L[i],r = R[i] - i;
		if(L[i]==0||R[i]==n+1) continue;
		ll sum = pre[i+r-1] - pre[i-l];
		ll ret = cal(x-l+1,l) - x + cal(x-r+1,r);
		if(ret<=sum+m) return 1;
	}
	return 0;
}
int main(){
	freopen("landscape.in","r",stdin);
	freopen("landscape.out","w",stdout);
	scanf("%d%lld",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%lld",a+i);
		pre[i] = pre[i-1] + a[i];
	}
	a[0] = a[n+1] = 2e9;
	ll l = 1,r = 2e9;
	while(l<r){
		ll mid = (l+r+1)>>1;
		if(check(mid)) l = mid;
		else r = mid - 1;
	}
	printf("%lld\n",l);
	return 0;
}

 

标签:二分,pre,return,int,Gym,mx,100851L,cal,ll
From: https://blog.51cto.com/u_12468613/6384508

相关文章

  • Gym - 100519I [NONE]
    题目链接:https://vjudge.net/problem/Gym-100519I 解题思路:先挂在这里#include<bits/stdc++.h>#defineinf0x3f3f3f3fusingnamespacestd;typedeflonglongll;constintmx=3e5+10;boolvis[mx];inttop,pri[mx];voidinit(){ for(inti=2;i<mx;i++){ if(!vis[i......
  • poj 2452(RMQ+二分)
    解题思路:这题实际上就是求某区间上的最值问题,可以先枚举区间的起始位置,然后二分去搜索比起始位置大的数且位置最远(这里可以用RMQ算法区间内的最小值),找到之后再利用RMQ算法找这段区间内的最大的,如果这段区间的长度比当前的最优值大,那么更新。详细的见代码。#include<iostream>#incl......
  • POJ 1505(二分+贪心)
    题意:给一些书,这些书有不同的页数,让把这些书分成k份,必须是连续的,问这些份中页数和的最大值最小是多少。解题思路:知道了页数和的范围,而且书都是连续的,要找到页数和最大值的最小值可以直接二分答案。。AC:#include<iostream>#include<cstdlib>#include<cstring>usingnamespacestd......
  • 2018ACM浙江省赛 ZOJ 4029 Now Loading!!!(二分)
    NowLoading!!!TimeLimit: 1Second     MemoryLimit: 131072KBDreamGridhas  integers .DreamGridalsohas foragivennumber ,where , .InputTherearemultipletestcases.Thefirstlineofinputisaninteger Thefirstlinecon......
  • 算法学习-二分查找
    题目:C.PlaceforaSelfieCodeforcesRound862(Div.2)题目链接:Problem-C-Codeforces题目描述: 有若干抛物线(抛物线方程为a*x2+b*x+c,每条抛物线的a,b,c值给出)和经过原点,斜率不同的直线(斜率值k给出)。对于每条抛物线找出任意一条直线,它与该抛物线不相交。题目......
  • 【LeetCode】704.二分查找
    704.二分查找解析:思路一:暴力解法,直接遍历,从头开始查找,如果找到直接返回下标,找不到返回-1。classSolution{public:intsearch(vector<int>&nums,inttarget){for(inti=0;i<nums.size();i++){if(nums[i]==target)......
  • Gym102978C Count Min Ratio 题解
    赛时无人场切。震撼,震撼。学到许多。全程贺zak。首先我们套路推下式子。枚举左边的红蓝球个数,答案即为\[\begin{aligned}&\sum_{b=0}^B\sum_{r=0}^R\binom{b+r}b\binom{B-b+R-r}{B-b}\min(\fracrb,\frac{R-r}{B-b})\\=&\sum_{x=1}^{\fracRB}\sum_{b=0}^B\sum_{r=0}^R\binom......
  • 二分图和 2-SAT 问题入门
    二分图定义通俗的说,就是一个图可以分成两个部分,两个部分内部没有连接的边,所有的边都在两个部分之间。比如这就是一张二分图。可以发现,A,B集合中各自是没有边连接的,边都连在了AB集合之间。并且4是独立的,所以其实我们把它归到集合A中或者集合B中都可以。判断二分图就......
  • hdu:第K小的数(构造二分)
    ProblemDescription给定\(n\)个正整数\(a_1,a_2,\dots,a_n\)和\(m\)个正整数\(b_1,b_2,\dots,b_m\)。请在\(n\timesm\)个\(a_i+b_j(1\leqi\leqn,1\leqj\leqm)\)中,找到第\(k\)小的数(不去重)。Input第一行包含一个正整数\(T(1\leqT\leq10)\),表示测试数据的组数。每组......
  • hdu:Ice Cream Tower(构造二分)
    一座高度为k的塔\(b1,b_2,\dots,b_k\)满足\(2b_1\leqb_2,2b_2\leqb_3,2b_3\leqb_4,\dots,2b{k-1}\leqb_k\)你要从中选择一些数来叠很多座高度为\(k\)的塔,问最多能叠多少座塔。Input第一行包含一个正整数T(1≤T≤10),表示测试数据的组数。每组数据第一行包含两个正整数n,k(2......