比較裸的二分,但是比賽的時候腦抽,用樹狀數組瞎搞過了,但是邊界條件沒注意讓hack了。
後來看到有人寫了很簡單的版本,又過了一遍,提醒一下自己不能忘記基本算法。
#include#include #include #include #include #include #include #include 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>>m>>k) { int minn=1e9; int maxx=0; for(int i=0;i >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<