news 2026/7/4 18:18:20

dfs序+差分

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
dfs序+差分

lc2445

hash预处理query,利用小的数不可能被大的数影响的单调性dfs

class Solution {
public:
int numberOfNodes(int n, vector<int>& queries) {
map<int, int> cnt;
for (auto& q: queries) cnt[q]++;
function<int(int, int)> dfs = [&] (int node, int c) -> int {
if (node > n) return 0;
int nc = (c + cnt[node]) % 2;
int ans = nc;

//遍历 累加对子树的翻转次数 处理
ans +=dfs(node * 2, nc);
ans += dfs(node * 2 + 1, nc);
return ans;
};
return dfs(1, 0);
}
};


dfs序+差分

dfs遍历给二叉树的每个节点标记连续的编号,再用差分数组统计每个节点被翻转的次数,最后统计被翻转奇数次(即最终为1)的节点数量

1. 利用dfs序将子树映射到一段连续的区间

2. 翻转区间可以用异或来进行差分

#include <vector>

#include <numeric>

using namespace std;

class Solution {

private:

int dfsId;

// 深搜遍历,记录每个节点的dfs起始/结束id

void dfs(int cur, int pre, vector<vector<int>>& adjList, vector<int>& starts, vector<int>& ends) {

starts[cur] = dfsId;

for (int next : adjList[cur]) {

if (next != pre)

dfs(next, cur, adjList, starts, ends);

}

ends[cur] = dfsId;

dfsId++;

}

public:

int numberOfNodes(int n, vector<int>& queries) {

// 构建邻接表(0为根节点,原问题1-based转0-based)

vector<vector<int>> adjList(n);

for (int cur = 1; cur < n; cur++) {

int parent = (cur - 1) / 2;

adjList[parent].push_back(cur);

adjList[cur].push_back(parent);

}

// 初始化dfs相关数组

vector<int> starts(n, 0), ends(n, 0);

dfsId = 0;

dfs(0, -1, adjList, starts, ends);

// 差分数组处理翻转操作(异或实现翻转)

vector<int> diff(n + 1, 0);

for (int node : queries) {

int u = node - 1; // 1-based转0-based

int l = starts[u], r = ends[u];

diff[l] ^= 1;

if (r + 1 <= n)diff[r + 1] ^= 1;

}

// 求差分前缀异或,统计最终为1的节点数

int cnt = 0, curXor = 0;

for (int i = 0; i < n; i++) {

curXor ^= diff[i];

cnt += curXor & 1;

}

return cnt;

}

};

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 18:00:32

Selenium自动化测试入门篇

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Selenium是一个基于浏览器的自动化测试工具&#xff0c;它提供了一种跨平台、跨浏览器的端到端的web自动化解决方案。 Selenium是用于自动化控制浏览器做各种…

作者头像 李华
网站建设 2026/7/1 21:41:01

广东佛山国际陆港调研考察-万祥军| 国研智库·中国国政研究

广东佛山国际陆港调研考察-万祥军| 国研智库中国国政研究 2026年1月8日&#xff0c;国务院总理在佛山国际陆港调研时&#xff0c;重点考察了跨境电商与保税物流的发展运营情况。这座位于粤港澳大湾区核心地带的现代化物流枢纽&#xff0c;正以日均处理超50万单跨境电商货物的规…

作者头像 李华
网站建设 2026/7/2 21:29:48

邮轮母港直升机场和机器人谷考察-万祥军| 国研智库·中国国政研究

邮轮母港直升机场和机器人谷考察-万祥军| 国研智库中国国政研究 2026年1月15日&#xff0c;国务院总理来到深圳蛇口邮轮母港直升机场和机器人谷&#xff0c;深入调研低空经济发展及科技创新成果。国际科学院组织代表兼国际科学院委员会执委万祥军解读表明&#xff1a;“此次考…

作者头像 李华
网站建设 2026/6/29 22:50:28

告别中心化平台:Peersuite 开源协作系统搭建教程

如果你在小团队协作或长期项目合作中待过一段时间,大概率会有这些真实感受: 🤝 协作工具越来越多,但数据越来越分散 😵 项目、讨论、文件被锁在不同平台里 🧠 平台规则一变,使用方式就被迫跟着变 🔒 对核心数据的控制权不在自己手里 💻 有些项目,其实并不需要“…

作者头像 李华
网站建设 2026/7/2 9:21:27

如何编写一份完整的软件测试报告?

背景 作为测试从业者&#xff0c;编写测试用例&#xff0c;测试计划&#xff0c;测试报告都是必经之路&#xff0c;最近完成了年终述职以及版本准出&#xff0c;感觉测试报告或者各类报告真是职场人不可或缺的一项技能&#xff0c;趁着热乎劲&#x1f525;&#xff0c;写下一些…

作者头像 李华
网站建设 2026/7/2 4:59:34

性能测试的几个主要术语及计算

01 主要术语 用户数 有时会看到下面这样的描述&#xff1a;一个系统注册用户达到6000万人&#xff0c;其中每小时的活跃用户大概在60万人左右。这段描述介绍了两个信息&#xff0c;第一个信息&#xff1a;6000万人指的是注册用户&#xff0c;第二个信息&#xff1a;60万人指的…

作者头像 李华