P8990 [北大集训 2021] 小明的树 题解

news/2025/11/5 23:05:50/文章来源:https://www.cnblogs.com/MoyouSayuki/p/19194882

P8990 [北大集训 2021] 小明的树 题解

首先刻画 “美丽”,考虑灭点,由于 1 始终灭,所以形如一个包含 1 的连通块,灭点连通块数量要为 1。

因为要刻画连通块数量,考虑点减边容斥,即连通块个数是灭点个数减 “灭-灭” 边个数,而贡献就是 “灭-亮” 边个数。

维护每一个时刻连通块数量和 “灭-亮” 边个数,答案就是连通块数量为 1 的那些时刻的 “灭-亮” 边个数之和。

如果删除一条边,需要去掉它的贡献,它的贡献形如两个区间,用线段树维护,因为连通块数量不可能 \(< 1\),所以只需要维护最小值的贡献和。

#include <iostream>
#include <algorithm>
#include <queue>
#include <cstring>
#define int long long
using namespace std;
const int N = 5e5 + 10, INF = 1e18;int n, m, a[N], b[N], u[N], v[N];
vector<int> g[N];
// A 最小值,最小值个数,B 和,A 最小值的 B 的和 
struct qwq {int mn, cnt, sum, taga, tagb;qwq operator + (const qwq &W) const {qwq tmp;tmp.mn = mn, tmp.cnt = cnt, tmp.sum = sum;if(tmp.mn > W.mn) tmp.mn = W.mn, tmp.cnt = W.cnt, tmp.sum = W.sum;else if(tmp.mn == W.mn) tmp.cnt += W.cnt, tmp.sum += W.sum;return tmp;}
} dat[N << 2];
void align(int u, int v, int op) {if(op == 0) dat[u].mn += v, dat[u].taga += v;else dat[u].sum += dat[u].cnt * v, dat[u].tagb += v;
}
void up(int u) {dat[u] = dat[u << 1] + dat[u << 1 | 1];
}
#define mid ((l + r) >> 1)
void build(int u, int l, int r) {if(l == r) return dat[u].mn = l, dat[u].cnt = 1, void();build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r), up(u);
}
void down(int u) {if(dat[u].taga) align(u << 1, dat[u].taga, 0), align(u << 1 | 1, dat[u].taga, 0), dat[u].taga = 0;if(dat[u].tagb) align(u << 1, dat[u].tagb, 1), align(u << 1 | 1, dat[u].tagb, 1), dat[u].tagb = 0;
}
void update(int u, int l, int r, int ql, int qr, int v, int op) {if(ql <= l && qr >= r) return align(u, v, op);down(u);if(ql <= mid) update(u << 1, l, mid, ql, qr, v, op);if(qr > mid) update(u << 1 | 1, mid + 1, r, ql, qr, v, op);up(u);
}
void print(int u, int l, int r) {if(l == r) {cout << dat[u].sum << ' ';return ;}down(u);print(u << 1, l, mid);print(u << 1 | 1, mid + 1, r);
}
void calc(int u, int v, int op) {int x = min(b[u], b[v]), y = max(b[u], b[v]);if(x < y) update(1, 1, n, x, y - 1, op, 1);if(y <= n) update(1, 1, n, y, n, -op, 0);
}
int calc() {auto t = dat[1];if(t.mn == 1) return t.sum;return 0;
}
signed main() {ios::sync_with_stdio(0), cin.tie(0);cin >> n >> m;for(int i = 1, a, b; i < n; i ++) {cin >> a >> b;u[i] = a, v[i] = b;}b[1] = 1;for(int i = 2; i <= n; i ++) cin >> a[n - i + 2];for(int i = 2; i <= n; i ++) b[a[i]] = i;build(1, 1, n);for(int i = 1; i < n; i ++) calc(u[i], v[i], 1);cout << calc() << '\n';for(int i = 1, a, b, c, d; i <= m; i ++) {cin >> a >> b >> c >> d;calc(a, b, -1), calc(c, d, 1); cout << calc() << '\n';}return 0;
}

应该把所有的观察写到纸上!防止忘记。

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

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

相关文章

100小时学会SAP—问题11:MIGO收货时报错不可能为条目BSX CN01确立账户

