<虚树+树型DP> SDOI2011消耗战

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>using namespace std;typedef long long LL;
const int MAXN = 25e4 + 10;inline LL in()
{LL x = 0, flag = 1; char ch = getchar();while (ch < '0' || ch > '9') { if (ch == '-') flag = 1; ch = getchar(); }while (ch >= '0' && ch <= '9') x = (x << 3) + (x << 1) + (ch ^ 48), ch = getchar();return x * flag;
}int n, m;struct Gra
{int head[MAXN], nume;struct Adj { int nex, to; LL w; } adj[MAXN << 1] ;void clear(){memset(head, 0, sizeof head);nume = 0;}void addedge(int from, int to, LL w){adj[++ nume] = (Adj) { head[from], to, w } ;head[from] = nume ;}void link(int from, int to, LL w){addedge(from, to, w);addedge(to, from, w);}
} g[2];
int dep[MAXN], up[21][MAXN], lg[MAXN], dfn[MAXN], ind;
LL mn[MAXN];
void DFS(int u, int fa)
{dfn[u] = ++ ind;dep[u] = dep[fa] + 1;up[0][u] = fa;for (int i = 1; (1 << i) <= dep[u]; ++ i)up[i][u] = up[i - 1][up[i - 1][u]];for (int i = g[0].head[u]; i; i = g[0].adj[i].nex){int v = g[0].adj[i].to;if (v == fa) continue;mn[v] = min(mn[u], g[0].adj[i].w);DFS(v, u);}
}
int lca(int x, int y)
{if (dep[x] > dep[y]) swap(x, y);while (dep[x] != dep[y]) y = up[lg[dep[y] - dep[x]]][y];if (x == y) return x;for (int i = lg[dep[x]]; i >= 0; -- i)if (up[i][x] != up[i][y]) x = up[i][x], y = up[i][y];return up[0][x];
}int key[MAXN], stk[MAXN], top;
bool iskey[MAXN];
void insert(int u)
{if (top == 1) return  (void) (stk[++ top] = u);int LCA = lca(u, stk[top]);if (LCA == stk[top]) return (void) (stk[++ top] = u);while (top > 1 && dep[LCA] <= dep[stk[top - 1]]){g[1].addedge(stk[top - 1], stk[top], 0);-- top;}if (LCA != stk[top]) g[1].addedge(LCA, stk[top], 0), stk[top] = LCA;stk[++ top] = u;
}
LL search(int u)
{LL ret = 0;for (int i = g[1].head[u]; i; i = g[1].adj[i].nex){int v = g[1].adj[i].to;ret += search(v);}if (iskey[u] || ret > mn[u] * 1LL) ret = mn[u];iskey[u] = false; g[1].head[u] = 0;return ret;
}bool cmp(int x, int y) { return dfn[x] < dfn[y]; }int main()
{n = in();for (int i = 1; i <= n; ++ i) lg[i] = lg[i - 1] + ((2 << lg[i - 1]) == i);for (int i = 1; i < n; ++ i){int u = in(), v = in(); LL w = in();g[0].link(u, v, w);}mn[1] = 1e18;DFS(1, 0);m = in();while (m --){int q = in();for (int i = 1; i <= q; ++ i) key[i] = in(), iskey[key[i]] = true ;sort(key + 1, key + q + 1, cmp);top = 0;stk[++ top] = 1;for (int i = 1; i <= q; ++ i) insert(key[i]);while (top > 1) g[1].addedge(stk[top - 1], stk[top], 0), -- top;g[1].nume = 0;printf("%lld\n", search(1));}return 0;
}

转载于:https://www.cnblogs.com/ikihsiguoyr/p/10805036.html

