当前位置: 首页 > news >正文

Codeforces Round 907 (Div. 2) F. A Growing Tree(2000,子树修改)

Problem - 1891F - Codeforces

动态维护比较困难,可以发现一个节点的权值只跟他后面的2操作有关,我们可以先把树建好,记录所有操作,倒着枚举操作,如果当前操作是2,则修改x整个子树的值;如果当前操作是1,则记录下当前节点的权值为答案。

对于一个已经建好的树,如何修改整个子树的值?我们可以记录下这个树的dfs序,在这个过程中,回溯的时候可以记录下当前节点子树所对应dfs序的截止位置。我们直接对这个区间进行修改就可以了。可以使用差分树状数组

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6 + 10;
const int mod = 1e9 + 7;
#define pii pair<int, int>
#define lowbit(x) (x & (-x))
int sz;
struct node
{int opt, v, x;
};
vector<int> e[N];
vector<int> path; // 记录dfs序
int idx[N];       // 节点u在path中的下标
int las[N];       // 节点u的子树在path中的最后截止位置
void dfs(int u)
{path.push_back(u);for (int v : e[u])dfs(v);las[u] = path.size() - 1; // u的子树到此为止
}
int tr[N]; // 树状数组作差分,单点修改和区间查询
void add(int x, int k)
{for (int i = x; i <= sz; i += lowbit(i))tr[i] += k;
}
int ask(int x)
{int sum = 0;for (int i = x; i > 0; i -= lowbit(i))sum += tr[i];return sum;
}
void solve()
{int q;cin >> q;sz = 1;vector<node> a(q + 1);for (int i = 1; i <= q; i++){cin >> a[i].opt;if (a[i].opt == 1){cin >> a[i].v;e[a[i].v].push_back(++sz);a[i].x = sz;}elsecin >> a[i].v >> a[i].x;}path.push_back(0);dfs(1);for (int i = 1; i < path.size(); i++)idx[path[i]] = i;vector<int> res(sz + 1, -1);for (int i = q; i >= 1; i--){if (a[i].opt == 1)res[a[i].x] = ask(idx[a[i].x]);elseadd(idx[a[i].v], a[i].x), add(las[a[i].v] + 1, -a[i].x);}res[1] = ask(1);for (int i = 1; i <= sz; i++)cout << res[i] << ' ';cout << endl;path.clear();for (int i = 1; i <= sz; i++){tr[i] = idx[i] = las[i] = 0;e[i].clear();}
}signed main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t = 1;cin >> t;while (t--)solve();
}

文章转载自:
http://administratress.hdqtgc.cn
http://cartagena.hdqtgc.cn
http://baroswitch.hdqtgc.cn
http://alvine.hdqtgc.cn
http://brewage.hdqtgc.cn
http://chillout.hdqtgc.cn
http://campanology.hdqtgc.cn
http://alonso.hdqtgc.cn
http://bitterweed.hdqtgc.cn
http://advance.hdqtgc.cn
http://boozy.hdqtgc.cn
http://archaeornis.hdqtgc.cn
http://catching.hdqtgc.cn
http://central.hdqtgc.cn
http://carload.hdqtgc.cn
http://buckbean.hdqtgc.cn
http://cattle.hdqtgc.cn
http://bey.hdqtgc.cn
http://agenize.hdqtgc.cn
http://aborigines.hdqtgc.cn
http://arenic.hdqtgc.cn
http://atelectatic.hdqtgc.cn
http://adjacency.hdqtgc.cn
http://buttony.hdqtgc.cn
http://antismoking.hdqtgc.cn
http://alnico.hdqtgc.cn
http://becket.hdqtgc.cn
http://adapt.hdqtgc.cn
http://adventurous.hdqtgc.cn
http://adjoint.hdqtgc.cn
http://www.dtcms.com/a/280924.html

相关文章:

  • 拥抱 Spring Boot:开启 Java 后端开发的“快车道”
  • MySQL功能模块探秘:数据库世界的奇妙之旅
  • 解决了困扰我的upload靶场无法解析phtml等后缀的问题
  • JAVA学习笔记 使用notepad++开发JAVA-003
  • SpringBoot 3.x集成阿里云OSS:文件上传 断点续传 权限控制
  • 填补空白!openKylin率先完成RISC-V商业打印驱动全适配
  • AI问答-Token:在人工智能领域,Token 是模型处理文本的核心单元 / 最小可处理片段
  • Python打卡训练营Day58
  • 大白话解释一下RTC实时时钟
  • 【机器学习深度学习】大模型推理速度与私有化部署的价值分析
  • 元宇宙内容生产工具终局之战:三维编辑、实时协同与跨平台发布的黄金三角
  • 2025年夏Datawhale AI夏令营机器学习
  • Springboot 项目 连接人大金仓数据库,进行功能查询demo示例
  • pytorch学习笔记(四)-- TorchVision 物体检测微调教程
  • 图像修复:深度学习实现老照片划痕修复+老照片上色
  • 一文读懂循环神经网络—门控循环单元
  • 深度学习 Pytorch图像分类步骤
  • 僵尸进程Zombie Process
  • 如何通过 WebSocket 接口订阅实时外汇行情数据(PHP 示例)
  • dom节点操作方法与事件冒泡总结
  • Python爬虫实战:研究Mistune库相关技术
  • Android中Launcher简介
  • 【SOA用于噪声抑制】光纤DFB激光器中弛豫振荡噪声抑制
  • Android原生Dialog
  • 关于我用AI编写了一个聊天机器人……(番外1)
  • 博客项目 laravel vue mysql 第六章 文章功能
  • PHP:从入门到实战的全面指南
  • 【PTA数据结构 | C语言版】构造二叉树
  • python原生处理properties文件
  • curl请求一直等待但是postman访问正常的问题处理