bzoj3316 JC loves Mkk 二分答案 单调队列

链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3316

题意:给出一个环,求出长度在$L~R$之间任意偶数的一个序列,使得这个序列的平均值最大。

看到分数就知道这题不可做……

好啦言归正传……这道题应该怎么做呢……直接上$PoPoQQQ$大爷的语录:

看到环果断倍增

看到平均值最大果断二分答案

看到长度[L,R]果断单调队列

没错就是这样……平均值这个东西其实就是要这么瞎搞……二分答案,然后给每个元素“咔嚓”一下去掉二分的值,之后我们就可以寻找一个区间,这个区间的和大于等于零,这个区间就是合法的……这个东西显然可以前缀和加单调队列优化……由于长度必须是偶数所以必须开两个单调队列……

还有就是……

用long double!不然炸精会炸的很惨!

用long double!不然炸精会炸的很惨!

用long double!不然炸精会炸的很惨!

重要的事情说三遍!别问我怎么知道的……

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 const int maxn=100005;
 7 long double sum[maxn<<1];long long dodo;
 8 int a[maxn<<1],n,L,R,q[2][maxn<<1],h[2],t[2];
 9 long long gcd(long long a,long long b){return !b?a:gcd(b,a%b);}
10 const double eps=1e-6;
11 bool check(long double val)
12 {
13     for(int i=1;i<=n;i++)sum[i]=sum[i-1]+a[i]-val;
14     h[0]=h[1]=1,t[0]=t[1]=0;
15     for(int i=L;i<=n;i++)
16     {
17         int k=i&1,x=i-L;
18         while(h[k]<=t[k]&&sum[x]<=sum[q[k][t[k]]])t[k]--;
19         while(h[k]<=t[k]&&q[k][h[k]]<i-R)h[k]++;
20         q[k][++t[k]]=x;
21         if(sum[i]-sum[q[k][h[k]]]>=eps)return dodo=i-q[k][h[k]];
22     }
23     return 0;
24 }
25 int haha()
26 {
27     scanf("%d%d%d",&n,&L,&R);if(L&1)L++;if(R&1)R--;
28     for(int i=1;i<=n;i++)scanf("%d",&a[i]),a[i+n]=a[i];n<<=1;
29     long double l=0,r=1e9,mid,ans=0;
30     while(r-l>eps)
31     {
32         mid=(l+r)/2;
33         if(check(mid))l=ans=mid;
34         else r=mid;
35     }
36     long long fenzi=(long long)(dodo*ans+0.5),fenmu=dodo;
37     long long g=gcd(fenzi,fenmu);fenzi/=g,fenmu/=g;
38     printf("%lld",fenzi);if(fenmu>1)printf("/%lld\n",fenmu);
39 }
40 int sb=haha();
41 int main(){;}

bzoj3316

时间: 2024-10-08 10:36:59

bzoj3316 JC loves Mkk 二分答案 单调队列的相关文章

BZOJ 3316 JC loves Mkk 二分答案+单调队列

题目大意:给定一个环,要求在这个环上截取长度为偶数且在[L,R]区间内的一段,要求平均值最大 看到环果断倍增 看到平均值最大果断二分答案 看到长度[L,R]果断单调队列 对数组维护一个前缀和,对前缀和维护单调递增的单调队列 每扫过一个数sum[i],将sum[i-L]加入单调队列,再把距离i超过R的点删掉 长度为偶数?对奇数位置和偶数位置分别维护一个单调队列即可 每次找到大于0的子串之后记录一下分母再退出就行了 #include <cstdio> #include <cstring>

【BZOJ3316】JC loves Mkk 分数规划+单调队列

[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,我们需

bzoj3316 JC loves Mkk题解

3316: JC loves Mkk Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 979  Solved: 316[Submit][Status][Discuss] 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 Sampl

[bzoj2806][Ctsc2012]Cheat(后缀自动机(SAM)+二分答案+单调队列优化dp)

偷懒直接把bzoj的网页内容ctrlcv过来了 2806: [Ctsc2012]Cheat Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1943  Solved: 1004[Submit][Status][Discuss] Description Input 第一行两个整数N,M表示待检查的作文数量,和小强的标准作文库的行数接下来M行的01串,表示标准作文库接下来N行的01串,表示N篇作文 Output N行,每行一个整数,表示这篇作文的Lo

送礼物(二分答案+单调队列)

QUESTION: JYY和CX的结婚纪念日即将到来,JYY来到萌萌开的礼品店选购纪念礼物.萌萌的礼品店很神奇,所有出售的礼物都按照特定的顺序都排成一列,而且相邻的礼物之间有一种神秘的美感.于是,JYY决定从中挑选连续的一些礼物,但究竟选 哪些呢?假设礼品店一共有\(N\)件礼物排成一列,每件礼物都有它的美观度.排在第\(i\)(\(1\leq i \leq N\))个位置的礼物美观度为正整数\(A_i\).JYY决定选出其中连续的一段,即编号为礼物\(i\),\(i+1\),....,\(j-

BZOJ3316 JC loves Mkk

首先断环成链,变成两倍长度. 然后二(fen)分(shu)答(gui)案(hua),查看答案为ans的长度在[L, R]之间的链存不存在. 我们可以维护前缀和,用单调队列O(n)判断是否和大于0 又学习了个黑科技...::x表示全局变量x... 1 /************************************************************** 2 Problem: 3316 3 User: rausen 4 Language: C++ 5 Result: Acce

bzoj 2806: [Ctsc2012]Cheat【广义SAM+二分+dp+单调队列】

把模板串建一个广义SAM 然后在线查询,每次在SAM上预处理出一个a[i]表示i位置向前最多能匹配多长的模板串 二分答案L,dp判断,设f[i]为·~i有几个匹配,转移显然是f[i]=max{f[i-1],f[j]+i-j(i-a[i]<=j<=i-L)},根据性质,i-a[i]是单调的(或者直接看a[i]的预处理过程也能看出来),所以这个dp可以用单调队列优化转移,最后判断是否f[n]>=L*0.9 #include<iostream> #include<cstdio

HDU 5089 Assignment(rmq+二分 或 单调队列)

Assignment Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 557    Accepted Submission(s): 280 Problem Description Tom owns a company and he is the boss. There are n staffs which are numbered fr

codeforces 251A Points on Line(二分or单调队列)

Description Little Petya likes points a lot. Recently his mom has presented him n points lying on the line OX. Now Petya is wondering in how many ways he can choose three distinct points so that the distance between the two farthest of them doesn't e