萌新 分治求助
  • 板块CF1442D Sum
  • 楼主_Zyi
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/1/17 20:23
  • 上次更新2025/1/18 09:00:12
查看原帖
萌新 分治求助
734994
_Zyi楼主2025/1/17 20:23

WA on test 35,样例全过qwq

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 3e3 + 10;

int n, k, ans;
int a[N][N], f[N][N], use[N][N]; //a[i][0]记录数组长度,a[i][最后一位]记录数组元素总和

void dfs(int l, int r, int p = 1){
  if(l == r){
    int res = f[p][k];
    if(k > use[p][k]) res += a[l][min(a[l][0],k - use[p][k])];
    ans = max(ans, res);
    return;
  }

  int mid = (l + r) >> 1;

  memcpy(f[p + 1], f[p], sizeof(f[p + 1]));
  memcpy(use[p + 1], use[p], sizeof(use[p + 1]));
  for(int i = l; i <= mid; i ++)
    for(int j = k; j >= a[i][0]; j --)
      if(f[p + 1][j - a[i][0]] + a[i][a[i][0]] > f[p + 1][j]){
        f[p + 1][j] = f[p + 1][j - a[i][0]] + a[i][a[i][0]];
        use[p + 1][j] = use[p + 1][j - a[i][0]] + a[i][0];
      }
  dfs(mid + 1, r, p + 1);

  memcpy(f[p + 1], f[p], sizeof(f[p + 1]));
  memcpy(use[p + 1], use[p], sizeof(use[p + 1]));
  for(int i = mid + 1; i <= r; i ++)
    for(int j = k; j >= a[i][0]; j --)
      if(f[p + 1][j - a[i][0]] + a[i][a[i][0]] > f[p + 1][j]){
        f[p + 1][j] = f[p + 1][j - a[i][0]] + a[i][a[i][0]];
        use[p + 1][j] = use[p + 1][j - a[i][0]] + a[i][0];
      }
  dfs(l, mid, p + 1);
}

signed main(){
  ios::sync_with_stdio(false), cin.tie(0);
  cin>>n>>k;
  for(int i = 1; i <= n; i ++){
    cin>>a[i][0];
    for(int j = 1; j <= a[i][0]; j ++){
      cin>>a[i][j];
      if(j > 1) a[i][j] += a[i][j - 1];
    }
  }
  dfs(1, n);
  cout<<ans<<"\n";

  return 0;
}
2025/1/17 20:23
加载中...