Problem Link

给定 \(n,m\) 和一个长为 \(m\) 的代价序列,对于一棵 \(n\) 个节点,每个节点度数不超过 \(m\) 的树,定义它的代价为 \(\sum\limits_{i=1}^n a_{deg_i}\)。求代价最小的树的代价。

\(n\le 10^9,m\le 3000,1\le a_i\le 10^9\)。


首先一眼变成选出 \(n\) 个 \(a\) 的和为 \(2n+2\)。经典的背包问题,价值值域和物品数都很大,但是体积值域很小,并且最终要求体积和是一个定值。

套路:如果 \(n\) 是偶数,那么对于任意一种方案,可以将选出的 \(n\) 个物品分成两部分,使得两部分体积之差的绝对值不超过 \(m\)。

证明:滑动窗口,从左滑到右,差的符号改变了,而每次改变量是 \(a_i-a_j\),所以一定存在一个时刻差的绝对值不超过 \(m\)。

于是当 \(n\) 是偶数时,定义 \(\mathrm{solve}(n,L,R)\) 表示解决 \(n\) 个物品,对于要求总体积在 \([L,R]\) 之间的情况求解,那么可以递归到 \(\mathrm{solve}(n/2,(L-m)/2,(R+m)/2)\) 来做,然后自己和自己合并。一共 \(\log\) 层,每层长度至多增加 \(m\),所以复杂度可以接受。

当 \(n\) 是奇数时,直接拎出最后一个数枚举,递归到 \(n-1\)。

计算时间复杂度。发现每次区间长度会 \(+m\) 然后 \(/2\),所以每一层加的 \(m\) 会在后面以 \(m,m/2,m/4,\dots\) 分布,即每层被加的 \(m\) 是从上面来的 \(m,m/2,m/4,\dots\),总和为 \(O(m)\)。所以总时间复杂度为 \(O(m^2\log n)\)。

点击查看代码
// https://dmoj.ca/problem/dmopc21c8p5
//~ #define _GLIBCXX_DEBUG
#include <bits/stdc++.h>
#define For(i,a,b) for(int i=a;i<=b;i++)
#define Rev(i,a,b) for(int i=a;i>=b;i--)
#define Fin(file) freopen(file,"r",stdin);
#define Fout(file) freopen(file,"w",stdout);
using namespace std;
const int N=3e3+5; using ll = long long;
int m,a[N];
vector<ll> solve(int n,int L,int R){
//~ printf("solve(%d,%d,%d)\n",n,L,R);
vector<ll> res(R-L+1,1e18);
if(n==1) For(i,L,R) res[i-L]=1<=i&&i<=m?a[i]:1e18;
else if(n&1){
int l=max(L-m,1); vector<ll> vec=solve(n-1,l,R);
For(j,l,R) For(k,max(j+1,L),min(j+m,R)) res[k-L]=min(res[k-L],vec[j-l]+a[k-j]);
}
else{
int l=max((L-m)/2,1),r=(R+m)/2; vector<ll> vec=solve(n/2,l,r);
For(j,l,r) For(k,max(l,L-j),min(r,R-j)) res[j+k-L]=min(res[j+k-L],vec[j-l]+vec[k-l]);
}
return res;
}
int main(){
int n; cin>>n>>m; For(i,1,m) cin>>a[i];
cout<<solve(n,2*n-2,2*n-2)[0]<<'\n';
return 0;
}

