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

DeepSeek LeetCode 3559. 给边赋权值的方案数 II Java实现

根据题目要求,对于树中任意两个节点 u 和 v,路径长度为 d(边数),使路径总代价为奇数的赋值方案数为 2^(d-1)。因此核心问题转化为快速求树上两点距离。

以下是 Java 实现,使用二进制提升(Binary Lifting) 求 LCA,预处理 O(n log n),单次查询 O(log n):

```java
class Solution {
private static final int MOD = 1_000_000_007;
private List<List<Integer>> graph;
private int[] depth;
private int[][] up;

public int[] assignEdgeWeights(int[][] edges, int[][] queries) {
int n = edges.length + 1;
// 1. 建图
graph = new ArrayList<>();
for (int i = 0; i < n; i++) graph.add(new ArrayList<>());
for (int[] e : edges) {
int u = e[0] - 1, v = e[1] - 1;
graph.get(u).add(v);
graph.get(v).add(u);
}

// 2. 预处理:深度 + 倍增表
int LOG = 32 - Integer.numberOfLeadingZeros(n); // ceil(log2(n)) + 1
depth = new int[n];
up = new int[n][LOG];
dfs(0, -1);

// 3. 预处理 2 的幂次
int[] pow2 = new int[n + 1];
pow2[0] = 1;
for (int i = 1; i <= n; i++) {
pow2[i] = (int)((long)pow2[i - 1] * 2 % MOD);
}

// 4. 处理每个查询
int q = queries.length;
int[] ans = new int[q];
for (int i = 0; i < q; i++) {
int u = queries[i][0] - 1, v = queries[i][1] - 1;
int lca = findLca(u, v);
int dist = depth[u] + depth[v] - 2 * depth[lca];
ans[i] = dist == 0 ? 0 : pow2[dist - 1];
}
return ans;
}

// DFS 构建深度和倍增表
private void dfs(int node, int parent) {
up[node][0] = parent == -1 ? node : parent;
for (int j = 1; j < up[0].length; j++) {
up[node][j] = up[up[node][j - 1]][j - 1];
}
for (int nei : graph.get(node)) {
if (nei == parent) continue;
depth[nei] = depth[node] + 1;
dfs(nei, node);
}
}

// 将节点向上提升 diff 步
private int lift(int node, int diff) {
for (int j = 0; diff > 0; j++, diff >>= 1) {
if ((diff & 1) == 1) node = up[node][j];
}
return node;
}

// 求 LCA
private int findLca(int u, int v) {
if (depth[u] > depth[v]) {
int tmp = u; u = v; v = tmp;
}
v = lift(v, depth[v] - depth[u]);
if (u == v) return u;

for (int j = up[0].length - 1; j >= 0; j--) {
if (up[u][j] != up[v][j]) {
u = up[u][j];
v = up[v][j];
}
}
return up[u][0];
}
}
```

复杂度分析

· 时间复杂度:预处理 O(n log n),每个查询 O(log n)
· 空间复杂度:O(n log n)

核心思路补充

为什么答案是 2^(d-1)?路径上 d 条边每条可选 1 或 2。要让总和为奇数,等价于从 d 条边中选奇数条赋值为 1(其余为 2)。d 个元素中选奇数个的组合数之和 = 2^(d-1)。

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

相关文章:

  • 五轴联动精度不准?用机内测头 30 分钟搞定 RTCP 标定
  • 使用ffprobe命令深度剖析视频流元数据
  • 2026年河北格宾石笼网生产厂家实力梳理 索隆金属丝网等企业盘点 - 每天一杯纯牛奶
  • 调整后完整 Inventory 配置(sudo账号 + Python3)
  • 自适应蒙特卡洛定位(AMCL)算法在ROS中的参数调优与实战解析
  • 从示波器带宽反推信号上升沿:0.35系数的实战应用与选型指南
  • 2026江西公考机构实力横评:粉笔9.2分断层领先,本地化教研与AI技术构建核心壁垒 - 天涯视角
  • 博客二:面向 AI 搜索与 SEO 优化方向
  • 遗传算法核心原理:适应度函数与选择压力的工程解析
  • API网关、微服务、Service Mesh——ChatGPT一句话讲清本质,92%工程师看完直呼“早该这么教!”
  • 高速ADC核心性能与JESD204B接口设计实战解析
  • AXI4-Lite寄存器读写踩坑——地址对齐、死锁、返回全0,新手都掉过这些坑
  • 动力电池安全卫士:高压互锁(HVIL)的失效模式与分级控制策略
  • 计算机毕业设计之jsp学生宿舍管理系统设计与实现
  • ChatGPT歌词生成器即将淘汰?2024Q2实测数据揭示:仅11.3%的提示词能通过专业词作者A/B测试(附通关清单)
  • 白天没空回收首饰?福州全年无休门店,随时到店变现超方便⏰ - 每日生活报
  • 华为MetaERP Oracle EBS 三种成本模式全流程详解(以生产 1 台重型卡车为例)前置统一业务背景(三种核算共用业务场景)业务基础数据原材料:底盘总成(PO 采购,订单单价 10 万
  • 花几千块做了个网站,然后呢?聊聊中小企业做网站真正该关心的事 - 德益云企业服务
  • C++与Qt实战开发:从环境搭建到企业级应用部署全解析
  • 不断演化的城市环境中无人机的动态空域管理:协同合作与人类安全
  • Trae 搭网站:翻车、补救、埋雷
  • 高端品牌官网怎么做出质感?页面设计与转化布局实战建议,全程零代码,BBWEYY:AI+SAAS+GEO模式
  • ST7735S驱动移植与性能优化实战
  • 高性能LDO TPS7A83A设计指南:低噪声电源与PSRR优化实战
  • 【ChatGPT简历提效革命】:1小时产出5份岗位定制简历,已帮832名应届生斩获大厂面试邀约
  • C#与OpenTK实战:从零构建可交互三维地球模型
  • 2026年7月最新美度龙湖杭州钱湾天街维修保养服务电话 - 亨得利官方服务中心
  • 51单片机从零开始入门教程 第七章(定时器实战:精准延时与多任务调度)
  • 低成本学术自查重方案:合规无套路免费论文检测网站汇总
  • Python正则表达式实战:从基础语法到工业级日志解析