BZOJ 2600: [Ioi2011]ricehub|暴力|中位数
2016-01-10 19:17
274 查看
答案显然在一个区间里
从左到右枚举右端点,更新左端点直到cost<=B
米仓显然是中点(中位数)
每次修改中点 维护一下cost就好了
复杂度O(n)
从左到右枚举右端点,更新左端点直到cost<=B
米仓显然是中点(中位数)
每次修改中点 维护一下cost就好了
复杂度O(n)
#include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<queue> #include<vector> #include<set> #include<map> #include<iostream> #include<algorithm> #define T 111111 #define ll long long using namespace std; ll sc() { ll i=0;char c=getchar(); while(c>'9'||c<'0')c=getchar(); while(c>='0'&&c<='9')i=i*10+c-'0',c=getchar(); return i; } ll a[T],B,cost,mid; int n,L,l=1,r=1,ans=1; int main() { n=sc(),L=sc(),B=sc(); for(int i=1;i<=n;i++)a[i]=sc(); mid=1;cost=0; for(int i=2;i<=n;i++) { ll md=i+l>>1; ll change=a[i]-a[md]; if(md!=mid) change+=(a[md]-a[mid])*(mid-l)-(i-md-1)*(a[md]-a[mid]); cost+=change; mid=md; if(cost<=B) ans=max(i-l+1,ans); else { while(cost>B) { l++; md=(l+i)>>1; change=a[l-1]-a[mid]; if(md!=mid) change+=(a[md]-a[mid])*(mid-l-(i-md)); cost+=change; mid=md; } ans=max(ans,i-l+1); } } cout << ans; return 0; }
相关文章推荐
- Redis 配置
- 图书数据库以及操作界面
- 我的参考书籍列表
- 面向对象----浅述对象之间的关系
- 《Effective Modern C++》翻译--条款2: 理解auto自动类型推导
- bzoj 1085: [SCOI2005]骑士精神
- 《Effective Modern C++》翻译--条款2: 理解auto自动类型推导
- 超级毕业生
- ES的Java Rest client---jest
- 网络新闻api接口,免费开放
- Mongodb 笔记06 副本集的组成、从应用程序连接副本集、管理
- 设计模式Java的23种设计模式23种设计模式编程java
- alpha版、beta版、rc版的意思
- 列方程解数学题应用一例
- ZooKeeper Java Example
- android OpenGL(一) 开始准备
- Centos 6.5 x64环境下 spark 1.6 maven 编译-- 已验证
- Python enumerate函数
- bzoj2049: [Sdoi2008]Cave 洞穴勘测
- 字符串的比较