SUOI07 区间平均++ (二分答案+前缀和)

https://www.vijos.org/d/SUOI/p/59dc5af7d3d8a1361ae62b97

二分一个答案,然后做一做前缀和,用满足区间大小的最小值减一减,判断答案合不合法

然而还要输出一个最小的区间 太毒瘤了

但其实最后答案中最小区间的端点就只能是刚才做的那个最小值,因为如果不是最小值,那这个答案一定不是最优的

然后再随便对比一下就完事了

(感觉什么都没说清,看代码吧代码好看代码也不好看)

 1 #include<bits/stdc++.h>
 2 #define pa pair<int,int>
 3 #define ll long long
 4 using namespace std;
 5 const int maxn=1e6+5;
 6
 7 inline ll rd(){
 8     ll x=0;char c=getchar();int neg=1;
 9     while(c<‘0‘||c>‘9‘){if(c==‘-‘) neg=-1;c=getchar();}
10     while(c>=‘0‘&&c<=‘9‘) x=x*10+c-‘0‘,c=getchar();
11     return x*neg;
12 }
13
14 int N,K,Ma,Mi,num[maxn];
15 double sum[maxn];
16
17 inline bool judge(int &x,int &y,double r){
18     int a=-1,b=N+1;
19     for(int i=1;i<=N;i++) sum[i]=sum[i-1]+num[i]-r;
20     double mi=1e9;int mn;bool re=0;
21     for(int i=K;i<=N;i++){
22         if(mi>=sum[i-K]) mi=sum[i-K],mn=i-K;
23         if(sum[i]>=mi){
24             re=1;if(b-a>i-mn||(b-a==i-mn&&mn<a)) a=mn,b=i;
25         }
26     }if(re) x=a+1,y=b;
27     return re;
28 }
29
30 int main(){
31     int i,j,k;
32     N=rd();K=rd();Ma=-10000;Mi=10000;
33     for(i=1;i<=N;i++) num[i]=rd(),Ma=max(num[i],Ma),Mi=min(num[i],Mi);
34     double l=Mi-1,r=Ma+1;int a,b;
35     while(l<=r-1e-7){
36         double m=(l+r)/2;
37         if(judge(a,b,m)) l=m+1e-6;
38         else r=m-1e-6;
39     }printf("%d %d %.4f",a,b,l);
40     return 0;
41 }

原文地址:https://www.cnblogs.com/Ressed/p/9643820.html

时间: 2024-12-29 23:58:06

SUOI07 区间平均++ (二分答案+前缀和)的相关文章

聪明的质监员(二分答案,前缀和)

题目描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 nnn 个矿石,从 111 到 nnn 逐一编号,每个矿石都有自己的重量 wiw_iwi? 以及价值 viv_ivi? .检验矿产的流程是: 1 .给定 m 个区间 [Li,Ri]: 2 .选出一个参数 W : 3 .对于一个区间 [Li,Ri],计算矿石在这个区间上的检验值 Yi : 这批矿产的检验结果 Y 为各个区间的检验值之和.即: Y1+Y2...+Ym? 若这批矿产的检验结果与所给标准值 S 相差太多,就需要再

【算法学习笔记】52.一道题的三种方法..二分答案、动态规划、计算几何 SJTU OJ 1250 BestSubsequence

---恢复内容开始--- 1250. BestSubsequence Description LL有n个妹子,他给妹子们编号排成一排.据说今天天气大好,LL要去春游了,他决定要选定至少F个妹子一起去玩. 为了让妹子们开心,他决定选连续一段的妹子们.然后LL有个特殊的癖好,他喜欢体重比较厉害一些的妹子. 那你可以帮LL选妹子吗,使得选出来的这些妹子的平均体重最大. Input Format 输入第一行两个整数,n和F. 接下来n行,每行一个整数,表示妹子的体重. 对前50%的数据:1<=n<=2

[BZOJ1014] [JSOI2008] 火星人prefix (splay &amp; 二分答案)

Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 7 8 9 10 11 字符 m a d a m i m a d a m 现在,火星人定义了一个函数LCQ(x, y),表示:该字符串中第x个字符开始的字串,与该字符串中第y个字符开始的字串,两个字串的公共前缀的长度.比方说,LCQ(1, 7) = 5, LCQ(2, 10) = 1, LCQ(4,

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

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

二分答案入门乱讲

1.关于二分答案 如果reader没有学过二分,那么我建议您把这个网站关掉.不是我有偏见或者什么,看这篇文章对不了解二分的人来说没有好处. 对 于一些问题,它的解满足单调性,即如果x满足条件,则对于任意的 i ( 1<=i<=x) 或 (x <=i <=n) (假设1和n是答案的上下界)都会满足条件.一般遇上这种问题,我们就可以用二分答案来加快解决.这种问题常常有关键语句:使最大......最小. 对于上面的问题,在没学二分答案的时候,我们是这么写的:(假设答案是上界) for(i

ACM学习历程—51NOD 1685 第K大区间2(二分 &amp;&amp; 树状数组 &amp;&amp; 中位数)

http://www.51nod.com/contest/problem.html#!problemId=1685 这是这次BSG白山极客挑战赛的E题. 这题可以二分答案t. 关键在于,对于一个t,如何判断它是否能成为第k大. 将序列中大于t的置为1,小于t的置为-1,等于t的置为0.那么区间中位数大于t的和就大于0,小于t的就小于0.于是就是判断区间和大于0的个数是否小于等于k. 维护前缀和sum(i),然后统计之前sum(j)小于sum(i)的有多少个,就是以i为右值的区间和大于0的个数.于

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

链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3316 题意:给出一个环,求出长度在$L~R$之间任意偶数的一个序列,使得这个序列的平均值最大. 看到分数就知道这题不可做-- 好啦言归正传--这道题应该怎么做呢--直接上$PoPoQQQ$大爷的语录: 看到环果断倍增 看到平均值最大果断二分答案 看到长度[L,R]果断单调队列 没错就是这样--平均值这个东西其实就是要这么瞎搞--二分答案,然后给每个元素"咔嚓"一下去掉二分的值,之后

POJ 2018 Best Cow Fences(二分答案)

POJ 2018 Best Cow Fences(二分答案) Best Cow Fences Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 12144 Accepted: 3958 Description Farmer John's farm consists of a long row of N (1 <= N <= >100,000)fields. Each field contains a certain nu

bzoj 1014 [JSOI2008]火星人prefix (splay+二分答案+字符串hash)

题目大意:维护一个字符串,支持插入字符和替换字符的操作,以及查询该字符串两个后缀的最长公共前缀长度 乍一看以为是后缀数组,然而并没有可持久化后缀数组(雾) 看题解才知道这是一道splay题,首先要对splay维护区间信息有一定了解 splay维护,插入字符,替换字符 而它的字树内所有儿子的中序遍历的hash值也可以通过splay维护  (这个推导式似乎烂大街了) 而后缀就是把i-1拎到根节点,然后把n+1拎到根节点的右儿子上,它的左儿子表示的就是hash值 至于如何查公共前缀呢?二分答案啊!询问