本来是想找一道生成树的题做的...结果被洛咕的标签骗到了这题...结果是二分答案与生成树一点mao关系都没有....


题目大意:给你一个序列,请你删去某一个$l~r$区间的值($2<=i<=j<=n-1$),使得剩余元素的平均值最小。

开始是想二分序列长度的,后来发现没什么卵用。。。于是再想一想二分平均值,但是又感觉并没有二分单调性...(其实是满足的,因为我们二分出的最终答案,当比这个答案大的时候,我们一定能满足,小的时候一定不能满足。)

因为二分的复杂度带了一个$log$,所以我们$check$函数的复杂度必须控制在$O(n)$以内。但是我们要是枚举区间的话即使用上前缀和维护那还是$O(n^2)$的了,显然是不可行的。

我们考虑从最终的式子入手(一个重要的思考方向)

假如我们抹去的区间是$[l,r]$,那么最终的答案就是$(sum[n]-sum[r]+sum[l-1])/(n-(r-l+1))$。因为我们每次二分出来一个期望成为答案的值,只有当所有可能的情况都大于等于我们当前的答案,这个答案才有可能成为真正合法的答案。

再从刚才的答案出发,假设在这里$x$是一个真正合法的解,也就是任意$(sum[n]-sum[r]+sum[l-1])/(n-(r-l+1))>=x$。然后我们把分母乘过去,进行一顿数学操作,可以得出,最后我们只需要判断任意$(sum[n]-nx)-(sun[j]-jx)+(sum[i-1]-(i-1)x)>=0$是否可行即可。

然后我们会发现式子中有一部分是非常有规律又整齐的。于是我们可以专门搞出一个$p$数组,$p[i]=sum[i]-i*x$($x$为当前二分的答案)。再整理下,最后我们需要判断的就是$p[j]-p[i-1]<=p[n]$(若都满足则可行)。只要有一组$i,j$使$p[j]-p[i-1]>p[n]$,这个答案就报废了==。

于是,我们就考虑用尽量大的来试探。但是又不能枚举区间,所以我们考虑维护两个数组:前缀最小值(因为$j$)和后缀最大值(因为$i$)。这样就好受多了,(感觉这也是个枚举区间的优化技巧啊qwq)

于是我们的$check$函数就写完了。当我们当前check的这个值满足的时候,往大里找。因为现在这个答案都小了,比它还小的答案一定不能满足。(这里的理解需要注意)。剩下的就只是一些细节方面的赋初值的问题。

Code

 #include<cstdio>
#include<algorithm> using namespace std;
const double eps=1e-; int n,v[],sum[];
double l,r=,p[],premin[],nexmax[]; bool check(double x)
{
for(int i=;i<=n;i++) p[i]=sum[i]-i*x;
for(int i=;i<=n-;i++) premin[i]=min(p[i],premin[i-]);
for(int i=n-;i>=;i--) nexmax[i]=max(nexmax[i+],p[i]);
for(int i=;i<n;i++)
if(nexmax[i]-premin[i-]>p[n]) return ;
return ;
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&v[i]),sum[i]=sum[i-]+v[i];
nexmax[n]=-0x3f3f3f3f,premin[]=0x3f3f3f3f;
while(l+eps<r)
{
double mid=(l+r)/;
if(check(mid)) l=mid;
else r=mid;
}
printf("%.3lf",l);
return ;
}

