4383 [八省联考 2018] 林克卡特树(WQS 二分+DP)

P4383 [八省联考 2018] 林克卡特树

给定一颗 \(n\) 个点的树,每条边有边权 \(v(|v|\le 10^6)\),要求删去其中任意 \(k\) 条边,使得剩余联通块的直径之和最大。求出这个最大值。

\(0\le k<n\le 3\times 10^5,10s,1GB\)

问题是怎么求直径?!直径不就是最大的链吗?!

发现原问题等价于选择 \(k+1\) 条互不相交的链使得链的总价值最大。

\(dp_{i,j,0/1/2}\) 表示到 \(i\) 子树,已经选择了 \(j\) 条链,当前根上的选择情况分别为当前根不和父亲合并、向下连接一条链、向下连接形成两条链的情况时最大收益。

在加入一棵子树的时候合并答案:

\[dp_{u,2}=\max(dp_{u,2}+dp_{v,0},dp_{u,1}+dp_{v,1}+edg-e)\\ dp_{u,1}=\max(dp_{u,1}+dp_{v,0},dp_{u,0}+dp_{v,1}+edg)\\ dp_{u,0}=dp_{u,0}+dp_{v,0} \]

在出子树的时候将 \(dp_{x,1},dp_{x,2}\) 都合并到 \(dp_{x,0}\) 表示 \(x\) 不和父亲合并的情况。

那么这样可以 \(\mathcal{O(nk)}\) 转移。

看题解,可以了解到这个状态和 \(k\) 的关系是:随 \(k\) 增大,答案先增大后减小。

马后炮 yy 一下发现其实比较容易感性理解,太小了就没得选大边,太大了就不得不因为链不能重合舍弃大边。

那么在这个以选择链的数量为横坐标,当前最大收益为纵坐标的二维 DP 上,我们要得出以 \(k\) 为横坐标的点的答案。

如果我们直接去掉上面 DP 的 \(j\) 一维,我们能够得到对于所有 \(k\) 的收益最大值,可以通过二分斜率来找到 \(k\) 的值。

二分选择一条链的额外代价,去掉 DP 中“已经选择了几条链”的那一维,直接记录选择链的最大权值之和。同时需要维护一个计数器数组和 DP 一起转移统计已经选择了多少条链。

那么如果选择的链多了就增大选择一条链的额外代价,否则减少,知道刚好等于 \(k\),那么最终权值就是 \(val+k\times e\),其中 \(e\) 是额外代价。

这样最终求出的最大值加上 \(e\times k\) 就是答案了。

其中有几个地方需要注意:

  • 二分时,如果答案选择的链的数量 \(\ge k\) 则更新 \(ans\),因为链的数量为 \(n\) 总是能够取到,而数量极少则不一定能取到。
  • 横坐标为 \(k\) 的点可能和 \(k-1,k+1\) 构成直线,不一定能够准确二分到 \(k\),所以最终答案要加上\(e\times k\) 而不是当前选择链的条数。
  • 二分的值域要到 \([-n\times 10^6,n\times 10^6]\)
