本来是想找一道生成树的题做的...结果被洛咕的标签骗到了这题...结果是二分答案与生成树一点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 ;
}

最新文章

  1. linux下mono的安装与卸载
  2. Vertica 6.1不完全恢复启动到LGE方法
  3. 异常详细信息: System.ComponentModel.Win32Exception: 拒绝访问。
  4. siteserver cms选择栏目搜索无效
  5. ASP.NET MVC对WebAPI接口操作(添加,更新和删除)
  6. InstallShield制作升级安装包
  7. cordova 打包发布正式版 apk
  8. tweenmax.js 文档
  9. JNI相关知识
  10. easyui datagird 列宽自适应
  11. UIActionSheet 这样写为什么显示为空白 ???
  12. Content Providers详解
  13. 代码审查工具 StyleCop 的探索
  14. python之路 - 基础2
  15. 自然语言处理高手_相关资源_开源项目(比如:分词,word2vec等)
  16. 干掉windows无脑设定:“始终使用选择的程序打开这种文件”、“使用Web服务查找正确的程序”
  17. SQL中IN与EXISTS的区别
  18. Cookie登录保存
  19. synchronized(五)
  20. noip 邮票面值设计 - 搜索 - 动态规划

热门文章

  1. 【转载】读懂IL代码就这么简单(二)
  2. hibernate载入持久化对象的两种方式——get、load
  3. Vue 建立工程
  4. Oracle启动和关闭服务
  5. Python开发【2.1 面向对象】
  6. Storm项目:流数据监控1《设计文档…
  7. include &lt;ctype.h&gt; 头文件包含函数总结
  8. SDUT 3033 这题实在不知道起啥名好了(思维巧法)
  9. LightOJ - 1422 Halloween Costumes —— 区间DP
  10. 合并table中某一列相邻的相同的行