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. 政企上云网络适配复杂,看华为云Stack有妙招

    摘要:政企数据中心部署云资源池后,网络架构变得复杂,如何在数据中心内无缝集成云资源池.如何协同云上业务和云下传统业务的互通.如何解决云上业务的安全合规等新问题出现. 本文分享自华为云社区<[华为 ...

  2. 边缘AI方案落地问题探讨

    摘要:本文介绍了如何兑现边缘AI带来好处的承诺,并针对边缘AI落地和商业闭环发起的开源社区工作. 本文分享自华为云社区<华为云:边缘AI方案落地问题探讨及调研>,作者: 华为云边缘云创新实 ...

  3. 总结MySQL 的一些知识点:MySQL 插入数据

    MySQL 插入数据 MySQL 表中使用INSERT INTOSQL语句来插入数据. 你可以通过 mysql> 命令提示窗口中向数据表中插入数据,或者通过PHP脚本来插入数据. 语法 以下为向 ...

  4. 火山引擎 DataTester 首推 A/B 实验经验库,帮助企业高效优化实验设计能力

      更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 近日,火山引擎 DataTester 推出了重要功能--A/B 实验经验库. 基于在字节跳动已完成 150 万 ...

  5. Solon2 接口开发: 实战 Gateway 模式效果

    1.效果预览 网关 @Mapping("/api/v3/app/**") @Component public class ApiGateway3x extends UapiGate ...

  6. .NET Core 在其上下文中,该请求的地址无效。

    .NET Core 在其上下文中,该请求的地址无效. 看了端口,发现没被占用,后来发现是IP地址变了 改成正确的IP就可以了.

  7. Docker cp 将宿主机上的文件复制到容器中

    [root@localhost ~]# docker cp /opt/web/docker_cp.txt tomcat9093:/usr/local/apache-tomcat-9.0.31/ [ro ...

  8. Java 网络编程 —— 异步通道和异步运算结果

    从 JDK7 开始,引入了表示异步通道的 AsynchronousSockerChannel 类和 AsynchronousServerSocketChannel 类,这两个类的作用与 SocketC ...

  9. flask 上传文件,视图

    记得有template ''' 导入flask类.该类的实例将会成为我们的wsgi应用 __name__是一个适用于大多数情况的快捷方式,有了这个参数,flask才能知道在那里找到模板和静态文件等东西 ...

  10. 彻底干掉了Windows的cmd,一个字:爽!

    彻底干掉了Windows的cmd,一个字:爽! 先说一句:Windows下的 cmd 就是垃圾! 习惯了Ubuntu和Mac的Terminal,再去用Windows的 cmd 简直难以忍受. 今天就向 ...