#define Maxn 300005
#define int long long
int n,k,tot,curmuti;
int hea[Maxn],nex[Maxn<<1],ver[Maxn<<1],edg[Maxn<<1];
struct NODE
{int val,hav;NODE(int _val=0,int _hav=0):val(_val),hav(_hav){};inline bool friend operator < (NODE x,NODE y){ return (x.val!=y.val)?x.val<y.val:x.hav<y.hav; }inline NODE friend operator + (NODE x,NODE y){ return NODE(x.val+y.val,x.hav+y.hav); }
};
NODE dp[Maxn][3];
inline void add(int x,int y,int d){ ver[++tot]=y,nex[tot]=hea[x],hea[x]=tot,edg[tot]=d; }
void dfs(int x,int fa)
{dp[x][2]=max(dp[x][2],NODE(-curmuti,1));for(int i=hea[x];i;i=nex[i]) if(ver[i]!=fa){dfs(ver[i],x);dp[x][2]=max(dp[x][2]+dp[ver[i]][0],dp[x][1]+dp[ver[i]][1]+NODE(edg[i]-curmuti,1));dp[x][1]=max(dp[x][1]+dp[ver[i]][0],dp[x][0]+dp[ver[i]][1]+NODE(edg[i],0));dp[x][0]=dp[x][0]+dp[ver[i]][0];}dp[x][0]=max(dp[x][0],max(dp[x][1]+NODE(-curmuti,1),dp[x][2]));
}
signed main()
{n=rd(),k=rd()+1;for(int i=1,x,y,d;i<n;i++) x=rd(),y=rd(),d=rd(),add(x,y,d),add(y,x,d);int nl=-n*1000000,nr=n*1000000,ret=0;while(nl<=nr){int mid=(nl+nr)>>1;memset(dp,0,sizeof(dp)),curmuti=mid,dfs(1,0);if(dp[1][0].hav>=k) ret=mid,nl=mid+1;else nr=mid-1;}memset(dp,0,sizeof(dp)),curmuti=ret,dfs(1,0);printf("%lld\n",dp[1][0].val+ret*k);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317803.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P1742 最小圆覆盖

P1742 最小圆覆盖 题意&#xff1a; 给出N个点&#xff0c;让你画一个最小的包含所有点的圆。 题解&#xff1a; 先说结论&#xff1a; 最优解的圆一定是在以某两个点连线为直径的圆 或者 某三个点组成的三角形的外接圆 初始化将某个圆心定为第一个点&#xff0c;R0 枚举第…

Java实现非对称加密【详解】

Java实现非对称加密 1. 简介2. 非对称加密算法--DH&#xff08;密钥交换&#xff09;3. 非对称加密算法--RSA非对称加密算法--EIGamal5. 总结6 案例6.1 案例16.2 案例26.3 案例3 1. 简介 公开密钥密码学&#xff08;英语&#xff1a;Public-key cryptography&#xff09;也称非…

轻量级.Net Core服务注册工具CodeDi发布啦

为什么做这么一个工具因为我们的系统往往时面向接口编程的,所以在开发Asp .net core项目的时候,一定会有大量大接口及其对应的实现要在ConfigureService注册到ServiceCollection中,传统的做法是加了一个服务,我们就要注册一次(service.AddService()),又比如,当一个接口有多个实…

2020 CSP-S 游记

迟到的游记总述T1&#xff1a;儒略日T2&#xff1a;动物园T3&#xff1a;函数调用T4&#xff1a;贪吃蛇总结总述 可能是有了去年第一次的狂炸经历&#xff0c;很明显的就是在考试策略上的提升 头不铁了&#xff0c;手不残了&#xff0c;心态稳了&#xff0c;分也多了 T1&…

NOIP2018洛谷P5021:修建赛道

没有证明的贪心就是乱搞 解析 把标签写在题面上的一道题… 显然要二分答案然后看能不能分出来m个 关键策略是每个结点内部尽可能的多匹配的前提下&#xff0c;给父亲传一个最大的 这不纪念品分组&#xff1f; 然后我就无脑的敲了个双指针的贪心上去 然后就WA掉了qwq &#xf…

Weird Flecks, But OK

Weird Flecks, But OK 题意&#xff1a; 给出三维坐标中的 n 个点&#xff0c;求一个圆柱的最小直径&#xff0c;该圆柱垂直于坐标平面且能覆盖住所有点 题解&#xff1a; 本人最不擅长计算几何&#xff0c;比赛时没做出来。。。 其实就是将n个点投影到三个坐标平面&#x…

P7516-[省选联考2021A/B卷]图函数【bfs】

正题 题目链接:https://www.luogu.com.cn/problem/P7516 题目大意 懒了&#xff0c;直接抄题意了 对于一张 nnn 个点 mmm 条边的有向图 GGG&#xff08;顶点从 1∼n1 \sim n1∼n 编号&#xff09;&#xff0c;定义函数 f(u,G)f(u, G)f(u,G)&#xff1a; 初始化返回值 cnt0cn…

NOIP2022 游记

开个坑&#xff0c;希望能填上

【.NET Core项目实战-统一认证平台】第十三章 授权篇-如何强制有效令牌过期

上一篇我介绍了JWT的生成验证及流程内容&#xff0c;相信大家也对JWT非常熟悉了&#xff0c;今天将从一个小众的需求出发&#xff0c;介绍如何强制令牌过期的思路和实现过程。.netcore项目实战交流群&#xff08;637326624&#xff09;&#xff0c;有兴趣的朋友可以在群里交流讨…

[2020-11-24 contest]糖果机器(二维偏序),手套(状压dp),甲虫(区间dp),选举(线段树 最大子段和)

文章目录T1&#xff1a;糖果机器solutioncodeT2&#xff1a;手套solutioncodeT3&#xff1a;甲虫solutioncodeT4&#xff1a;选举solutioncodeT1&#xff1a;糖果机器 solution 考虑从第iii个糖果出发能到达第jjj个&#xff0c;则有Tj−Ti≥∣Sj−Si∣T_j-T_i≥|S_j-S_i|Tj​…

模板:树上启发式合并(dsu on tree)

文章目录解析step1&#xff1a;树剖step2&#xff1a;求出轻儿子的答案&#xff08;不继承&#xff09;step3&#xff1a;求出重儿子的答案&#xff08;继承&#xff09;step4&#xff1a;加入自己的答案、合并轻儿子的答案并记录答案step5&#xff1a;清空复杂度分析代码所谓树…

New Maths

New Maths 题意&#xff1a; 定义一个不进位的乘法运算 ⊗&#xff0c;先给出一个n&#xff0c;判断是否存在a&#xff0c;满足a ⊗ a n n的长度最多是25 题解&#xff1a; 17 * 17正常等于289 17 ⊗ 17 149 如果a的长度为x&#xff0c;那么最后得到的n的长度len是2x-1 倒…

CF827F-Dirty Arkady‘s Kitchen【堆】

正题 题目链接:https://www.luogu.com.cn/problem/CF827F 题目大意 给出nnn个点mmm条边的一张无向图&#xff0c;每条边只有在时刻[li,ri)[l_i,r_i)[li​,ri​)时候才能通过&#xff0c;且通过时间为111&#xff0c;你不能在一个点处停留&#xff0c;求111走到nnn的最短时间。…

linux一些好用的命令和快捷键

以后知道了再加吧 ctrl-alt-T&#xff1a;yjx之殇 快捷键 ctrl-x h&#xff1a;全选 ctrl-x 3&#xff1a;左右分栏 ctrl-x 1&#xff1a;还原1栏 ctrl-s&#xff1a;查找 alt-%&#xff1a;替换 配置 ctrl-xctrl-f :~/.emacs: (global-set-key (kbd “C-a”) mark-whole-buffe…

ASP.NET Core 数据加解密的一些坑

点击蓝字关注我ASP.NET Core 给我们提供了自带的Data Protection机制&#xff0c;用于敏感数据加解密&#xff0c;带来方便的同时也有一些限制可能引发问题&#xff0c;这几天我就被狠狠爆了一把我的场景我的博客系统有个发送邮件通知的功能&#xff0c;因此需要配置一个邮箱账…

[2020-11-28 contest]素数(数学),精灵(区间dp),农夫约的假期(结论),观察(树链剖分lca+set)

文章目录素数solutioncode精灵solutioncode农夫约的假期solutioncode观察solutionsolutioncode素数 solution 通过观察可得一个结论 对于两个相邻的质数p1,p2(p1<p2)p_1,p_2\ (p_1<p_2)p1​,p2​ (p1​<p2​) 对于x∈[p1,p2)x∈[p_1,p_2)x∈[p1​,p2​)&#xff0c;都…

B. Box Fitting

B. Box Fitting 题意&#xff1a; 现在有n个长方形&#xff0c;宽均为1&#xff0c;现在有一个底为m的容器&#xff0c;问将长方形放入其中&#xff0c;所用容器的最小宽度是多少 &#xff08;长方形必须长朝下放置详细如图&#xff09; 题解&#xff1a; 比赛时脑子抽了。…

AT2371-[AGC013E]Placing Squares【矩阵乘法】

正题 题目链接:https://www.luogu.com.cn/problem/AT2371 题目大意 给出nnn和mmm个数bbb。 求所有满足以下要求的序列aaa 和为nnn对于所有bib_ibi​不存在任何一个前缀和为bib_ibi​。 一个序列的贡献为所有数的二次方和&#xff0c;求所有合法序列的贡献。 1≤n≤109,1≤m…

博客搬迁通知

地址 CSDN 上所有博客由于更新困难的问题&#xff0c;已经全部搬迁到 我的博客园&#xff0c;如果您发现博客有许多缺失部分&#xff0c;请到 cnblogs 上查看&#xff0c;谢谢&#xff01;

洛谷P1074:靶形数独(搜索、剪枝)

解析 搜索题都是玄学 本题暴搜人人都会写&#xff0c;关键是如何剪枝 我一直在最优性剪枝上纠结qwq 但仔细想想&#xff0c;不同方案的权值差别没有那么大 再加上剪枝时不可避免的要放弃一些准确度 所以最优性剪枝在本题可能确实没有太大的作用 考虑我们平时如何玩数独 肯定是…