题意

给一棵有边权的树,从中选出若干条长度为 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. Nmap基本使用【速查版】

    列举远程机器开放的端口 nmap [域名] 列举远程机器开放的端口和服务 nmap --dns-servers 8.8.8.8 [域名] nmap进行探测之前要把域名通过DNS服务器解析为IP地址,我 ...

  2. Git Commit Message 应该怎么写?

    原文链接: Git Commit Message 应该怎么写? 最近被同事吐槽了,说我代码提交说明写的太差.其实都不用他吐槽,我自己心里也非常清楚.毕竟很多时候犯懒,都是直接一个 -m "f ...

  3. 图与网络分析—R实现(一)

    图与网络 一个网络G,也可以称为图(graph)或网络图,是一种包含了节点V(即网络参与者,也称顶点)与边E(即节点之间的连接关系)的数学结构,记作G={V,E}.可以使用一个矩阵来存放节点之间的连接 ...

  4. java POI创建HSSFWorkbook工作簿

    1. POI Apache POI 是基于 Office Open XML 标准(OOXML)和 Microsoft 的 OLE 2 复合文档格式(OLE2)处理各种文件格式的开源项目. 2. 样式设 ...

  5. react中子组件给父组件传值

    组件间通信:  React中,数据是从上向下流动的,也就是一个父组件可以把它的 state/props通过props传递给它的子组件,但是子组件,不能修改props,如果组件需要修改父组件中的数据,则 ...

  6. Python 项目:外星人入侵--第二部分

    外星人入侵 6.驾驶飞船 玩家左右移动飞船,用户按左或右按键时作出响应. 6.1响应按键 当用户在按键时,在python中注册一个事件,事件都是通过方法pygame.event.get()获取的. 在 ...

  7. Solon 框架,单月下载量超100万了!!!

    Solon 框架,于2023年的四月份突冲100万下载量了.感谢开源的力量,我们同喜同荣!!!Solon 目前,是"可信开源共同体"的新成员,积极参与中科院的"开源之夏& ...

  8. Vue2到Vue3的改变

    一.Vue2->Vue3 如果有Vue2的基础,并在此基础上学习Vue3,并不需要把完整的官网看完,我们只需要关注一下新功能和非兼容的变化即可进行开发. 二.Vue3变化 统一元素上使用的v-i ...

  9. 2023-03-11:给定一个N*M的二维矩阵,只由字符‘O‘、‘X‘、‘S‘、‘E‘组成, ‘O‘表示这个地方是可通行的平地, ‘X‘表示这个地方是不可通行的障碍, ‘S‘表示这个地方有一个士兵,全

    2023-03-11:给定一个N*M的二维矩阵,只由字符'O'.'X'.'S'.'E'组成, 'O'表示这个地方是可通行的平地, 'X'表示这个地方是不可通行的障碍, 'S'表示这个地方有一个士兵,全 ...

  10. 2022-08-19:以下go语言代码输出什么?A:equal;B:not equal;C:不确定。 package main import ( “fmt“ “reflect“ )

    2022-08-19:以下go语言代码输出什么?A:equal:B:not equal:C:不确定. package main import ( "fmt" "refle ...