题目链接:hdu 5296 Annoying problem

先求出dfs序,然后每次修改一个节点u,找到dfs最接近u的两个点,a,b的dfs序分别大于和小于u的。修改值即为dp[u] - dp[lca(a,u)] - dp[lca(b,u)] + dp[lca(a, b)],dp[i]表示i到根节点的权值和。但集合中的节点的dfs序都大于或小于u时,a,b即用最大和最小的即可。

#include <cstdio>
#include <cstring>
#include <set>
#include <vector>
#include <algorithm>using namespace std;
const int maxn = 100005;
typedef set<int>::iterator iter;set<int> S;
int N, Q, dp[maxn], vis[maxn];
int E, first[maxn], jump[maxn * 2], link[maxn * 2], val[maxn * 2];
int id, idx[maxn], ridx[maxn], dep[maxn], top[maxn], far[maxn], son[maxn], cnt[maxn];inline void addEdge(int u, int v, int w) {link[E] = v;val[E] = w;jump[E] = first[u];first[u] = E++;
}void dfs (int u, int pre, int d, int w) {far[u] = pre;dep[u] = d;cnt[u] = 1;son[u] = 0;dp[u] = w;for (int i = first[u]; i + 1; i = jump[i]) {int v = link[i];if (v == pre)continue;dfs(v, u, d + 1, w + val[i]);cnt[u] += cnt[v];if (cnt[son[u]] < cnt[v])son[u] = v;}
}void dfs (int u, int rot) {top[u] = rot;if (son[u])dfs(son[u], rot);for (int i = first[u]; i + 1; i = jump[i]) {int v = link[i];if (v == far[u] || v == son[u])continue;dfs(v, v);}idx[u] = ++id;ridx[id] = u;
}int LCA (int u, int v) {int p = top[u], q = top[v];while (p != q) {if (dep[p] < dep[q]) {swap(p, q);swap(u, v);}u = far[p];p = top[u];}if (dep[u] > dep[v])swap(u, v);return u;
}void init () {S.clear();scanf("%d%d", &N, &Q);id = E = 0;memset(first, -1, sizeof(first));memset(vis, 0, sizeof(vis));int u, v, w;for (int i = 1; i < N; i++) {scanf("%d%d%d", &u, &v, &w);addEdge(u, v, w);addEdge(v, u, w);}dfs(1, 0, 0, 0);dfs(1, 1);
}int solve (int u) {if (S.size() == 0)return 0;int a, b;iter mv = S.upper_bound(idx[u]);if (mv == S.begin() || mv == S.end()) {a = ridx[*S.begin()];b = ridx[*S.rbegin()];} else {a = ridx[*mv];mv--;b = ridx[*mv];}return dp[u] - dp[LCA(u, a)] - dp[LCA(u, b)] + dp[LCA(a, b)];
}int main () {int cas;scanf("%d", &cas);for (int kcas = 1; kcas <= cas; kcas++) {init();printf("Case #%d:\n", kcas);int k, u, ans = 0;for (int i = 0; i < Q; i++) {scanf("%d%d", &k, &u);if (k == 1 && vis[idx[u]] == 0) {ans += solve(u);S.insert(idx[u]);vis[idx[u]] = 1;}if (k == 2 && vis[idx[u]]) {S.erase(idx[u]);vis[idx[u]] = 0;ans -= solve(u);}printf("%d\n", ans);}}return 0;
}

hdu 5296 Annoying problem(LCA)相关推荐

  1. hdu A + B Problem II(大数相加,数组实现)

    hdu A + B Problem II(大数相加,数组实现) 题目走起 注意最后一个case 不需要换行 下面代码 #include<stdio.h> #include<strin ...

  2. HDU.1001 Sum Problem

    原题 HDU.1001 Sum Problem 分类 杂题 题意 计算从1到正整数n的累加和. 输入/输出 要求与格式 输入内容 每行输入一个正整数 输出结果 结果为累加和 输出格式 每个输出结果独占 ...

  3. [HDU 5445]Food Problem[多重背包]

    题目链接:[HDU 5445]Food Problem[多重背包] 题意分析: 有n种类型的点心,每种提供t的能量,占据u的空间,有v个: 有m种类型的卡车,每种容量x,雇佣花费y,能提供z辆: 点心 ...

  4. hdu 5266(线段树+LCA)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5266 解题思路: 考虑dfs序,通过在简单的证明可知L~R的LCA为L ~R 中dfs序较小的那个位置 ...

  5. hdu 3549 Flow Problem(最大流模板题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3549 Problem Description Network flow is a well-known ...

  6. hdu 1023 Train Problem II

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1212 Train Problem II Description As we all know the ...

  7. HDU 5427 A problem of sorting 水题

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5427 A problem of sorting Time Limit: 2000/1000 MS ( ...

  8. HDU - 3078 Network 倍增LCA

    倍增lca,把路径上点全部拉出来拍个序输出第k大就过了. 不知道怎么过的,咱也不敢问. #include<stdio.h> #include<string.h> #includ ...

  9. HDU 1022[Train Problem I] 栈的应用

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1022 题目大意:一列序列为s1的车厢是否能通过车站的中转以序列s2出站.白皮上有. 关键思想:栈的应用 ...

  10. HDU 3549 Flow Problem (dinic模版 isap模版)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3549 题意: 给你一个有向图,问你1到n的最大流. dinic模版 (n*n*m) 1 #includ ...

最新文章

  1. 刷爆 AI 圈!基于 Transformer 的 DALL-E 代码刚刚开源了
  2. 生猛!PDF 版本 6000 页 Java 手册开放下载!
  3. 测试规范包括哪些_光学会自动化测试还不够?还差最后这一步!
  4. Android 显示、隐藏状态栏和导航栏
  5. ROS系统 launch启动文件的使用方法
  6. AngularJs应用页面切换优化方案
  7. 成功案例_APP成功推广案例
  8. Matlab 中prod函数的使用
  9. Android View.onMeasure方法的理解
  10. 说好的 All in AI,没想到科技巨头们都开始偷偷的挖矿中!
  11. Python2.X和Python3.X文件对话框、下拉列表的不同
  12. ajax登录返回token,AJAX安全-Session做Token
  13. 618号外:MS08067安全实验室也做安全培训了
  14. 上一周,小白的我试着搭建了两个个人博客:在github和openshift上
  15. 【强烈推荐】ProxyPool-快速构建免费代理池
  16. 新浪云服务器配置说明(java+mysql)
  17. 蜘蛛程序php,php模仿百度spider蜘蛛爬虫程序例子
  18. Linux下CP命令的使用!
  19. 基于贝叶斯算法的邮件过滤管理系统的设计和实现(Vue+SpringBoot)
  20. 大数据处理Spark:SparkStreaming--scala

热门文章

  1. 安卓手机如何打开.crx文件_crx文件怎么打开
  2. Cocos--开启物理
  3. 全球及中国乙氧基化烷基硫酸钠行业运行态势与需求趋势预测报告(2022~2027年)
  4. 1-十四烷基-3-甲基咪唑六氟磷酸盐([C14MIm][PF6])修饰纳米SiO2二氧化硅(mg级瓶装)
  5. ServerSocket与Socket入门详解
  6. 分享Nexus桌面插件的安装及使用,超级好看、好用的插件。附下载链接。
  7. 【笑话】程序员和青蛙公主
  8. 小白wwwhjw1688com18587065666学习pytorch环境搭建
  9. 十一新疆之旅中邂逅的一首诗《黄河,母亲之河》
  10. 麦克劳林公式求sin