zoukankan      html  css  js  c++  java
  • BZOJ1701 : [Usaco2007 Jan]Cow School牛学校

    枚举剩下的分数个数$k$,设最高的$k$个分数和的分子分母分别为$U$和$D$。

    那么在选了的里面找到$A=min(Dt[x]-Up[x])$,没选的里面找到$B=max(Dt[x]-Up[x])$。

    如果$A<B$,则可以更大。

    对于$A,B$的计算,可以利用决策单调性分治求解。

    时间复杂度$O(nlog n)$。

    #include<cstdio>
    #include<algorithm>
    typedef long long ll;
    const int N=50010;
    const ll inf=1LL<<60;
    int n,i,ans,q[N];ll f[N],g[N];
    struct P{int t,p;}a[N],b[N];
    inline bool cmp(const P&a,const P&b){return a.t*b.p>b.t*a.p;}
    void getf(int l,int r,int dl,int dr){
      int m=(l+r)>>1,dm;
      f[m]=inf;
      for(int i=dl;i<=m&&i<=dr;i++){
        ll t=1LL*a[i].t*b[m].p-1LL*a[i].p*b[m].t;
        if(t<f[m])f[m]=t,dm=i;
      }
      if(l<m)getf(l,m-1,dl,dm);
      if(r>m)getf(m+1,r,dm,dr);
    }
    void getg(int l,int r,int dl,int dr){
      int m=(l+r)>>1,dm;
      g[m]=-inf;
      for(int i=dr;i>m&&i>=dl;i--){
        ll t=1LL*a[i].t*b[m].p-1LL*a[i].p*b[m].t;
        if(t>g[m])g[m]=t,dm=i;
      }
      if(l<m)getg(l,m-1,dl,dm);
      if(r>m)getg(m+1,r,dm,dr);
    }
    int main(){
      scanf("%d",&n);
      for(i=1;i<=n;i++)scanf("%d%d",&a[i].t,&a[i].p);
      std::sort(a+1,a+n+1,cmp);
      for(i=1;i<=n;i++)b[i].t=b[i-1].t+a[i].t,b[i].p=b[i-1].p+a[i].p;
      getf(1,n-1,1,n),getg(1,n-1,1,n);
      for(i=1;i<n;i++)if(f[i]<g[i])q[++ans]=n-i;
      for(printf("%d
    ",ans),i=ans;i;i--)printf("%d
    ",q[i]);
      return 0;
    }
    

      

  • 相关阅读:
    【实验吧】CTF_Web_登录一下好吗?
    各种常用数字格式化
    .Net 4.0 (2)
    springBoot+springSecurity 数据库动态管理用户、角色、权限
    springboot+mybatis+SpringSecurity 实现用户角色数据库管理
    Spring boot中Redis的使用
    spring data jpa的使用
    如何优雅的使用mybatis
    WebJars
    mvn打包的POm文件
  • 原文地址:https://www.cnblogs.com/clrs97/p/5789405.html
Copyright © 2011-2022 走看看