题意

给一棵有边权的树,从中选出若干条长度为 4 的路径,要求边不交,求最大权值和。

数据范围:\(1\le n\le 2\times 10^5, -10^9\le w\le 10^9\)。

题解

考虑朴素平方做法:设 \(f_{i, 0/1/2/3}\) 表示 \(i\) 的子树内的答案,同时记录 \(i\) 上可能有的一条不完整路径的长度。在每个点处合并儿子,注意到具体谁和谁拼接不太重要,进行一个 DP,记录当前长度为 2 路径的奇偶性,以及长度为 1,3 路径的个数差,就可以做到 \(n^2\)。瓶颈在于长度 1,3 的路径的拼接。

一个结论:数轴上从原点开始随机游走,每次等概率左右移动,最终到达的最远的点到原点的距离期望是根号级别。考虑随机打乱儿子,那么对于最优解的 DP 路径,长度 1,3 路径的个数差始终在儿子个数的平方根的几倍以内的概率非常大,那么我们 DP 数组只开这么大,得到答案多半也是对的。这样,时间复杂度优化为 \(\Theta(n\sqrt{n})\)。

代码

// Author: kyEEcccccc

#include <bits/stdc++.h>

using namespace std;

using LL = long long;
using ULL = unsigned long long; #define F(i, l, r) for (int i = (l); i <= (r); ++i)
#define FF(i, r, l) for (int i = (r); i >= (l); --i)
#define MAX(a, b) ((a) = max(a, b))
#define MIN(a, b) ((a) = min(a, b))
#define SZ(a) ((int)((a).size()) - 1) const int N = 200005, B = 1000; int n;
vector<pair<int, LL>> e[N];
mt19937 ran(chrono::system_clock::now().time_since_epoch().count());
LL f[N][4], g[2][B * 2 + 5][2]; void dp(int u, int par, LL wp)
{
for (auto pi : e[u])
{
if (pi.first == par) continue;
dp(pi.first, u, pi.second);
}
int pre_i = 0, cur_i = 1;
memset(g, 0xc0, sizeof (g));
g[0][B + 1][0] = 0;
for (auto pi : e[u])
{
if (pi.first == par) continue;
int v = pi.first;
F(i, 1, B * 2 + 1) F(t, 0, 1)
{
MAX(g[cur_i][i][t], g[pre_i][i][t ^ 1] + f[v][2]);
MAX(g[cur_i][i][t], g[pre_i][i - 1][t] + f[v][1]);
MAX(g[cur_i][i][t], g[pre_i][i + 1][t] + f[v][3]);
MAX(g[cur_i][i][t], g[pre_i][i][t] + f[v][0]);
}
swap(pre_i, cur_i);
}
MAX(f[u][0], g[pre_i][B + 1][0]);
MAX(f[u][0], g[pre_i][B][0] + wp);
MAX(f[u][1], g[pre_i][B + 1][0] + wp);
MAX(f[u][2], g[pre_i][B + 2][0] + wp);
MAX(f[u][3], g[pre_i][B + 1][1] + wp);
} signed main(void)
{
// freopen(".in", "r", stdin);
// freopen(".out", "w", stdout);
ios::sync_with_stdio(0), cin.tie(nullptr); cin >> n;
F(i, 1, n - 1)
{
int u, v; LL w; cin >> u >> v >> w;
e[u].emplace_back(v, w); e[v].emplace_back(u, w);
}
F(u, 1, n) shuffle(e[u].begin(), e[u].end(), ran);
memset(f, 0xc0, sizeof (f));
dp(1, 0, LLONG_MIN / 2);
cout << f[1][0] << endl; return 0;
}

