• LuoguP2115 [USACO14MAR]破坏Sabotage【二分答案】By cellur925


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

     1 #include<cstdio>
     2 #include<algorithm>
     3 
     4 using namespace std;
     5 const double eps=1e-8;
     6 
     7 int n,v[100090],sum[100090];
     8 double l,r=10090,p[100090],premin[100090],nexmax[100090];
     9 
    10 bool check(double x)
    11 {
    12     for(int i=1;i<=n;i++) p[i]=sum[i]-i*x;
    13     for(int i=1;i<=n-2;i++) premin[i]=min(p[i],premin[i-1]);
    14     for(int i=n-1;i>=2;i--) nexmax[i]=max(nexmax[i+1],p[i]);
    15     for(int i=2;i<n;i++)
    16         if(nexmax[i]-premin[i-1]>p[n]) return 0;
    17     return 1;
    18 }
    19 
    20 int main()
    21 {
    22     scanf("%d",&n);
    23     for(int i=1;i<=n;i++) scanf("%d",&v[i]),sum[i]=sum[i-1]+v[i];
    24     nexmax[n]=-0x3f3f3f3f,premin[0]=0x3f3f3f3f;
    25     while(l+eps<r)
    26     {
    27         double mid=(l+r)/2;
    28         if(check(mid)) l=mid;
    29         else r=mid;
    30     }
    31     printf("%.3lf",l);
    32     return 0;
    33 }
    View Code
  • 相关阅读:
    【ABAP系列】SAP LSMW(摘自官网)
    【ABAP系列】SAP ABAP POPUP弹出框自建内容
    【ABAP系列】SAP ABAP ALV中的TOP_OF_PAGE添加任意图标
    彻底关闭Windows Defender丨Win10
    word中怎样设置页码包含总页数
    10款流行的Markdown编辑器,总有一款适合你
    MyEclipse安装插件
    Eclipse集成SonarLint
    MyEclipse中阿里JAVA代码规范插件(P3C)的安装及使用
    详述 IntelliJ IDEA 插件的安装及使用方法
  • 原文地址:https://www.cnblogs.com/nopartyfoucaodong/p/9784724.html
Copyright © 2020-2023  润新知