虚树+树型DP SDOI2011消耗战相关推荐

  1. P2495 [SDOI2011]消耗战(树形dp+虚树)

    P2495 [SDOI2011]消耗战 树形dp 状态表示:fuf_ufu​表示以uuu为根的子树中,uuu节点与子树中的关键的"隔开"所需要的最小代价 状态转移: 考虑uuu的一 ...

  2. 洛谷P2495 [SDOI2011]消耗战(虚树dp)

    P2495 [SDOI2011]消耗战 题目链接 题解: 虚树\(dp\)入门题吧.虚树的核心思想其实就是每次只保留关键点,因为关键点的dfs序的相对大小顺序和原来的树中结点dfs序的相对大小顺序都是 ...

  3. BZOJ2286: [Sdoi2011]消耗战(虚树)

    BZOJ2286: [Sdoi2011]消耗战 Time Limit: 20 Sec Memory Limit: 512 MB Description 在一场战争中,战场由n个岛屿和n-1个桥梁组成, ...

  4. 「Luogu2495」 [SDOI2011]消耗战 虚树

    Luogu P2495 [SDOI2011]消耗战 problem Solution 苦思冥想稍作思考之后可以得到一个树形DP的方法: 令\(w(u,v)\)表示u,v之间的边的权值,\(f[u]\) ...

  5. 洛谷P2495 [SDOI2011]消耗战 | 一个典型的可以搞懂虚树的例题

    题目链接 题目大意: 给出一棵树,之后对这棵树进行q次询问,每次询问一个点集,给出使得这些点集中的点都不能直接或者间接的与1相连,需要删边的最小代价(边的代价在给树的时候给出),,点集不包含1,点集总 ...

  6. 其他OJ 树型DP 选课

    在朱全民的PPT介绍的一个树型DP经典题,<选课>,中文题目,不结束 找了很久找到了可以提交的OJ,重庆八中 http://www.cqoi.net:2012/JudgeOnline/pr ...

  7. 【树型DP】BZOJ1564 二叉查找树(noi2009)

    标签: 二叉查找树 [题目描述] 已知一棵特殊的二叉查找树.根据定义,该二叉查找树中每个结点的数据值都比它左儿子结点的数据值大,而比它右儿子结点的数据值小. 另一方面,这棵查找树中每个结点都有一个权值 ...

  8. 【树型DP】加分二叉树

    问题 b: [树型DP]加分二叉树 时间限制: 1 Sec  内存限制: 64 MB 提交: 8  解决: 6 [提交] [状态] [讨论版] [命题人:admin] 题目描述 科技忽略了过程就是魔法 ...

  9. 二叉苹果树(树型DP+背包)

    二叉苹果树 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点).这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1. 我们用一根树枝两端连接的结点的编号 ...

最新文章

  1. ios开发趋势_2020年将成为iOS应用开发的主要趋势
  2. 《Node.js区块链开发》一3.5 亿书对DPoS机制的改进
  3. linux筛选之后备份到命令,linux find 命令使用备份
  4. linux文件夹重命名busy,Linux下执行程序出现 Text file busy 提示时的解决方法
  5. Spring boot入门(三):集成AdminLTE(Freemarker),结合generate代码生成器,利用DataTable和PageHelper分页...
  6. .Net魔法堂:发个带附件的邮件
  7. C语言项目-俄罗斯方块
  8. 基于Linux的小项目-在线词典
  9. erstudio连接mysql_ERStudio的使用
  10. 基于pytorch实现线性回归
  11. java中分解json数据,java解析JSON数据详解
  12. 单片机c语言6种开方,单片机快速开平方的算法
  13. 使oracle支持dbo,Oracle.ManagedDataAccess.EntityFramework – ORA-01918:用户’dbo’不存在
  14. 墨菲定律 Murphy’s Law
  15. git学习之时光穿梭机
  16. python 多态app_Python——多态
  17. 苹果笔记本安装双系统windows7,无法分区
  18. Chatbot-检索式模型介绍(三)
  19. [MAUI]模仿微信“按住-说话”的交互实现
  20. glibc detected *** double free 错误解决方法

热门文章

  1. matlab 求向量的交集_从零开始的matlab学习笔记——(16)函数绘图
  2. tidyr | 批量处理数据的前奏——数据嵌套化
  3. 验证时间php,php中时间日期验证函数
  4. go设置后端启动_Go语言基础(十四)
  5. 零基础如何学习ui设计?
  6. 前端多行文本溢出问题解决方案
  7. 如何规划前端工程师职业发展路线?
  8. ggbiplot设置分组_比PCA更好用的监督排序—LDA分析、作图及添加置信-ggord
  9. 女生可以学计算机应用吗,我是女生 学计算机应用技术还是软体技术
  10. 嗅觉计算机应用,sensonic计算机嗅觉分析仪