news 2026/7/25 14:33:56

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/7/18 7:00:15

导师推荐9个一键生成论文工具,自考学生轻松搞定论文格式规范!

导师推荐9个一键生成论文工具&#xff0c;自考学生轻松搞定论文格式规范&#xff01; 自考论文写作的福音&#xff1a;AI 工具如何改变你的学习节奏 在自考过程中&#xff0c;论文写作一直是许多学生最头疼的部分。无论是格式规范、内容逻辑还是语言表达&#xff0c;都需要投…

作者头像 李华
网站建设 2026/7/18 12:48:31

收藏!普通人也能入局AI的黄金岗位:大模型训练师入门指南

近日&#xff0c;有网友爆料前vivo产品经理宋xx离职后的职业轨迹引发行业关注——从vivo离开后&#xff0c;他曾短暂加入理想汽车&#xff0c;最终选择躬身入局AI硬件创业赛道。这一动态再次将大众目光聚焦到AI领域&#xff0c;也让不少想跨界AI的程序员、职场小白好奇&#xf…

作者头像 李华
网站建设 2026/7/23 13:17:38

突破单线程瓶颈:多进程并发服务器的设计与实现

在网络编程中,单线程服务器最致命的问题在于其“阻塞性”——当服务器正在与一个客户端通信时,其他所有连接请求都会被拒之门外。 为了实现真正的并发,我们需要引入多进程模型。本文将深入探讨如何利用 Linux 的进程创建机制,构建一个高性能的并发服务器。 一、 多进程并发…

作者头像 李华
网站建设 2026/7/25 13:55:50

基于Simulink的DFIG定子电压定向控制策略仿真

目录 手把手教你学Simulink 一、引言&#xff1a;为什么DFIG要采用“定子电压定向”&#xff1f; 二、理论基础&#xff1a;定子电压定向原理 1. 坐标系定义 2. DFIG 功率表达式&#xff08;SVO 下&#xff09; 3. 转子电压方程&#xff08;用于电流环设计&#xff09; …

作者头像 李华
网站建设 2026/7/13 5:04:14

工业AI平台怎么选?技术对比与落地指南

工业AI平台怎么选&#xff1f;技术对比与落地指南工业AI平台的选择标准选择工业AI平台&#xff0c;不能只看技术噱头&#xff0c;更要结合企业自身需求。比如&#xff0c;一家汽车制造企业关心焊接质量预测和设备维护&#xff0c;而一家电子厂更关注视觉检测和能耗优化。不同的…

作者头像 李华