【DP】DMOPC '21 Contest 8 P5 - Tree Building的更多相关文章

  1. HDOJ 1159 Common Subsequence【DP】

    HDOJ 1159 Common Subsequence[DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...

  2. 【MySQL】-NO.21.MySQL.1.MySQL.1.001-【Install MySQL5.7 On Windows】

    1.0.0 Summary Tittle:[MySQL]-NO.21.MySQL.1.MySQL.1.001-[Install MySQL5.7 On Windows] Style:Web Serie ...

  3. Kattis - honey【DP】

    Kattis - honey[DP] 题意 有一只蜜蜂,在它的蜂房当中,蜂房是正六边形的,然后它要出去,但是它只能走N步,第N步的时候要回到起点,给出N, 求方案总数 思路 用DP 因为N == 14 ...

  4. HDOJ 1423 Greatest Common Increasing Subsequence 【DP】【最长公共上升子序列】

    HDOJ 1423 Greatest Common Increasing Subsequence [DP][最长公共上升子序列] Time Limit: 2000/1000 MS (Java/Othe ...

  5. HDOJ 1501 Zipper 【DP】【DFS+剪枝】

    HDOJ 1501 Zipper [DP][DFS+剪枝] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...

  6. HDOJ 1257 最少拦截系统 【DP】

    HDOJ 1257 最少拦截系统 [DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...

  7. HDOJ_1087_Super Jumping! Jumping! Jumping! 【DP】

    HDOJ_1087_Super Jumping! Jumping! Jumping! [DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...

  8. POJ_2533 Longest Ordered Subsequence【DP】【最长上升子序列】

    POJ_2533 Longest Ordered Subsequence[DP][最长递增子序列] Longest Ordered Subsequence Time Limit: 2000MS Mem ...

  9. HackerRank - common-child【DP】

    HackerRank - common-child[DP] 题意 给出两串长度相等的字符串,找出他们的最长公共子序列e 思路 字符串版的LCS AC代码 #include <iostream&g ...

  10. LeetCode:零钱兑换【322】【DP】

    LeetCode:零钱兑换[322][DP] 题目描述 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成 ...

随机推荐

  1. 华为云UGO正式公测:4大核心优势破解异构数据库迁移难题

    摘要:华为云数据库推出了数据库和应用迁移 UGO(Database and Application Migration UGO,简称为UGO),是专注于异构数据库对象迁移和应用迁移的专业化工具,帮助用 ...

  2. 实例讲解FusionInsight MRS RTD 实时决策引擎在医保行业应用

    摘要: 通过引入FusionInsight RTD实时决策系统,实现医保费用事前预防.事中控制.事后审核的全流程管理 本文分享自华为云社区<FusionInsight MRS RTD 实时决策引 ...

  3. vue2升级vue3:vue3创建全局属性和方法

    vue2.x挂载全局是使用Vue.prototype.$xxxx=xxx的形式来挂载,然后通过this.$xxx来获取挂载到全局的变量或者方法 在vue3.x这种方法显然是不行了,vue3中在setu ...

  4. 最新的iOS应用上架App Store详细流程解析

    最新的iOS应用上架App Store详细流程解析 2023已经过了2/3的时间,由于现在苹果签名市场的价格不断的上升,现在很多的开发商一直在想着如何进行上架一些自己的产品,下面小编来给大家梳理一下上 ...

  5. Axure 多人协作

    创建团队项目 团队 => 从当前文件创建团队项目 签出的文件才能被修改 签出 签入 发布评论 邀请 编辑的5种状态 和SVN差不多的概念 已有项目导入 https://www.bilibili. ...

  6. django实现微信公众号扫码登录

    首先是去获取access_token,access_token接口有次数限制,所以保存到缓存,失效时再去调用接口 import base64 import json import time impor ...

  7. vivo 悟空活动中台 - 栅格布局方案

    本文首发于 vivo互联网技术 微信公众号 链接: https://mp.weixin.qq.com/s/6O0CH0U_WE1YkPK75m-jDQ作者:悟空中台研发团队 一.背景 今天来给大家分享 ...

  8. java编译期和运行期和string原理

     编译期:   是指把源码交给编译器编译成计算机可以执行的文件的过程.在Java中也就是把Java代码编成class文件的过程.编译期只是做了一些翻译功能,并没有把代码放在内存中运行起来,而只是把代码 ...

  9. java对excle操作:下载、上传以及上传中错误数据动态生成excle给用户下载

    工作中经常遇到excle文件的上传下载,这里就总结一下相关的操作,尤其是最后一个方法"上传excle文件校验数据格式,挑出格式错误的数据"网上没有找到相关的例子,自己组合改写了一下 ...

  10. 使用 Woodpecker 与 Gitea 搭建纯开源的 CI 流程|极限降本

    最近开源了一个挂机冒险游戏<模拟龙生>,有热心同学不仅帮忙做优化,还连夜在给游戏加页面,泪目.详见文末小结部分. 一.前言 大家好,这里是白泽.这篇文章是<Woodpecker CI ...