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

[树状数组]P11855 [CSP-J2022 山东] 部署 题解

完全不需要剖分啊,不知道 tag 在打什么劲。

首先看题面。

操作1是正常的操作,开一颗线段树记录 dfs 序区间修改。

操作2是反常的操作。这题需要记 bfs 序。这样就可以确保一个节点的直连节点 bfs 序是连续的。然后再开一颗线段树记录 bfs 序区间修改。

注意哦,一个节点和他的子节点的 bfs 序不一定是连续的,所以 bfs 预处理的时候对于每个节点要处理出他 bfs 序最小的孩子,也就是第一个访问到的孩子。

然后你再手动增加 \(a\) 数组中节点父亲和自身的值就行。

这样对于最后的查询,每个节点就是第一棵线段树的值 + 第二棵线段树的值 + \(a\) 的值。

发现两个操作都是要求区间修改 + 单点查询,那可以不写线段树了,改成树状数组。(其实线段树的大常数也过不去)

呃然后就没啥说的了(存疑

#include <bits/stdc++.h>
#define lowbit(x) (x & -x)
#define int long long
#define rep(i, a, b) for(register int i = a; i <= b; ++i)
using namespace std;
constexpr int N = 1e6 + 6;
bool vis[N];
int m, opt, n, u, v, cnt, tot, a[N], bfn[N], dfn[N], con[N], siz[N], son[N], father[N];
vector<int> e[N];
void bfs() {queue<int> q;q.push(1);vis[1] = 1;while(!q.empty()) {int now = q.front();q.pop();bfn[now] = ++cnt;//处理bfs序for(const register int to : e[now]) {if(!vis[to]) {q.push(to);vis[to] = 1;if(!son[now]) {son[now] = to//为了后续的修改,记录bfs序最小的儿子}++con[now];//和siz一个性质}} }
}
void dfs(int s, int fa) {father[s] = fa;dfn[s] = ++tot;siz[s] = 1;for(const register int to : e[s]) {if(to == fa) continue;dfs(to, s);siz[s] += siz[to];}
}
struct BIT {int sum[N];inline void add(int x, int d) {while(x <= n) {sum[x] += d;x += lowbit(x);}}inline void Add(int l, int r, int d) {add(l, d);add(r + 1, -d);}inline int query(int x) {int ans = 0;while(x) {ans += sum[x];x -= lowbit(x);}return ans;}
//就是一个支持区间加单点查的树状数组
}T1, T2;
signed main() {ios :: sync_with_stdio(0), cin.tie(0), cout.tie(0);cin >> n;rep(i, 1, n) cin >> a[i];rep(i, 1, n - 1) {cin >> u >> v;e[u].push_back(v);e[v].push_back(u);}bfs();dfs(1, 0);cin >> m;while(m--) {cin >> opt >> u >> v;;switch(opt) {case 1 : {T1.Add(dfn[u], dfn[u] + siz[u] - 1, v);//改子树break;}case 2 : {a[father[u]] += v;//改父亲a[u] += v;//改自己if(son[u]) {T2.Add(bfn[son[u]], bfn[son[u]] + con[u] - 1, v);//改儿子}break;}}}cin >> m;while(m--) {cin >> opt;cout << T1.query(dfn[opt]) + T2.query(bfn[opt]) + a[opt] << '\n';}return 0;
}
http://www.zskr.cn/news/27749.html

相关文章:

  • C#/.NET/.NET Core技术前沿周刊 | 第 58 期(2025年10.13-10.19)
  • 完整教程:阿里云上CentOS6.9(停止维护)导致的yum下载chrony失败如何解决?
  • k8s 常用命令 - 实践
  • 申威架构ky10安装php-7.2.10.rpm详细步骤(国产麒麟系统64位)
  • Unity 虚拟仿真实验中设计模式的使用 ——策略模式(Strategy Pattern) - 指南
  • vue2:v-if和v-show的区别以及造成的影响
  • P6845 题解
  • office2024绿色精简版
  • LGP3694 邦邦的大合唱站队 学习笔记
  • TRAE 设计团队如何玩转 Vibe Coding(上)|高美感页面生成篇
  • 详细介绍:观察者模式(Observer Pattern)定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。
  • LeeCode_226反转二叉树
  • TRAE 设计团队如何玩转 Vibe Coding(下)|设计工具生成与提效篇
  • 取证-windbg和dmp,以及文件分析基本流程
  • 20232422 2025-2026-1 《网络与系统攻防技术》实验二实验报告
  • 完整教程:C++项目:仿muduo库高并发服务器-------connection模块
  • 营销数字化专家要求
  • 完整教程:LeapMotion_Demo演示
  • [题解]P11126 [ROIR 2024] 三等分的数组 (Day 2)
  • 1111111111111
  • 数据库学习篇(持续更新中)
  • Fortinet产品安全漏洞分析:FGFM协议未经认证连接重置漏洞
  • Yolo11分割模型
  • 这是一个测试文档
  • 智联笔记项目——251022登录注册、后端管理及内容类型处理优化
  • 2025.10.22博客
  • 完整教程:基于WebAssembly的STEP文件3D在线查看器实现详解
  • 实用指南:86-python电网可视化项目-6
  • 通过电脑调试 Android/iOS 手机端网页
  • CMS垃圾回收器详解