LuoguP2115 [USACO14MAR]破坏Sabotage【二分答案】By cellur925的更多相关文章

  1. [USACO14MAR]破坏Sabotage 二分答案

    题目描述 Farmer John's arch-nemesis, Farmer Paul, has decided to sabotage Farmer John's milking equipmen ...

  2. [USACO14MAR] 破坏Sabotage(二分答案,分数规划)

    题目链接 Solution 去掉中间一段区间 \([l,r]\) 后剩下的平均值可以表示为 : \[\frac{\sum^{n}_{i=1}{v_i}-\sum^{r}_{i=l}{v_i}}{n-( ...

  3. P2115 [USACO14MAR]破坏(二分答案)

    给定一串数,问删除中间一段,剩下的平均数最小是多少: 不容易想到这是个二分. $solution:$ 来手玩一点式子: 首先很容易想到一个前缀和$sum_i $表示i到1的前缀和,这样就能很容易地O( ...

  4. [USACO14MAR] Sabotage 二分答案 分数规划

    [USACO14MAR] Sabotage 二分答案 分数规划 最终答案的式子: \[ \frac{sum-sum[l,r]}{n-len[l,r]}\le ans \] 转换一下: \[ sum[1 ...

  5. [USACO14MAR]破坏Sabotage

    还是二分答案,发现我的$check$函数不太一样,来水一发题解 列一下式子 $$\frac{sum-sum[l,r]}{n-(r-l+1)}<=ans$$ 乘过去 $$sum-sum[l,r]& ...

  6. P2115 [USACO14MAR]破坏Sabotage

    题意:给你一个正整数序列,让你删去一段区间内的数[l,r] $1<l\le r <n$ 使得剩余的数平均值最小$n\le 10^5$ 1.不难想到暴力,用前缀和优化$O(n^2)$ #in ...

  7. BZOJ 3477: [Usaco2014 Mar]Sabotage( 二分答案 )

    先二分答案m, 然后对于原序列 A[i] = A[i] - m,  然后O(n)找最大连续子序列和, 那么此时序列由 L + mx + R组成. L + mx + R = sum - n * m, s ...

  8. 洛谷2115 [USACO14MAR]破坏Sabotage

    https://www.luogu.org/problem/show?pid=2115 题目描述 Farmer John's arch-nemesis, Farmer Paul, has decide ...

  9. 洛谷P2115 [USACO14MAR]破坏Sabotage

    题目描述 Farmer John's arch-nemesis, Farmer Paul, has decided to sabotage Farmer John's milking equipmen ...

随机推荐

  1. hdu3076ssworld VS DDD 概率dp

    //ssworld VS DDD 两个人有血量值 hp1 , hp2  //两人掷骰子得到每一点的概率已知 //ssword赢的概率 //dp[i][j]  表示有第一个人血量为i.第二个人的血量为j ...

  2. CocoaPods安装问题

    主要步骤: sudo gem install cocoapods pod setup 验证是否安装成功: pod search SDWebImage 常见问题: 1 sudo gem install ...

  3. Task C# 多线程和异步模型 TPL模型 【C#】43. TPL基础——Task初步 22 C# 第十八章 TPL 并行编程 TPL 和传统 .NET 异步编程一 Task.Delay() 和 Thread.Sleep() 区别

    Task C# 多线程和异步模型 TPL模型   Task,异步,多线程简单总结 1,如何把一个异步封装为Task异步 Task.Factory.FromAsync 对老的一些异步模型封装为Task ...

  4. java设计模式----真实世界的模式

    设计模式的定义: 模式是在某情境下,针对某问题的某种解决方案 反模式: 告诉你如何采用一个不好的解决方案解决一个问题 要点: 1.让设计模式自然而然地出现在你的设计中,而不是为了使用而使用 2.设计模 ...

  5. Xamarin.Android 实现虾米音乐搜索下载

    之前写过一篇博客,用api接口实现虾米音乐搜索功能,不过这个api接口被封了,所以只能获取到官方的一个音乐json数据,里面的下载地址是被加密过得,这里我会教大家如何用xamarin实现. 准备工作: ...

  6. 提升vector性能的几个技巧

    原文:https://www.sohu.com/a/120595688_465979 Vector 就像是 C++ STL 容器的瑞士军刀.Bjarne Stoutsoup 有一句话 – “一般情况下 ...

  7. Hibernate的一些使用技巧

    1.Hibernate是如今最流行的开源对象关系映射(ORM)持久化框架,SSH框架组合是很多JavaEE工程的首选,java持久化框架(JPA)的设计师是Hibernate的作者,因此对于Hiber ...

  8. Hibernate中的merge使用详情解说

    merge的作用是:新new一个对象,如果该对象设置了ID,则这个对象就当作游离态处理:                                       当ID在数据库中不能找到时,用up ...

  9. 教你如何配置Ubuntu用于高效、高质量的发送邮件

    本文首发在: http://mengxi.me/how-to-setup-ubuntu-sendmail-to-deliver-email-fast-and-reliable/ 在网站上线后,经常会遇 ...

  10. Introduce Null Object

    今天继续总结<重构>这本书中的一个重构手法,Introduce Null Object.写这个手法是因为它确实很巧妙,在实际编程中经常会遇到这种情况,前人总结出来了这么一个经典的手法,当然 ...