20250221

T1

穿越

考虑从叶子向上贪心,每个点实际上可以选择一个子树中的点扩展完上来,再选择一个子树中的点下去。所以每个点开一个可并堆维护这个点的所有决策,然后每个点先把儿子的合并上来再选两个最优的决策去做。实际上 set 启发式合并也可以过。

代码
#include <iostream>
#include <set>
#define int long long
using namespace std;
int n;
int a[300005];
int head[300005], nxt[600005], to[600005], ecnt;
inline void add(int u, int v) { to[++ecnt] = v, nxt[ecnt] = head[u], head[u] = ecnt; }
multiset<pair<int, int>, greater<pair<int, int> > > st[300005];
int f[300005];
void Merge(multiset<pair<int, int>, greater<pair<int, int> > > &a, multiset<pair<int, int>, greater<pair<int, int> > > &b) {if (a.size() > b.size()) swap(a, b);for (auto v : a) b.insert(v);
}
void dfs(int x, int fa) {int cs = 0;for (int i = head[x]; i; i = nxt[i]) {int v = to[i];if (v != fa) {++cs;dfs(v, x);st[x].insert(make_pair(f[v], v));}}for (int i = 1; i <= 2 && st[x].size(); i++) {pair<int, int> p = *st[x].begin();f[x] += p.first;st[x].erase(st[x].begin());Merge(st[p.second], st[x]);}f[x] += a[x];
}
signed main() {freopen("travel.in", "r", stdin);freopen("travel.out", "w", stdout);cin >> n;for (int i = 1; i <= n; i++) cin >> a[i];for (int i = 1; i < n; i++) {int u, v;cin >> u >> v;++u, ++v;add(u, v);add(v, u);}dfs(1, 0);cout << f[1] << "\n";return 0;
}

T2

树上水题

考虑如果只能选子树,则容易 \(n^2\) 做。希望尽量简单一点,可以选取重心作为根,这样如果点集的 LCA 不是根,则选的就一定是子树而不是外子树。于是只需要考虑点集的 LCA 不为根的情况,这个时候选的一定是整棵树去掉根的一棵子树形成的连通块。考虑对于每个 \(x\) 计算答案 \(\ge x\) 的方案数,答案就是所有方案数加起来。如果答案 \(\ge x\),则所有子树大小 \(\ge n - x + 1\) 的子树当中都至少需要选择一个点。考虑所有符合要求的极小子树,这些子树两两不交。我们考虑对着这个东西容斥,钦定一些极小子树不选。设所有极小子树的大小构成多重集 \(A\),则答案 \(ans = \sum\limits_{S \subseteq A}(-1)^{|S|}\binom{n - \sum\limits_{x \in A} x}{k}\)。考虑对于每个上面那个东西求出容斥系数的总和,然后对于每个 \(k\) 统一算答案。这个容易背包求出。然后随着 \(x\) 的增加,\(A\) 里东西的变化总次数是 \(\mathcal{O}(n)\) 级别,可以直接暴力更新背包。于是做完了,总复杂度 \(\mathcal{O}(n^2)\)

