2 条题解

  • 0
    @ 2025-10-8 17:04:57

    这是100分程序 f[i]=f[j]+ A*(sx[i]-sx[j])(sx[i]-sx[j])+B(sx[i]-sx[j])+C f[i]= f[j] + Asx[i]^2 + Asx[j]^2 - 2Asx[i]sx[j] + Bsx[i] - Bsx[j] + C 2Asx[i]sx[j] + f[i] - Asx[i]^2 - Bsx[i]- C = f[j] + Asx[j]^2 - Bsx[j] yj=f[j] + Asx[j]^2 - Bsx[j] xj=2.0Asx[j] k=sx[i] b= f[i] - Asx[i]^2 - Bsx[i] -C

    #include <bits/stdc++.h>
    using namespace std;
    const int N=1110000;
    typedef long long LL;
    LL  x[N],sx[N],f[N],A,B,C;
    int q[N];
    inline double X(int j){return 2.0*A*sx[j];}
    inline double Y(int j){return 1.0*(f[j]+A*sx[j]*sx[j]-B*sx[j]);}
    inline double slop(int j1,int j2){return (X(j2)==X(j1))?1e18*( Y(j2)-Y(j1) ):( Y(j2)-Y(j1) )/( X(j2)-X(j1) );}
    int main()
    {
        int n;scanf("%d",&n);scanf("%lld%lld%lld",&A,&B,&C);
        sx[0]=0;f[0]=0;
        for(int i=1;i<=n;i++)scanf("%lld",&x[i]),sx[i]=sx[i-1]+x[i]; 
    
        int l=1,r=1;q[1]=0;
        for(int i=1;i<=n;i++)
        {
            while(l<r && slop(q[l],q[l+1])<=1.0*sx[i] )l++;
            
            LL t=sx[i]-sx[q[l]];
            f[i]=f[q[l]]+ A*t*t + B*t + C ;
             
            while(l<r && slop(q[r-1],q[r])>=slop(q[r],i) )r--;
             
            q[++r]=i;
        }
        printf("%lld\n",f[n]);
        return 0;
    }
    
    • 0
      @ 2025-10-8 17:04:49
      /*
      这是100分程序
      f[i]=f[j]+ A*(sx[i]-sx[j])*(sx[i]-sx[j])+B*(sx[i]-sx[j])+C 
      f[i]= f[j] + A*sx[i]^2 + A*sx[j]^2 - 2A*sx[i]*sx[j] + B*sx[i] - B*sx[j] + C
      2A*sx[i]*sx[j]  +  f[i] - A*sx[i]^2 -  B*sx[i]- C    =    f[j] + A*sx[j]^2  - B*sx[j] 
      yj=f[j] + A*sx[j]^2 - B*sx[j] 
      xj=2.0*A*sx[j]
      k=sx[i]
      b= f[i] - A*sx[i]^2 -  B*sx[i] -C
      */ 
      #include<bits/stdc++.h>
      using namespace std;
      const int N=1110000;
      typedef long long LL;
      LL  x[N],sx[N],f[N],A,B,C;
      int q[N];
      inline double X(int j){return 2.0*A*sx[j];}
      inline double Y(int j){return 1.0*(f[j]+A*sx[j]*sx[j]-B*sx[j]);}
      inline double slop(int j1,int j2){return (X(j2)==X(j1))?1e18*( Y(j2)-Y(j1) ):( Y(j2)-Y(j1) )/( X(j2)-X(j1) );}
      int main()
      {
          int n;scanf("%d",&n);scanf("%lld%lld%lld",&A,&B,&C);
          sx[0]=0;f[0]=0;
          for(int i=1;i<=n;i++)scanf("%lld",&x[i]),sx[i]=sx[i-1]+x[i]; 
      
          int l=1,r=1;q[1]=0;
          for(int i=1;i<=n;i++)
          {
              while(l<r && slop(q[l],q[l+1])<=1.0*sx[i] )l++;
              
              LL t=sx[i]-sx[q[l]];
              f[i]=f[q[l]]+ A*t*t + B*t + C ;
               
              while(l<r && slop(q[r-1],q[r])>=slop(q[r],i) )r--;
               
              q[++r]=i;
          }
          printf("%lld\n",f[n]);
          return 0;
      }
      • 1

      【斜率优化】[APIO2010] 特别行动队

      信息

      ID
      3576
      时间
      1000ms
      内存
      128MiB
      难度
      6
      标签
      递交数
      31
      已通过
      12
      上传者