数据过水 O(N^3) 过了。。
查看原帖
数据过水 O(N^3) 过了。。
246331
mystic_qwq楼主2024/7/6 23:34

而且没快读

#include<bits/stdc++.h>
using namespace std;
const int N=5001,S=51;
using i64=long long;
struct {
  int n,s;
  i64 t[N],f[N],dp[N][N];//
  void LOL(){
    cin>>n>>s;
    for(int i=1;i<=n;++i) {
      cin>>t[i]>>f[i];
      t[i]+=t[i-1];
      f[i]+=f[i-1];
      fill(dp[i]+2,dp[i]+n+1,0x3f3f3f3f3f3f3f3f); //
      dp[1][i]=f[i]*(t[i]+s);
    }
    auto RM=[&](i64&x,i64 y){
      x>y?x=y:0;
      return;
    };
    int j;
    for(int i=2;i<=n;++i)
      for(int k=2;k<=i;++k){
        int fac=t[i]+1ll*k*s;
        for(j=k-1;j<i-3;j+=4)[&]{
          RM(dp[k][i],dp[k-1][j]+(f[i]-f[j])*fac);
          RM(dp[k][i],dp[k-1][j+1]+(f[i]-f[j+1])*fac);
          RM(dp[k][i],dp[k-1][j+2]+(f[i]-f[j+2])*fac);
          RM(dp[k][i],dp[k-1][j+3]+(f[i]-f[j+3])*fac);
        }();
        for(;j<i;++j)
          RM(dp[k][i],dp[k-1][j]+(f[i]-f[j])*fac);
      }      
    i64 res=0x3f3f3f3f3f3f3f3f;
    for(int i=1;i<=n;++i) res=min(res,dp[i][n]);
    cout<<res<<'\n';
  }
} DNF;
main(){DNF.LOL();}


2024/7/6 23:34
加载中...