代码
#include <iostream>
#include <vector>
#include <array>
#define int long long
using namespace std;
const int P = 998244353;
inline void Madd(int &x, int y) { (x += y) >= P ? (x -= P) : 0; }
int fac[20005], ifac[20005], inv[20005];
void Cpre(int n) {fac[0] = fac[1] = ifac[0] = ifac[1] = inv[0] = inv[1] = 1;for (int i = 2; i <= n; i++) {fac[i] = fac[i - 1] * i % P;inv[i] = (P - P / i) * inv[P % i] % P;ifac[i] = ifac[i - 1] * inv[i] % P;}
}
inline int C(int n, int m) { return (n < 0 || m < 0 || n < m) ? 0 : fac[n] * ifac[m] % P * ifac[n - m] % P; }
int qpow(int x, int y = P - 2) {int ret = 1;while (y) {if (y & 1) ret = ret * x % P;y >>= 1;x = x * x % P;}return ret;
}
int n;
int head[7005], nxt[20005], to[20005], ecnt;
inline void add(int u, int v) { to[++ecnt] = v, nxt[ecnt] = head[u], head[u] = ecnt; }
int rt, msz;
int sz[7005], mx[7005];
void getroot(int x, int fa) {sz[x] = 1;for (int i = head[x]; i; i = nxt[i]) {int v = to[i];if (v != fa) {getroot(v, x);sz[x] += sz[v];mx[x] = max(mx[x], sz[v]);}}   mx[x] = max(mx[x], n - sz[x]);if (mx[x] < msz) msz = mx[x], rt = x;
}
int fa[7005];
vector<array<int, 2> > vec[7005];
void dfs(int x, int fa) {mx[x] = 0, sz[x] = 1; ::fa[x] = fa;for (int i = head[x]; i; i = nxt[i]) {int v = to[i];if (v != fa) {dfs(v, x);sz[x] += sz[v];mx[x] = max(mx[x], sz[v]);}}if (x != rt) {vec[sz[x]].emplace_back((array<int, 2>) { sz[x], 1 });vec[mx[x]].emplace_back((array<int, 2>) { sz[x], 0 });}
}
int cur[7005], coe[7005], ans[7005];
void ins(int x) { for (int i = 1; i <= n - x; i++) Madd(cur[i], P - cur[i + x]); }
void del(int x) { for (int i = n; i > x; i--) Madd(cur[i - x], cur[i]); }
signed main() {freopen("tree.in", "r", stdin);freopen("tree.out", "w", stdout);Cpre(7000);cin >> n;for (int i = 1; i < n; i++) {int u, v;cin >> u >> v;add(u, v);add(v, u);}msz = n + 1;getroot(1, 0);dfs(rt, 0);for (int i = 1; i <= n; i++) {if (i == rt) continue;for (int K = 1; K <= n; K++) {int k = sz[i];Madd(ans[K], k * C(sz[i], K) % P);for (int j = head[i]; j; j = nxt[j]) {int v = to[j];if (fa[v] == i) Madd(ans[K], P - k * C(sz[v], K) % P);}}}int mx1 = 0, mx2 = 0;cur[n] = 1;for (int i = head[rt]; i; i = nxt[i]) {int v = to[i];Madd(cur[sz[v]], P - 1);if (sz[v] >= mx1) mx2 = mx1, mx1 = sz[v];else mx2 = max(mx2, sz[v]);}for (int i = 1; i <= n; i++) Madd(coe[i], (n - mx[rt]) * cur[i] % P);for (int i = 1; i < n; i++) cur[i] = 0;vec[mx1].emplace_back((array<int, 2>) { n - mx1, 1 });vec[mx2].emplace_back((array<int, 2>) { n - mx1, 0 });for (int i = mx[rt]; i; i--) {for (auto v : vec[i]) v[1] ? ins(v[0]) : del(v[0]);for (int j = 1; j <= n; j++) Madd(coe[j], cur[j]);}for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) Madd(ans[i], coe[j] * C(j, i) % P);}for (int i = 1; i <= n; i++) cout << ans[i] * qpow(C(n, i)) % P << "\n";return 0;
}

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

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

相关文章

docker部署.net core3.1

1.安装dockerapt install docker.io2.拉取.net core依赖镜像docker pull mcr.microsoft.com/dotnet/core/aspnet:latest3.创建.net core3.1项目 选择docker支持,会生成dockerFile配置文件如图:4.编写dockerfile文件,经删减后为:FROM mcr.microsoft.com/dotnet/core/aspnet:3…

DeepSeek 满血版在 VScode 和 IDEA 中怎么用?手把手教程来了

DeepSeek 满血版在 IDEA 中怎么用?手把手教程来了作者:沉默王二近期有几个热点事件,不知道大家关注到没有?第一个标志事件,一向挑剔的苹果宣布和阿里合作,一起为国行版 iPhone 提供 AI 技术服务。 第二个标志事件,DeepSeek R1 蒸馏了 6 个模型开源给社区,其中有 4 个来…