100小时学会SAP—问题11:MIGO收货时报错不可能为条目BSX CN01确立账户执行事务码MIGO收货时,报错如下:不可能为条目BSX CN01确立账户。解决方法: 1、首先按照100小时学会SAP步骤配置(在用MMR1、MMF1事务码创建物料…

【动态维护前 x 大元素】LeetCode 3321. 计算子数组的 x-sum II

View Post【动态维护前 x 大元素】LeetCode 3321. 计算子数组的 x-sum II题目 https://leetcode.cn/problems/find-x-sum-of-all-k-long-subarrays-ii/description/ 题解 定义两个有序集合 \(L, R\) 动态维护数组前 \(…

100小时学会SAP—问题8:财务凭证行项目BSEG及对应的六张表

100小时学会SAP—问题8:财务凭证行项目BSEG及对应的六张表FI会计模块中输入一笔业务将会记一个财务凭证,SAP系统中将凭证信息分为抬头信息和明细信息两部分加以存储。其中抬头(Header)信息存储在透明表BKPF中,明细(…

100小时学会SAP—问题9:MD03提示日期在有效工厂日历之后(请改正)

100小时学会SAP—问题9:MD03提示日期在有效工厂日历之后(请改正)执行事务码MD03时,报错如下:提示日期在有效工厂日历之后(请改正)解决方法:这是因为在创建工厂数据的时候工厂的日期没有更改造成的。 路径为:SP…

100小时学会SAP—问题6:创建采购收货时出现WE在年2025中编号不存在

100小时学会SAP—问题6:创建采购收货时出现WE在年2025中编号不存在前台 后勤—物料管理—库存管理—货物移动—收货—对采购订单—采购订单GR(MIGO) 报了如下错误:有关业务/事件类型WE在年2025的号码范围不存在解决…

100小时学会SAP—问题7:FB70提示过账码没有定义

100小时学会SAP—问题7:FB70提示过账码没有定义执行事务码FB70时,报错如下:Posting keys not defined原因:在文档“0528—FB70运行时提示在表T030B中AGD输入丢失”中,解决方法错误,其中的PK码自己瞎填,导致错误…

树剖

接dfs序。 https://www.cnblogs.com/ybjnb/p/19089551 树剖 (dfs序的性质依旧满足 即子树也是一段连续区间)将一颗树转化为一个序列 将树上任意一条路径转化成 log(n) 段连续区间 然后就可以用序列数据结构维护信息。…

100小时学会SAP—问题5:SAP导航菜单字体突然变小

100小时学会SAP—问题5:SAP导航菜单字体突然变小问题:SAP导航菜单字体突然变小 无论修改字体、字符集或登录其他服务器的SAP都是菜单字体变小解决方法: 删除注册表(regedit)HKEY_CURRENT_USER\Software\SAP\SAPGU…

如何降低大模型幻觉

目录数据层面的改进检索增强生成(RAG)提示工程优化强化学习与人类反馈多模型验证置信度校准事实核查层特定领域微调 在大模型开发中减少幻觉是一个核心挑战。以下是一些有效的策略: 数据层面的改进 高质量的训练数据…

11月5日---学习总结

一、内存四区 代码区|全局区|栈区|堆区 1.程序运行前(生成可执行程序exe,未执行该程序之前) 1.1 代码区: *特点1:只读:不可修改 *特点2:共享:防止频繁使用占用内存 1.2全局区:全局变量、静态变量、常量 *静态…

11-2

(1)今天学习了将idea编写的后端代码与vscode上的前端代码连接 (2)明天继续深造

100小时学会SAP—问题4:ME21N创建采购订单报错

100小时学会SAP—问题4:ME21N创建采购订单报错创建采购订单ME21N时报错:物料***的强制账户设置(输入账户设置类别) 消息号ME062 诊断 在此工厂中没有此物料类型基于价值的库存管理的备抵.因此账户分配是十分必要的. 过…

多智能体架构中 如何解决总控agent路由错误的问题

目录背景和价值🤖 避免多Agent架构中总控Agent路由错误与回撤方案🎯 避免路由错误的策略↩️ 错误回撤与纠正方案如何让分类器输出一个置信度分数。如果置信度低于预设的阈值,做相关操作1. 🤖 基于大型语言模型…

11-1

(1)今天学习了将idea编写的后端代码与vscode上的前端代码连接 (2)明天继续深造

回归(监督学习)

回归是监督学习的两大核心任务之一(另一个是分类)。它的目标是预测一个连续的数值输出。 一、核心思想:预测一个具体的数值 简单来说:回归就是“找规律,预测数”。 分类 回答的是 “是什么?” 的问题,答案是离散…

100小时学会SAP—问题3:成本控制控制凭证的编号范围

100小时学会SAP—问题3:成本控制控制凭证的编号范围此项配置是在后台为指定的成本控制范围(Controlling Area)维护编号范围,用于成本控制中个各类凭证。 维护成本控制范围的编号范围可以采用手工法和复制法,复制法比…

10-20

(1)今天学习了vscode (2)明天继续深造

10-25

(1)今天学习了使用vscode编写网页的前端代码 (2)明天继续深造

10-24

(1)今天学习了使用vscode编写网页的前端代码 (2)明天继续深造

10-23

(1)今天学习了使用vscode编写网页的前端代码 (2)明天继续深造