单调队列 JC loves Mkk
来源:互联网 发布:知乎网址 编辑:程序博客网 时间:2024/06/05 09:59
不想粘题面,传送门
首先二分答案x,
设a[i]=v[i]-x;sum[i]为a[i]前缀和。只要保证sum[r]-sum[l-1]为偶数,范围L~R,切>=零即可。
考虑用单调队列,维护两个,一个代表选偶数,另一个奇数,奇偶搞定。
运用单调队列性质,那两个也就搞定了。
最后还是要考虑恶心的精度。二分还是要用long double,防止炸精,只要在check时确定了分母即可。因为最后二分出了总答案,乘上分母即使分子(要加0.5,向上取整)
#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>#define ll long long#define ld long double#define N 200005using namespace std;int n,n1,L,R,h[2],t[2],q[2][N],a[N];ld sum[N];ll ans2,ans1;inline ll gcd(ll x,ll y){return !y?x:gcd(y,x%y);}inline bool check(ld x){ for(int i=1;i<=n;i++)sum[i]=sum[i-1]+a[i]-x; h[0]=h[1]=1;t[0]=t[1]=0; for(int i=L;i<=n;i++) { int j=i-L,k=i&1; while(h[k]<=t[k]&&sum[j]<sum[q[k][t[k]]])t[k]--; q[k][++t[k]]=j; if(i-q[k][h[k]]>R)h[k]++; if(sum[i]-sum[q[k][h[k]]]>0){ans2=i-q[k][h[k]];return 1;} } return 0;}int main(){ cin>>n>>L>>R;int hh=0; for(int i=1;i<=n;i++) { scanf("%d",&a[i]),a[i+n]=a[i]; if(a[i]>hh)hh=a[i]; } ld l=0,r=hh,mid,xp=1e-6; L+=L&1;R-=R&1;n<<=1; while(r>xp+l) { mid=(l+r)/2; if(check(mid))l=mid; else r=mid; } mid=(l+r)/2; ans1=(ll)(mid*ans2+0.5); ll k=gcd(ans1,ans2);ans1/=k;ans2/=k; cout<<ans1;if(ans2==1)return 0;cout<<"/"<<ans2;}
阅读全文
0 0
- 单调队列 JC loves Mkk
- bzoj3316 jc loves mkk 二分&单调队列
- BZOJ 3316 JC loves Mkk 二分答案+单调队列
- 【bzoj3316】 JC loves Mkk 单调队列+二分答案
- BZOJ 3316: JC loves Mkk|单调队列|二分答案
- 3316: JC loves Mkk 二分答案+单调队列
- [二分答案 单调队列] BZOJ 3316 JC loves Mkk
- 【bzoj3316】【JC loves MKK】【单调队列+二分答案】
- [BZOJ]3316: JC loves Mkk 二分+单调队列
- bzoj 3316: JC loves Mkk(二分+单调队列)
- BZOJ3316 JC loves Mkk
- bzoj3316: JC loves Mkk
- BZOJ3316: JC loves Mkk
- 3316: JC loves Mkk
- bzoj3316: JC loves Mkk
- bzoj 3316 JC loves Mkk
- BZOJ 3316: JC loves Mkk
- 2017.9.7 JC loves Mkk 失败总结
- Python3-array和matrix
- 学会用各种姿势备份MySQL数据库
- 【实用】如何在windows下快速截图?
- webservice-sun api
- <天气>날씨
- 单调队列 JC loves Mkk
- Log4j学习记录
- Algorithms 练习1.4.6
- iOS AFNetworking 上传多张图片
- AWK命令的使用汇总
- 百度地图的定位
- LTE web
- sql server递归分页查询
- IDEA常用快捷键总结