redission-delay-queue使用及原理

1.引入jar包<dependency><groupId>xxxx.delay</groupId><artifactId>redisson-delayed-queue</artifactId><version>1.0.0-SNAPSHOT</version> </dependency>2.客户端代码开发2.1:新增实现BaseTask的bean 参数由业务自行决定…

利用网页爬虫从专业产品论坛提取评论的完整指南

了解如何通过网页爬虫从专业产品论坛提取评论,以获取可操作的洞见、改进策略,并节省时间。利用网页爬虫从专业产品论坛提取评论已经成为企业的游戏规则改变者。它使您能够从多个平台收集客户反馈(https://dataforest.ai/blog/top-web-scraping-use-cases),实时监控情绪,并自…

树的重心(树形dp)

我最开始将n减了1,应为边长有n-1条,但是这会导致计算时出现错误,因为其他地方会用到n#include<iostream> #include<vector> using namespace std; const int N=1e5+5; vector<int>v[N]; int f[N]; int vis[N]; int ans=1e5; int n; int dfs(int x){vis[x]…

仓库管理到底该怎么管?记住这五常六准原则!

仓库管理到底该怎么管? 要是你觉得仓库只是个“堆货的地方”,那可就大错特错了! 想象一下,货物乱成一团,找东西时费劲,出库慢,结果错发了货,那可真的是“大麻烦”啊。 客户打电话来投诉,老板又来催货,这种情况谁遇到谁头疼。 但其实,仓库管理不复杂,只要掌握了一些…

让窗口显示在所有虚拟桌面上

功能如图 C#代码实现如下public partial class MainWindow : Window {public MainWindow(){InitializeComponent();ShowInTaskbar = false;this.Loaded += MainWindow_Loaded;}private void MainWindow_Loaded(object sender, RoutedEventArgs e){IntPtr a = new System.Window…

[Vite] 性能优化

关于HTTP: https://www.cnblogs.com/Answer1215/p/18729206 DNS 打包方式:所有代码(包括 lodash-es、element-ui 等)被打包到一起,部署时只需请求一个或几个大文件。 优点是简单,不需要额外的网络请求;缺点是文件体积大,首次加载延迟较高,而且用户如果之前访问过其他…

python 并发场景梳理

一、多进程(Multiprocessing) 1、使用场景 适合CPU密集型任务,因为每个进程运行在独立的Python解释器中,不受全局解释器锁(GIL)的影响。 2、代码from multiprocessing import Process import timedef task():print("Task is running")time.sleep(10)processes …

Pic2Word

目录概Pic2Word代码Saito K., Sohn K., Zhang X., Li C., Lee C., Saenko K., and Pfister T. Pic2Word: Mapping pictures to words for zero-shot composed image retrieval. CVPR, 2023.概 本文关注的是 Composed Image Retrieval (CIR) 任务: 给定一个 reference (query) i…

SciTech-EECS-BigDataAIML-NN(神经网络): 常用的18种Activation(激活函数)

SciTech-EECS-BigDataAIML-NN(神经网络): 常用的18种Activation(激活函数) 一:简介 二:为什么要用激活函数 三:激活函数的分类 四:常见的几种激活函数 4.1.Sigmoid函数 4.2.Tanh函数 4.3.ReLU函数 4.4.Leaky Relu函数 4.5.PRelu函数 4.6.ELU函数 4.7.SELU函数 4.8.Swish函数…

用了CRM后,业绩不升反滑?问题可能出在这6个地方!

用了CRM系统后,我的公司——客户跟丢了 销售效率下降了 业绩一落千丈哈哈,比我惨的还有谁?! 不过我潜心研究了一阵,终于把这个CRM系统给弄懂了! 今天就跟大家聊一聊,为什么用了CRM系统后不仅没能提升业绩,反而拖了后腿,这是踩了哪些坑?以及该怎么调整才能真正发挥CRM…