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

gym664651(Baozii Cup 3)

A. DeepTreek

首先,我们选择了一个子树拆下来去重新连接之后,剩下的树的形态就不重要了,我们只需要维护去掉以 \(u\) 为根的子树之后,每个深度的点的个数 \(cnt\)

这个可以通过类似于重链剖分中的合并方法做到整体 \(O(n)\)

接下来就是怎么快速求答案的问题了

假设以 \(v\) 为根的子树深度为 \(g[v]\),去掉 \(u\) 子树后的树的深度为 \(maxdep\)

那么连接到深度 \(\leq maxdep-g[v]\) 的点,得到的答案都是 \(maxdep\)

否则答案为 \(dep[u] + g[v]\)

随便实现即可

code
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int NN = 2e5 + 8;
struct Edge{int to,next;
}edge[NN << 1];
int head[NN],edge_cnt;
void add_edge(int u,int v){edge[++edge_cnt] = {v,head[u]};head[u] = edge_cnt;
}int siz[NN],dep[NN],son[NN];
int g[NN];// g[u] 表示以 u 为根的子树的深度
void dfs(int u,int fa){dep[u] = dep[fa] + 1;siz[u] = 1;for(int i = head[u]; i != -1; i = edge[i].next){int v = edge[i].to;if(v == fa) continue;dfs(v,u);siz[u] += siz[v];g[u] = max(g[u],g[v]);if(siz[v] > siz[son[u]]) son[u] = v;}++g[u];
}int n;
ll ans;
inline int lowbit(int x){return x & (-x);}
struct BIT{ll a[NN];ll sum;void add(int x,ll num){sum += num;while(x){a[x] += num;x -= lowbit(x);}}ll ask(int x){if(x == 0) return sum;ll res = 0;while(x <= n){res += a[x];x += lowbit(x);}return res;}void clear(){sum = 0;for(int i = 0; i <= n; ++i)a[i] = 0;}
}cnt,calc;void modify(int u,int fa,int num){cnt.add(dep[u],num);calc.add(dep[u],dep[u]*num);for(int i = head[u]; i != -1; i = edge[i].next){int v = edge[i].to;if(v == fa) continue;modify(v,u,num);}
}
int clac_maxdep(){int res = 0;int l = 1, r = n;while(l <= r){int mid = (l + r) / 2;if(cnt.ask(mid) > 0) l = mid + 1, res = mid;else r = mid - 1;}return res;
}
void dfs2(int u,int fa){for(int i = head[u]; i != -1; i = edge[i].next){int v = edge[i].to;if(v == fa || v == son[u]) continue;dfs2(v,u);modify(v,u,1);}if(son[u]) dfs2(son[u],u);for(int i = head[u]; i != -1; i = edge[i].next){int v = edge[i].to;if(v == fa || v == son[u]) continue;modify(v,u,-1);}cnt.add(dep[u],-1);calc.add(dep[u],-dep[u]);ll maxdep = clac_maxdep();ll tot = n - siz[u],mid = max(0ll,maxdep-g[u]), y = cnt.ask(mid),x = tot - y;ans += maxdep * x + g[u] * y + calc.ask(mid);return;
}void solve(){cin >> n;cnt.clear();calc.clear(); for(int i = 1; i <= n; ++i) head[i] = -1,son[i] = dep[i] = siz[i] = g[i] = 0;edge_cnt = 0; ans = 0;for(int i = 1,u,v; i < n; ++i){cin >> u >> v;add_edge(u,v);add_edge(v,u);}dep[0] = -1;dfs(1,0);for(int i = 1; i <= n; ++i){cnt.add(dep[i],1);calc.add(dep[i],dep[i]);}dfs2(1,0);cout << ans << endl;
}
int main(){ios::sync_with_stdio(false),cin.tie(0);int T;cin >> T;while(T--){solve();}
}

B. Odd Cycle

C. Count Cubes

D. Xor And Mul

I. Operating System

J. Someone's Favourite Problem

M. Classic Revisited

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

相关文章:

  • 企业AI创新实验室如何持续输出高质量成果?AI应用架构师的「目标-迭代-激励」架构体系
  • 构建具有持续学习与适应能力的AI Agent
  • 2025年教我学英语 - 常用句子
  • Redis入门教程
  • 意识从哪里来:请你来回答
  • 人类要超越自身语言系统,靠进化显然是不行的
  • 永磁同步电机驱动控制系统中MCU的抗干扰设计
  • 【无人机编队】单领导-双跟随无人机协同编队控制附Matlab代码
  • 神奇助力!少样本学习应用助力AI应用架构师的发展
  • 寒假学习机选购指南:精准适配假期需求,清北道远助力高效提升
  • 解密:智能家居AI应用架构设计中的服务发现机制
  • 强烈安利8个AI论文网站,专科生搞定毕业论文+格式规范!
  • 彼得林奇如何看待股息投资
  • AI应用架构师不得不学:AI智能体的“工具选择”方法论
  • 基于深度学习YOLOv8的野生动物识别检测系统(YOLOv8+YOLO数据集+UI界面+Python项目源码+模型)
  • 【图像识别】基于支持向量机SVM的农作物叶子虫害识别与分类附Matlab代码
  • 《把脉行业与技术趋势》-104-为什么“缸中之脑”是当代AI最真实的写照?当前主流AI是“纯认知缸中之脑”——它拥有超常的符号推理能力,却彻底丧失了“通过身体与世界博弈以校准意义”的生存根基。
  • 基于深度学习YOLOv8的森林火灾烟雾红外检测系统(YOLOv8+YOLO数据集+UI界面+Python项目源码+模型)
  • 基于深度学习YOLOv8的水果分类检测系统(YOLOv8+YOLO数据集+UI界面+Python项目源码+模型)
  • 基于深度学习YOLOv10的轴承缺陷检测系统(YOLOv10+YOLO数据集+UI界面+Python项目源码+模型)
  • 基于深度学习YOLOv8的足球运动员检测系统(YOLOv8+YOLO数据集+UI界面+Python项目源码+模型)
  • 基于深度学习YOLOv10的苹果成熟度检测系统(YOLOv10+YOLO数据集+UI界面+Python项目源码+模型)
  • 基于深度学习YOLOv8的苹果成熟度检测系统(YOLOv8+YOLO数据集+UI界面+Python项目源码+模型)
  • 基于深度学习YOLOv10的施工现场安全检测系统(YOLOv10+YOLO数据集+UI界面+Python项目源码+模型)
  • 基于深度学习YOLOv8的木材缺陷检测系统(YOLOv8+YOLO数据集+UI界面+Python项目源码+模型)
  • 我是提示工程架构师,用这“五步优化法”让提示参与度翻了5倍!
  • 大数据存储技术:行式存储原理与应用场景全解析
  • LeetCode 1984.学生分数的最小差值:排序(类似滑动窗口)
  • 努力训练,我要拿 Celeste 金草莓(4) || 好吧其实我已经一周没打开 Celeste 了 || 努力训练,我要看曼联北伐 || 怡颇,沃隆初三
  • 【MTSP问题】基于人工旅鼠算法ALA求解单仓库多旅行商问题附Matlab代码