标签:bzoj2600 ioi2011 ricehub 二分答案
转载请注明出处【V字弦割】谢谢:http://blog.csdn.net/vmurder/article/details/42968083
话说只删除网址却留下了这两句话的是什么心态233
题意 : 见题目。
题解:
二分答案,然后对于一个ans,它显然是取了连续的一段。
然后这个连续的一段显然一定是取中位数那个稻田作为粮仓。
然后显然可以区间快速转移。
然后显然这是一道水题,显然他需要开long long。
显然如果你还不懂的话可以留言问。
代码:
<span style="font-family:KaiTi_GB2312;font-size:18px;">#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N 101000 using namespace std; int n,m; long long p; int pos[N]; bool check(int len) { int i,l,r,mid; long long now=0; l=1,r=len,mid=l+r>>1; for(i=l;i<mid;i++)now+=(pos[mid]-pos[i]); for(i=mid+1;i<=r;i++)now+=(pos[i]-pos[mid]); if(now<=p)return true; for(;r<n;) { now-=(pos[mid]-pos[l++]); now+=(pos[++r]-pos[mid]); mid=l+r>>1; now+=(pos[mid]-pos[mid-1])*(mid-l); now-=(pos[mid]-pos[mid-1])*(r-mid+1); if(now<=p)return true; } return false; } int main() { freopen("test.in","r",stdin); scanf("%d%d%lld",&n,&m,&p); for(int i=1;i<=n;i++)scanf("%d",&pos[i]); int l=1,r=n,mid,ans=0; while(l<r) { if(r-l<=3) { for(int i=l;i<=r;i++)if(check(i))ans=i; break; } mid=l+r>>1; if(check(mid))l=mid; else r=mid-1; } printf("%d\n",ans); return 0; } </span>
【BZOJ2600】【IOI2011】ricehub 二分答案
标签:bzoj2600 ioi2011 ricehub 二分答案
原文地址:http://blog.csdn.net/vmurder/article/details/42968083