洛谷 P9047 [PA2021] Poborcy podatkowi的更多相关文章

  1. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  2. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  3. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  4. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP

    题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...

  5. 洛谷P1710 地铁涨价

    P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交  讨论  题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ...

  6. 洛谷P1371 NOI元丹

    P1371 NOI元丹 71通过 394提交 题目提供者洛谷OnlineJudge 标签云端评测 难度普及/提高- 提交  讨论  题解 最新讨论 我觉得不需要讨论O long long 不够 没有取 ...

  7. 洛谷P1538迎春舞会之数字舞蹈

    题目背景 HNSDFZ的同学们为了庆祝春节,准备排练一场舞会. 题目描述 在越来越讲究合作的时代,人们注意的更多的不是个人物的舞姿,而是集体的排列. 为了配合每年的倒计时,同学们决定排出——“数字舞蹈 ...

  8. 洛谷八月月赛Round1凄惨记

    个人背景: 上午9:30放学,然后因为学校举办读书工程跟同学去书城选书,中午回来开始打比赛,下午又回老家,中间抽出一点时间调代码,回家已经8:50了 也许是7月月赛时“连蒙带骗”AK的太幸运然而因同学 ...

  9. 洛谷 P1379 八数码难题 Label:判重&&bfs

    特别声明:紫书上抄来的代码,详见P198 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给 ...

  10. [洛谷OJ] P1114 “非常男女”计划

    洛谷1114 “非常男女”计划 本题地址:http://www.luogu.org/problem/show?pid=1114 题目描述 近来,初一年的XXX小朋友致力于研究班上同学的配对问题(别想太 ...

随机推荐

  1. [JavaScript]使页面内目标关键字高亮

    1 源码 function keywordHighlighten(querySelector, key, bgColor){//文本关键字高亮 var doms = document.querySel ...

  2. 四月八号java基础

    1.复合语句:JAVA语言不允许在两个嵌套的复合语句内声明同样的变量 2.注释:1)单行注释// 2)多行注释/*......*/3)/**......*/文件注释 3.else总是与之最近的if结构 ...

  3. day16:Linux常用命令

    Linux中目录含义 /bin 存放普通用户的命令文件/boot 存放系统启动文件/cdrom 存放读取光盘的相关文件/dev 设备文件 /etc 配置文件/home 家目录/lib 库文件/lib6 ...

  4. 生成df的几种方法

    法一: pd.DataFrame( [ (第一行),(第二行),(第三行)] ) df = pd.DataFrame([('bird', 389.0), ('bird', 24.0), ('mamma ...

  5. 组织树查询-Jvava实现(递归)

    1.首先查询出组织机构 就是一个简单的查询 List<Dept> deptList = mapper.getDeptList(); Map<Long, OrgNode> nod ...

  6. python利用pyinstaller打包简明教程

    转自:https://www.jianshu.com/p/48f6dea265eb pyinstaller简明教程 安装pyinstaller pip install pyinstaller是最简单的 ...

  7. 你还弄不清xxxForCausalLM和xxxForConditionalGeneration吗?

    Part1基本介绍 大语言模型目前一发不可收拾,在使用的时候经常会看到transformers库的踪影,其中xxxCausalLM和xxxForConditionalGeneration会经常出现在我 ...

  8. 笔记八:linux系统编程之IO

    笔记:linux系统编程之IO 应用层     内核层     硬件层 应用层:数据结构 .java.android.C.C++,C#: l inux高级编程:涉及内核为应用层提供接口函数: 内核五大 ...

  9. 【Ubuntu】2. 安装Ubuntu操作系统+VMware Tools

    接上一篇,这一部分介绍了操作系统的安装 开启虚拟机,首先由四个选项,选第一个正常安装即可,这里稍等片刻就可以进入安装选项 到了这一步的话可以在左侧设置系统语言,我的英语比较垃圾就选中文了,选择完之后点 ...

  10. pandas 常用操作记录

    apply函数 一个非常灵活的函数,能够对整个DataFrame或者Series执行给定函数的操作. 函数可以是自定义的,也可以是python或者pandas内置的函数,还可以是匿名函数. 作用: 用 ...