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

树链剖分

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int n, m, r, p, w[N];
int tot, h[N], e[2*N], nxt[2*N];
void add(int u, int v){nxt[++tot] = h[u];h[u] = tot;e[tot] = v;
}
struct Node{int l, r, lazy, sum;
} tr[4*N];
void pushup(int u){tr[u].sum = (tr[u<<1].sum + tr[u<<1|1].sum) % p;
}
void pushdown(int u){if(tr[u].lazy){tr[u<<1].lazy = (tr[u<<1].lazy + tr[u].lazy) % p;tr[u<<1].sum = (tr[u<<1].sum + 1ll*tr[u].lazy * (tr[u<<1].r - tr[u<<1].l + 1)) % p;tr[u<<1|1].lazy = (tr[u<<1|1].lazy + tr[u].lazy) % p;tr[u<<1|1].sum = (tr[u<<1|1].sum + 1ll*tr[u].lazy * (tr[u<<1|1].r - tr[u<<1|1].l + 1)) % p;tr[u].lazy = 0;}
}
void build(int u, int l, int r){tr[u].l = l;tr[u].r = r;if(l == r) return ;int mid = (l+r)>>1;build(u<<1, l, mid);build(u<<1|1, mid+1, r);
}
void modify(int u, int L, int R, int val){int l = tr[u].l, r = tr[u].r;if(l >= L && r <= R){tr[u].lazy = (tr[u].lazy+val)%p;tr[u].sum = (tr[u].sum + 1ll*val*(r-l+1))%p;return ;}if(tr[u].lazy) pushdown(u);int mid = (l+r)>>1;if(mid >= L) modify(u<<1, L, R, val);if(mid+1 <= R) modify(u<<1|1, L, R, val);pushup(u);
}
int query(int u, int L, int R){if(tr[u].lazy) pushdown(u);int l = tr[u].l, r = tr[u].r;if(l >= L && r <= R) return tr[u].sum;int ans = 0, mid = (l+r)>>1;if(mid >= L) ans = (ans + query(u<<1, L, R)) % p;if(mid+1 <= R) ans = (ans + query(u<<1|1, L, R)) % p;return ans;
}
int f[N], son[N], siz[N], deep[N];
void dfs1(int u){siz[u] = 1;int mx = 0;for(int i = h[u]; i; i = nxt[i]){int v = e[i];if(v == f[u]) continue;f[v] = u;deep[v] = deep[u]+1;dfs1(v);if(siz[v] > mx) mx = siz[v], son[u] = v;siz[u] += siz[v];}
}
int top[N], dfn[N], idx;
void dfs2(int u){dfn[u] = ++idx;if(!son[u]) return ;top[son[u]] = top[u];dfs2(son[u]);for(int i = h[u]; i; i = nxt[i]){int v = e[i];if(dfn[v]) continue;top[v] = v;dfs2(v);}
}
void add_path(int x, int y, int val){while(top[x] != top[y]){if(deep[top[x]] < deep[top[y]]) swap(x, y);modify(1, dfn[top[x]], dfn[x], val);x = f[top[x]];}if(deep[x] > deep[y]) swap(x, y);modify(1, dfn[x], dfn[y], val);
}
int ask_path(int x, int y){int ans = 0;while(top[x] != top[y]){if(deep[top[x]] < deep[top[y]]) swap(x, y);ans = (ans+query(1, dfn[top[x]], dfn[x])) % p;x = f[top[x]];}if(deep[x] > deep[y]) swap(x, y);ans = (ans+query(1, dfn[x], dfn[y])) % p;return ans;
}
void add_tree(int x, int val){modify(1, dfn[x], dfn[x]+siz[x]-1, val);
}
int ask_tree(int x){return query(1, dfn[x], dfn[x]+siz[x]-1);
}
int main(){scanf("%d%d%d%d", &n, &m, &r, &p);build(1, 1, n);for(int i = 1; i <= n; i++) scanf("%d", &w[i]);for(int i = 1; i < n; i++){int u, v;scanf("%d%d", &u, &v);add(u, v);add(v, u);}dfs1(r);dfs2(r);for(int i = 1; i <= n; i++) modify(1, dfn[i], dfn[i], w[i]);while(m--){int opt, x, y, z;scanf("%d", &opt);if(opt == 1){scanf("%d%d%d", &x, &y, &z);add_path(x, y, z);}else if(opt == 2){scanf("%d%d", &x, &y);printf("%d\n", ask_path(x, y));}else if(opt == 3){scanf("%d%d", &x, &z);add_tree(x, z);}else{scanf("%d", &x);printf("%d\n", ask_tree(x));}}return 0;
}

树剖+线段树, P3384

http://www.jsqmd.com/news/1230508/

相关文章:

  • Hyperf框架实战:构建高性能PHP微服务应用
  • AI医疗应用场景全解析:小白也能轻松入门,收藏必备!
  • 类器官技术发展态势、产业格局与前沿展望研究
  • 鸿蒙 ArkTS 实战:Live Product Board 从直播商品看板到电商运营工具完整解析
  • AI芯片投资:技术挑战与商业陷阱解析
  • PS 加阴影的方法有几种?教你快速添加自然柔和阴影效果
  • tprPix性能分析与优化:使用现代C++特性提升游戏帧率
  • 大语言模型Agent架构:从Prompt到Context的工程实践
  • torch.where
  • FastAPI与BentoML分层选型:模型服务化的真实产线实践
  • 方达炬 发明一例新字词:互联网资产
  • 小程序计算机毕设之移动端投票发布与结果统计系统的设计与实现 班级校园评选投票小程序的设计与实现(完整前后端代码+说明文档+LW,调试定制等)
  • AM275x SPI/USART时钟配置实战:从寄存器手册到稳定通信
  • 从Windows迁移到Linux:老玩家的完整指南与经验分享
  • AM64x/AM243x防火墙配置实战:从寄存器手册到系统安全设计
  • AI科技热点日报 | 2026年07月19日
  • Android动效开发:五大方案选型与性能优化实战
  • 鸿蒙 ArkTS 实战:After Sales Ticket 从售后工单到电商运营工具完整解析
  • 如何绕过NBA API限制:nba.js代理服务器配置指南
  • 小升初暑假规划:培养能力比补课更重要
  • 深入解析C2000 EPWM模块:斩波、故障保护与事件触发的工程实践
  • STM32H743 CubeMX工程模板与DSP优化实践
  • C++游戏开发入门:从环境搭建到项目架构的完整实践指南
  • 从芯片到操作系统到应用,全链路自主可控的Agent方案有哪些? —— 2026中国企业级AI原生应用全栈信创选型指南
  • AB类与D类功率放大器技术特性、选型规范及主流芯片推荐
  • AM275x SoC ISC寄存器配置实战:硬件级内存访问控制与安全隔离
  • 京东Java面试56问解析:核心考点与应对策略
  • 鸿蒙 ArkTS 实战:Promo Calendar 从促销日历到电商运营工具完整解析
  • AI科技热点日报 | 2026年07月20日
  • 基于Godot引擎的2D ARPG模块化框架设计与实战解析