首页 > 代码库 > Codeforces 460C
Codeforces 460C
比较裸的二分,但是比赛的时候脑抽,用树状数组瞎搞过了,但是边界条件没注意让hack了。
后来看到有人写了很简单的版本,又过了一遍,提醒一下自己不能忘记基本算法。
#include<iostream> #include<cstdio> #include<cstdlib> #include<string.h> #include<math.h> #include<algorithm> #include<vector> #include<queue> using namespace std; typedef long long ll; int a[100005],b[100005],sum[100005]; int n,m,k; bool judge(int mid) { int step=m,add=0; memset(sum,0,sizeof(sum)); for(int i=0;i<n;i++) b[i]=a[i]; for(int i=0;i<n;i++) { add+=sum[i]; b[i]+=add; if(b[i]<mid) { int temp=mid-b[i]; b[i]=mid; step-=temp; add+=temp; sum[min(i+k,n)]-=temp; if(step<0) return false; } } return true; } int main() { while(cin>>n>>m>>k) { int minn=1e9; int maxx=0; for(int i=0;i<n;i++) { cin>>a[i]; minn=min(minn,a[i]); maxx=max(maxx,a[i]); } int low=minn,high=m+maxx; int ans=minn; while(low<=high) { int mid=(low+high)>>1; if(judge(mid)) { ans=max(ans,mid); low=mid+1; } else high=mid-1; } cout<<ans<<endl; } }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。