【BZOJ3316】JC loves Mkk

Description

Input

第1行,包含三个整数。n,L,R。
第2行n个数,代表a[1..n]。

Output

仅1行,表示询问答案。
如果答案是整数,就输出整数;否则,输出既约分数“P/Q”来表示。

Sample Input

5 3 4
3 1 2 4 5

Sample Output

7/2
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 分数规划+单调队列的更多相关文章

  1. BZOJ_4476_[Jsoi2015]送礼物_01分数规划+单调队列

    BZOJ_4476_[Jsoi2015]送礼物_01分数规划+单调队列 Description JYY和CX的结婚纪念日即将到来,JYY来到萌萌开的礼品店选购纪念礼物. 萌萌的礼品店很神奇,所有出售的 ...

  2. P6087 [JSOI2015]送礼物 01分数规划+单调队列+ST表

    P6087 [JSOI2015]送礼物 01分数规划+单调队列+ST表 题目背景 \(JYY\) 和 \(CX\) 的结婚纪念日即将到来,\(JYY\) 来到萌萌开的礼品店选购纪念礼物. 萌萌的礼品店 ...

  3. bzoj3316 JC loves Mkk题解

    3316: JC loves Mkk Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 979  Solved: 316[Submit][Status][Di ...

  4. bzoj3316: JC loves Mkk(单调队列+分数规划)

    Description Input 第1行,包含三个整数.n,L,R.第2行n个数,代表a[1..n]. Output 仅1行,表示询问答案.如果答案是整数,就输出整数:否则,输出既约分数“P/Q”来 ...

  5. 【BZOJ 3316】JC loves Mkk 01分数规划+单调队列

    单调栈不断吞入数据维护最值,数据具有单调性但不保证位置为其排名,同时可以按照进入顺序找出临近较值单调队列队列两端均可删除数据但只有队末可以加入数据,仍然不断吞入数据但同时可以额外刨除一些不符合条件的数 ...

  6. bzoj3316: JC loves Mkk

    Description Input 第1行,包含三个整数.n,L,R.第2行n个数,代表a[1..n]. Output 仅1行,表示询问答案.如果答案是整数,就输出整数:否则,输出既约分数“P/Q”来 ...

  7. BZOJ 5281--[Usaco2018 Open]Talent Show(分数规划&单调队列&DP)

    5281: [Usaco2018 Open]Talent Show Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 79  Solved: 58[Sub ...

  8. [BZOJ4476][JSOI2015]送礼物[分数规划+单调队列]

    题意 题目链接 分析 分数规划之后可以得到式子:\(max-min-r*mid+l*mid\geq k*mid\) . 贪心选择,肯定区间的端点是极小或者极大值.特殊处理区间长度 \(\leq L\) ...

  9. BZOJ4476 JSOI2015送礼物(分数规划+单调队列)

    看到这个式子当然先二分答案.得max-min-(j-i+k)ans>=0. 显然max-min相同的情况下所选区间长度越短越好,所以max和min都应该取在边界.那么实际上我们根本不用管端点是否 ...

随机推荐

  1. Shell--Bash shell的操作环境

    一.路径与命令查找顺序 1.以相对/绝对路径执行命令,例如“/bin/ls”或“./ls”; 2.由alias找到该命令来执行 3.由bash内置的(builtin)命令来执行 4.通过$PATH这个 ...

  2. 转: 初识Agile/CMMI/Scrum

    转:http://www.cnblogs.com/maxwell/p/5093917.html 一.背景介绍 在朋友(aehyok)的建议下,初步去了解Visual Studio Online,简称V ...

  3. Java基础学习过程

    转载:http://blog.csdn.net/scythe666/article/details/51699954JVM 1. 内存模型( 内存分为几部分? 堆溢出.栈溢出原因及实例?线上如何排查? ...

  4. 屏蔽NumberPicker点击可输入问题

    1.xml布局中添加属性:Android:descendantFocusability="blocksDescendants" 2.代码中设置:numberPicker.setDe ...

  5. Java 实例

    Java 实例 本章节我们将为大家介绍 Java 常用的实例,通过实例学习我们可以更快的掌握 Java 的应用. Java 环境设置实例 Java 实例 – 如何编译一个Java 文件? Java 实 ...

  6. 懒人学习automake, Makefile.am,configure.ac(转)

    已经存在Makefile.am,如何生成Makefile? 步骤: [root@localhost hello]# autoscan .///在当前文件夹中搜索 [root@localhost hel ...

  7. [Python]BeautifulSoup—HTML解析包

    在用Python写爬虫时,一个常见的操作是对抓下的HTML做分析处理,得到想要的内容.一般的方法为使用Python的re库中.用正則表達式来解析文本.只是这样的方法适用于全部的文本.而针对于特定格式的 ...

  8. Ros 中的多线程

      参考文献:http://blog.csdn.net/sinat_27554409/article/details/48446611 老王说ROS http://blog.csdn.net/yake ...

  9. Vue-cli + Express 构建的SPA Blog(前后分离)

    代码地址如下:http://www.demodashi.com/demo/12526.html 为什么学习并使用Vue 1.发展趋势 最近这几年的前端圈子,由于戏台一般精彩纷呈,从 MVC 到 MVV ...

  10. java中获取文件路径的几种方式

    http://xyzroundo.iteye.com/blog/1116159关于绝对路径和相对路径: 绝对路径就是你的主页上的文件或目录在硬盘上真正的路径,(URL和物理路径)例如:C:xyz es ...