【DP】DMOPC '21 Contest 8 P5 - Tree Building
给定 \(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的更多相关文章
- HDOJ 1159 Common Subsequence【DP】
HDOJ 1159 Common Subsequence[DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...
- 【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 ...
- Kattis - honey【DP】
Kattis - honey[DP] 题意 有一只蜜蜂,在它的蜂房当中,蜂房是正六边形的,然后它要出去,但是它只能走N步,第N步的时候要回到起点,给出N, 求方案总数 思路 用DP 因为N == 14 ...
- HDOJ 1423 Greatest Common Increasing Subsequence 【DP】【最长公共上升子序列】
HDOJ 1423 Greatest Common Increasing Subsequence [DP][最长公共上升子序列] Time Limit: 2000/1000 MS (Java/Othe ...
- HDOJ 1501 Zipper 【DP】【DFS+剪枝】
HDOJ 1501 Zipper [DP][DFS+剪枝] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- HDOJ 1257 最少拦截系统 【DP】
HDOJ 1257 最少拦截系统 [DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- HDOJ_1087_Super Jumping! Jumping! Jumping! 【DP】
HDOJ_1087_Super Jumping! Jumping! Jumping! [DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...
- POJ_2533 Longest Ordered Subsequence【DP】【最长上升子序列】
POJ_2533 Longest Ordered Subsequence[DP][最长递增子序列] Longest Ordered Subsequence Time Limit: 2000MS Mem ...
- HackerRank - common-child【DP】
HackerRank - common-child[DP] 题意 给出两串长度相等的字符串,找出他们的最长公共子序列e 思路 字符串版的LCS AC代码 #include <iostream&g ...
- LeetCode:零钱兑换【322】【DP】
LeetCode:零钱兑换[322][DP] 题目描述 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成 ...
随机推荐
- 云小课 | MRS基础入门之HDFS组件介绍
摘要:HDFS是MapReduce服务中的基础文件系统,全称为Hadoop的分布式文件系统(Hadoop Distributed File System),可支持实现大规模数据可靠的分布式读写. 本文 ...
- 高并发中,那些不得不说的线程池与ThreadPoolExecutor类
摘要:从整体上认识下线程池中最核心的类之一--ThreadPoolExecutor,关于ThreadPoolExecutor的底层原理和源码实现,以及线程池中的其他技术细节的底层原理和源码实现. 本文 ...
- 线上活动 | AI 头像变装秀
宝子们,你的头像多久没换了? 送你一个锦囊,让你拥有既独一无二,又千变万化的专属 AI 头像 Hugging Face 将在 7 月 5 日 发起:AI 头像变装秀 ️️️游戏规则️️️ 我们将分享 ...
- 使用formdata在vue和django之间传递文件
在前端页面中如果有文件或者图片需要上传的场景下,通用做法是使用formdata将文件从前端传输到后台,在后台上传文件并将url保存在数据库. 当前项目是使用vue + Element UI + dja ...
- Codeforces Round #650 (Div. 3) F1经典离散化DP
比赛链接:Here 1367A. Short Substrings Description 一个字符串 abac,然后把所有长度为2的子串加起来变成新串,abbaac,由 ab ba ac组成.现在给 ...
- 【AcWing】第6场周赛 B题 3734. 求和 (思维)
AcWing 3734. 求和 其实这道题并不难,只是思维性很强! 因为 \(a\) 的各个数位不包含除了 \(4\) 和 \(7\) 以外的其他数字. 仔细观察数据会发现因为 \(1\le l \ ...
- KCD技术分享:以SBOM为基础的云原生应用安全治理
随着越来越多的企业和组织将他们的应用迁移到云上,云原生技术的应用部署和管理正在变得更加灵活和高效,但也相应地引入了一些新的安全风险.2023年4月15日,由云原生计算基金会(CNCF)发起,全球各国当 ...
- Feign 实现微服务调用及进行服务熔断与降级
本文为博主原创,未经允许不得转载: 1. Feign 日志级别配置 2. Feign client 封装调用 3. Feign 定义熔断降级方法 4. 通过 FallbackFactory 工厂 实现 ...
- Blazor模式讲解
Blazor的三种模式 Blazor Server: Blazor Server在 ASP.NET Core 应用中支持在服务器上托管 Razor 组件. 可通过 SignalR 连接处理 UI 更新 ...
- c#(nanoframework)安装单片机环境;如何使用c#写类似于c的单片机驱动
.NET nanoFramework 安装教程 准备材料 esp32单片机(支持wifi蓝牙) 安卓数据线(需要支持传输) 注意!请先安装esp32驱动程序 ESP32驱动链接 安装 .NET n ...