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

树链剖分-苹果树

1009苹果树

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <bits/stdc++.h>#define int long long
#define double long double
#define ull unsigned long long
#define fi first 
#define se second
#define ls(p) p<<1
#define rs(p) (p<<1)|1
#define YES cout<<"YES\n"
#define NO cout<<"NO\n"
#define Yes cout<<"Yes\n"
#define No cout<<"No\n"
#define sp(x) fixed << setprecision(x)
#define all(v) v.begin(),v.end()using namespace std;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
ull rnd() { return (unsigned long long)rng(); }const int inf = 0x3f3f3f3f3f3f3f3f;
const int N = 1e6 + 5;
int n,m;
vector<int>g[N];
int tr[N],a[N];
int dep[N], sz[N], top[N], fa[N], son[N];
int id[N],nw[N];
int tag[N];
int cnt = 0;
int idx = 0;void init(){cnt = 0;idx = 0;for(int i=1;i<=n;i++){g[i].clear();dep[i] = 0;sz[i] = 0;top[i] = 0;fa[i] = 0;son[i] = 0;tag[i] = 0;id[i] = 0;nw[i] = 0;}return;
}void dfs1(int x,int father,int depth){dep[x] = depth;fa[x] = father;sz[x] = 1;for(const auto &y:g[x]){if(y == father)continue;dfs1(y , x , depth + 1);sz[x] += sz[y];if(sz[son[x]] < sz[y])son[x] = y;}
}void dfs2(int x,int t){id[x] = ++ cnt;nw[cnt] = a[x];top[x] = t;if(!son[x])return;dfs2(son[x] , t);for(const auto &y:g[x]){if(y == fa[x] || y == son[x])continue;dfs2(y,y);}return;
}void push_up(int p){tr[p] = max(tr[ls(p)] , tr[rs(p)]);
}void build(int p,int l,int r){if(l == r){tr[p] = nw[l];return;}int mid = l+r>>1;build(ls(p) , l , mid);build(rs(p) , mid + 1 , r);push_up(p);
}int query(int p,int l,int r,int nl,int nr){if(nl <= l && r <= nr){return tr[p];}int mid = l+r>>1;int res = 0;if(nl <= mid)res = query(ls(p) , l , mid , nl , nr);if(nr > mid)res = max(res , query(rs(p) , mid+1 , r , nl , nr));return res;
}void update(int p,int l,int r,int x,int k){if(l == r){tr[p] += k; return;}int mid = l + r >> 1;if(x <= mid)update(ls(p) , l , mid , x , k);else update(rs(p) , mid + 1 , r , x , k);push_up(p);return;
}int query_path(int x,int y){int res = 0;while(top[x] != top[y]){if(dep[top[x]] < dep[top[y]])swap(x , y);res = max(res , query(1 , 1 , n , id[top[x]] , id[x]));res = max(res , a[top[x]] + tag[fa[top[x]]]);x = fa[top[x]];}if(dep[x] > dep[y])swap(x , y);res = max(res , query(1 , 1 , n , id[x] , id[y]));if(x == top[x])res = max(res , a[x] + tag[fa[x]]);return res;
}void solve(){cin>>n>>m;init();for(int i=1;i<=n;i++){cin>>a[i];}for(int i=1;i<n;i++){int x,y;cin>>x>>y;g[x].push_back(y);g[y].push_back(x);}dfs1(1,-1,1);dfs2(1,1);build(1,1,n);while(m -- ){int op;cin>>op;if(op == 1){int x,y;cin>>x>>y;cout<<query_path(x , y)<<"\n";}else{int x,k;cin>>x>>k;tag[x] += k;if(fa[x] > 0){update(1 , 1 , n , id[fa[x]] , k);a[fa[x]] += k;}   if(son[x] > 0){update(1 , 1 , n , id[son[x]] , k);a[son[x]] += k;}}}}signed main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);time_t Start = clock();int T = 1;cin >> T;while (T -- ){solve();}time_t End = clock(); time_t Run_time = End - Start;//cout<<"\n"<<Run_time<<"ms"<<"\n"; return 0;
}

http://www.xdnf.cn/news/1164079.html

相关文章:

  • Java基础教程(010):面向对象中的this和就近原则
  • 图片转 PDF三个免费方法总结
  • 解决win10下Vmware虚拟机在笔记本睡眠唤醒后ssh连接不上的问题
  • 【STM32】485接口原理
  • C语言-字符串数组
  • xformers包介绍及代码示例
  • mcu中的调试接口是什么?
  • https正向代理 GoProxy
  • 【C语言进阶】结构体练习:通讯录
  • Day07_网络编程20250721_大项目
  • 从 “能用“ 到 “好用“:中小制造企业数字化转型中的 IT 系统优化管理策略
  • 高性能I/O的终极武器:epoll深度解析与实战
  • 什么是GNN?——聚合、更新与循环
  • 注册表清理优化丨Wise RegistryCleaner_v11.1.10.725(官方赠品)
  • USRP采集信号转换为时频图数据集
  • 理解向量及其运算-AI云计算数值分析和代码验证
  • Mac上安装Homebrew的详细步骤
  • CCLink IE转ModbusTCP网关与三菱PLC通讯无纸记录器
  • selenium爬取图书信息
  • 旋转目标检测(Rotated Object Detection)技术概述
  • Selenium 处理表单、弹窗与文件上传:从基础到实战
  • ACE 插入元件
  • cs336 Lecture2
  • 使用Langchain调用模型上下文协议 (MCP)服务
  • AI革命带来的便利
  • Go语言进阶书籍:Go语言高级编程(第2版)
  • 14.7 Alpaca格式深度解析:3倍指令准确率提升的LLM微调秘诀
  • Jenkins 不同节点间文件传递:跨 Job 与 同 Job 的实现方法
  • Linux | C Shell 与 Bash 的差异 / 环境变量配置问题解析
  • 了解 ReAct 框架:语言模型中推理与行动的协同