博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BZOJ5252】林克卡特树(动态规划,凸优化)
阅读量:5255 次
发布时间:2019-06-14

本文共 1189 字,大约阅读时间需要 3 分钟。

【BZOJ5252】林克卡特树(动态规划,凸优化)

题面

题解

这个东西显然是随着断开的越来越多,收益增长速度渐渐放慢。

所以可以凸优化。
考虑一个和\(k\)相关的\(dp\)
这个题目可以转换为在树上选择\(K\)条不相交的路径。
\(f[i][0/1/2]\)表示当前点\(i\),这个点不和父亲连/和父亲连/在这里将两条链合并的最优值。
再记一维\(k\),表示子树中已经选了\(k\)条链。
这样子可以直接转移。
那么凸优化\(dp\),再额外记录一下最优解的链的最小值,就好了。

#include
#include
#include
#include
#include
#include
using namespace std;#define ll long long#define MAX 300300inline int read(){ int x=0;bool t=false;char ch=getchar(); while((ch<'0'||ch>'9')&&ch!='-')ch=getchar(); if(ch=='-')t=true,ch=getchar(); while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar(); return t?-x:x;}struct Line{int v,next,w;}e[MAX<<1];int h[MAX],cnt=1;inline void Add(int u,int v,int w){e[cnt]=(Line){v,h[u],w};h[u]=cnt++;}ll sum;int n,K;struct Node{ll x;int y;}f[3][MAX],ans;bool operator<(Node a,Node b){if(a.x!=b.x)return a.x
b.y;}Node operator+(Node a,Node b){return (Node){a.x+b.x,a.y+b.y};}void cmax(Node &a,Node b){a=a
>1; ans=(Node){-1ll<<60,0};dfs(1,0,mid); if(ans.y>K)l=mid+1; else r=mid; } ans=(Node){-1ll<<60,0};dfs(1,0,r); printf("%lld\n",r*K+ans.x); return 0;}

转载于:https://www.cnblogs.com/cjyyb/p/9428690.html

你可能感兴趣的文章
Andriod串口通信开发(免ROOT权限)
查看>>
硬币表示
查看>>
[转载] Discovery——蛇之美
查看>>
[转载] 杜拉拉升职记——28 空手套白狼
查看>>
微服务网关从零搭建——(五)修改网关身份验证指定部分
查看>>
poj 3264 Balanced Lineup(线段数求区间最大最小值)
查看>>
php中读写excel表格文件示例。
查看>>
Newtonsoft.Json2.0下面序列化和反序列化
查看>>
最经典的常用拍照姿势大全,顶级POSE
查看>>
五种常见的ASP.NET安全缺陷
查看>>
上周热点回顾(3.5-3.11)
查看>>
正确的糟糕选择——搬入阿里云1年感言
查看>>
microPython 的逗比报错的问题
查看>>
Lambda表达式补充
查看>>
JAVA设计模式
查看>>
1002. A+B for Polynomials (25)
查看>>
Dynamics AX 2012 R2 电子邮件广播错误 0x80040213
查看>>
python getopt.getopt(args,shortopts, longopts=[]) &&sys.argv[]
查看>>
浅谈装饰者模式+JAVA I/O中的装饰者模式
查看>>
VS配置
查看>>