【BZOJ3316】JC loves Mkk 分数规划+单调队列
【BZOJ3316】JC loves Mkk
Description
.jpg)
Input
第1行,包含三个整数。n,L,R。
第2行n个数,代表a[1..n]。
Output
仅1行,表示询问答案。
如果答案是整数,就输出整数;否则,输出既约分数“P/Q”来表示。
Sample Input
3 1 2 4 5
Sample Output
HINT
1≤L≤R≤n≤10^5,0≤ai≤10^9,保证问题有解,数据随机生成
题解:直接二分答案,然后每个糖果的权值都变成a[i]-mid,我们需要找到一段长度在[L,R]中的区间使得权值和>=0。然后我们将区间和转变成前缀相减的形式,所以只需要找到s[j]<s[i],j<i这样的i,j就行了。那么对于每个s[i],我们肯定是贪心地选取前面最小的s[j],这个用单调队列维护即可。
但是要求区间长度是偶数,所以我们需要开对奇偶各开一个单调队列。同时要求答案是分数,这个是需要再最后算一下就行了。
#include <cstdio>
#include <cstring>
#include <iostream>
typedef long long ll;
using namespace std;
const int maxn=100010;
int n,L,R,h1,t1,h2,t2;
ll ans1,ans2,g;
ll A[maxn<<1],S[maxn<<1];
double v[maxn<<1],s[maxn<<1];
int q1[maxn<<1],q2[maxn<<1];
ll gcd(ll a,ll b)
{
return (!b)?a:gcd(b,a%b);
}
bool check(double x)
{
int i;
for(i=1;i<=n<<1;i++) v[i]=A[i]-x,s[i]=s[i-1]+v[i];
h1=h2=t1=1,t2=0,q1[1]=0;
for(i=L;i<=n<<1;i++)
{
while(h1<=t1&&q1[h1]<i-R) h1++;
while(h2<=t2&&q2[h2]<i-R) h2++;
if(!(i&1)&&h1<=t1&&s[q1[h1]]<=s[i])
{
ans1=S[i]-S[q1[h1]],ans2=i-q1[h1],g=gcd(ans1,ans2),ans1/=g,ans2/=g;
return 1;
}
if((i&1)&&h2<=t2&&s[q2[h2]]<=s[i])
{
ans1=S[i]-S[q2[h2]],ans2=i-q2[h2],g=gcd(ans1,ans2),ans1/=g,ans2/=g;
return 1;
}
if(!((i-L+1)&1))
{
while(h1<=t1&&s[q1[t1]]>=s[i-L+1]) t1--;
q1[++t1]=i-L+1;
}
else
{
while(h2<=t2&&s[q2[t2]]>=s[i-L+1]) t2--;
q2[++t2]=i-L+1;
}
}
return 0;
}
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
int main()
{
n=rd(),L=rd(),R=rd();
int i;
double l=1<<30,r=0,mid;
for(i=1;i<=n;i++) A[i]=A[i+n]=rd(),l=min(l,(double)A[i]),r=max(r,(double)A[i]);
for(i=1;i<=n<<1;i++) S[i]=S[i-1]+A[i];
for(i=1;i<=50;i++)
{
mid=(l+r)/2;
if(check(mid)) l=mid;
else r=mid;
}
printf("%lld/%lld",ans1,ans2);
return 0;
}
【BZOJ3316】JC loves Mkk 分数规划+单调队列的更多相关文章
- BZOJ_4476_[Jsoi2015]送礼物_01分数规划+单调队列
BZOJ_4476_[Jsoi2015]送礼物_01分数规划+单调队列 Description JYY和CX的结婚纪念日即将到来,JYY来到萌萌开的礼品店选购纪念礼物. 萌萌的礼品店很神奇,所有出售的 ...
- P6087 [JSOI2015]送礼物 01分数规划+单调队列+ST表
P6087 [JSOI2015]送礼物 01分数规划+单调队列+ST表 题目背景 \(JYY\) 和 \(CX\) 的结婚纪念日即将到来,\(JYY\) 来到萌萌开的礼品店选购纪念礼物. 萌萌的礼品店 ...
- bzoj3316 JC loves Mkk题解
3316: JC loves Mkk Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 979 Solved: 316[Submit][Status][Di ...
- bzoj3316: JC loves Mkk(单调队列+分数规划)
Description Input 第1行,包含三个整数.n,L,R.第2行n个数,代表a[1..n]. Output 仅1行,表示询问答案.如果答案是整数,就输出整数:否则,输出既约分数“P/Q”来 ...
- 【BZOJ 3316】JC loves Mkk 01分数规划+单调队列
单调栈不断吞入数据维护最值,数据具有单调性但不保证位置为其排名,同时可以按照进入顺序找出临近较值单调队列队列两端均可删除数据但只有队末可以加入数据,仍然不断吞入数据但同时可以额外刨除一些不符合条件的数 ...
- bzoj3316: JC loves Mkk
Description Input 第1行,包含三个整数.n,L,R.第2行n个数,代表a[1..n]. Output 仅1行,表示询问答案.如果答案是整数,就输出整数:否则,输出既约分数“P/Q”来 ...
- BZOJ 5281--[Usaco2018 Open]Talent Show(分数规划&单调队列&DP)
5281: [Usaco2018 Open]Talent Show Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 79 Solved: 58[Sub ...
- [BZOJ4476][JSOI2015]送礼物[分数规划+单调队列]
题意 题目链接 分析 分数规划之后可以得到式子:\(max-min-r*mid+l*mid\geq k*mid\) . 贪心选择,肯定区间的端点是极小或者极大值.特殊处理区间长度 \(\leq L\) ...
- BZOJ4476 JSOI2015送礼物(分数规划+单调队列)
看到这个式子当然先二分答案.得max-min-(j-i+k)ans>=0. 显然max-min相同的情况下所选区间长度越短越好,所以max和min都应该取在边界.那么实际上我们根本不用管端点是否 ...
随机推荐
- scala,import test._ ; import test.{ClassA,ClassB}
在scala中,*不是通配符,下斜杠“_”才是通配符.因此当使用某个package所有的类时,直接使用:import test._:使用某几个时,直接使用:import test.{ClassA,Cl ...
- Unicode类别
Unicode 通用类别: http://msdn.microsoft.com/zh-cn/library/20bw873z(VS.80).aspx 类别 说明 Lu 字母,大写 Ll 字母,小写 L ...
- 【MySQL】谈谈PhxSQL的设计和实现哲学
参考资料: http://mp.weixin.qq.com/s?__biz=MzI4NDMyNTU2Mw==&mid=2247483790&idx=1&sn=c925202df ...
- 【原创】关于bug反正出现的问题可能
bug修正的问题:1. xib问题.2. 模块不清同时修改.3. svn代码合并的修改熟悉程度.4. 禁止全局格式化代码.
- JVM源码分析之FinalReference完全解读
Java对象引用体系除了强引用之外,出于对性能.可扩展性等方面考虑还特地实现了4种其他引用:SoftReference.WeakReference.PhantomReference.FinalRefe ...
- d3.js封装文本实现自动换行和旋转平移等功能
我们下面话不多说,本文主要介绍的是利用D3.js封装文本实现自动换行功能的步骤,下面来一起看看吧. 一.引用 multext.js 文件 multext.js function appendMulti ...
- TCP/IP详解 卷一(第十八章 TCP连接的建立和终止)
建立连接 建立一个TCP连接时会发生下述情况 1.客户TCP发送一个SYN(同步)分节,它告诉服务器将在(待建立)连接中发送的数据的初始序列号. 2.服务器确认(ACK)客户的SYN,同时自己也得发送 ...
- js 根据所输内容生成助记码
js生成与中文字符串相对映的拼音首字母串 CreateTime--2017年7月14日16:35:31Author:Marydon 需要工具js文件letter.js,代码如下: /** 作者:梅 ...
- 【BIEE】02_新建资料库并创建简单分析
一.新建资料库 1.开始→打开BI管理→点击新建资料库 2.文件→新建资料档案库 下一步 在下面的框中一次填入 连接类型:OCI 10g/11g(直接选择即可) 数据库名称:(DESCRIPTION ...
- 51单片机 | 基于I2C总线的秒表模拟应用
———————————————————————————————————————————— 参考地址: http://blog.csdn.net/junyeer/article/details/4648 ...