「洛谷2495」「BZOJ3052」「SDOI2001」消耗战【虚树+树形动态规划】

题目大意

给你\(k\)个点,让这一些点和一号节点断开,删去某一些边,求最小的删去边权之和。

做题的心路历程

做了\(HG\)昨天的模拟赛,深深感觉到了窝的菜,所以为了\(A\)掉T1这一道毒瘤,窝就来学习一下虚树。
学到一半,感觉虚树的原理还是比较简单的,就是把需要求的点建一棵和原来的树长得十分相似的一棵树,然后在这个树上做\(DP\)
但是,我写到完了,就一直T。也不知道为什么。
然后删掉了所有的memset就瞬间跑了出来。原来是因为自己太怂了。。。

题解

首先如果考虑最简单的树形\(DP\)
\(f[i]\)表示以\(i\)为根节点的答案。
那么我们需要预处理出每一个节点到根节点\(1\)的最小边权设为\(me[i]\),那么就得到了\(f[i]=\sum \ min(f[i],me[i])\)
但是发现,如果每一个询问都做一遍树形\(DP\),那么一定是要炸的。
那么就对于我们需要询问的节点建立一个树,然后在这个树上跑DP。

代码

#include <bits/stdc++.h>
#pragma GCC optimize(2)
#define N 550005
#define ms(a, b) memset(a, b, sizeof(a))
#define ll long long 
#define BIT 19
using namespace std;
template <typename T> void read(T &x) {x = 0; T fl = 1; char ch = 0;for (; ch < '0' || ch > '9'; ch = getchar()) if (ch == '-') fl = -1;for (; ch >= '0' && ch <= '9'; ch = getchar()) x = (x << 1) + (x << 3) + (ch ^ 48);x *= fl;
}
struct edge { int to, nt, w; } E[N << 1];
vector<int> G[N];
int H[N], dfn[N], ispoint[N], f[N][BIT + 5], dep[N], p[N], stk[N];
ll me[N];
int cnt, __dfn, n, Q, k, top;
void add_edge(int u, int v, int w) { E[++ cnt] = (edge){v, H[u], w}; H[u] = cnt; }
bool cmp(int A, int B) { return dfn[A] < dfn[B]; }
void dfs1(int u, int fa) {f[u][0] = fa; dfn[u] = ++ __dfn; dep[u] = dep[fa] + 1;  for (int i = 1; i <= BIT; i ++) f[u][i] = f[f[u][i - 1]][i - 1];for (int e = H[u]; e; e = E[e].nt) { int v = E[e].to; if (v == fa) continue; me[v] = E[e].w; if (u != 1 && me[u] < me[v]) me[v] = me[u]; dfs1(v, u);  }
}
int lca(int u, int v) {if (dep[u] < dep[v]) swap(u, v);for (int i = BIT; ~i; i --) if (dep[f[u][i]] >= dep[v]) u = f[u][i]; if (u == v) return u;for (int i = BIT; ~i; i --) if (f[u][i] != f[v][i]) u = f[u][i], v = f[v][i];return f[u][0];
}
void insert(int u) {if (top == 1) { stk[++ top] = u; return; }int Lca = lca(u, stk[top]);if (Lca == stk[top]) { stk[++ top] = u; return; }while (top > 1 && dfn[Lca] <= dfn[stk[top - 1]]) G[stk[top - 1]].push_back(stk[top]), -- top;if (Lca != stk[top]) G[Lca].push_back(stk[top]), stk[top] = Lca; stk[++ top] = u; 
}
ll DP(int u) {ll res = 0;for (int i = 0; i < (int) G[u].size(); i ++) {int v = G[u][i]; res += min(me[v], DP(v));}G[u].clear(); if (ispoint[u]) return me[u]; else return res; 
}
int main() {read(n);  for (int i = 1, u, v, w; i < n; i ++) { read(u); read(v); read(w); add_edge(u, v, w); add_edge(v, u, w);  }__dfn = 0; dfs1(1, 0);read(Q);while (Q --) {read(k);  for (int i = 1; i <= k; i ++) read(p[i]), ispoint[p[i]] = 1; sort(p + 1, p + 1 + k, cmp);  top = 0; stk[++ top] = 1; for (int i = 1; i <= k; i ++) insert(p[i]);while (top > 0) { G[stk[top - 1]].push_back(stk[top]); top --; } printf("%lld\n", DP(1));for (int i = 1; i <= k; i ++) G[p[i]].clear(), ispoint[p[i]] = 0; G[0].clear(); }return 0;
}

转载于:https://www.cnblogs.com/chhokmah/p/10695437.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/411764.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2021年安徽普通高考考试成绩查询,安徽省教育招生考试院:2021年安徽高考查分入口、查分系统...

【摘要】为了方便安徽高考考生能及时查询到2021年高考成绩&#xff0c;高考频道特别整理了的安徽省教育招生考试院2021年安徽高考成绩查询入口、查分系统&#xff0c;考生可在成绩公布时直接点击下面的链接进行查分&#xff0c;预祝大家金榜题名&#xff01;自安徽省教育招生考…

python 比赛成绩预测_大数据新研究:用六个月的跑步记录准确预测马拉松完赛成绩...

随着疫情得到控制&#xff0c;各个城市的马拉松比赛又开始相继恢复。从线上马拉松终于可以再次到各个城市不同的赛道上奔跑&#xff0c;无疑是跑者的福音。积压了大半年的情绪&#xff0c;也激发了跑者更高的训练热情&#xff0c;带来了更多跑量的累积。而准备一场马拉松比赛&a…

[jQuery] 你知道js和jQuery是什么关系吗?

[jQuery] 你知道js和jQuery是什么关系吗&#xff1f; jQuery是js的函式庫&#xff0c;並不能稱為框架。个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

求最大素数和最小素数

#include "math.h"#include "stdio.h"/**//* ′ yo D y&#xffe1; kissrat′ 2 μ aD′ a*/voidmain(){ long m,m1,i,k; for(m100000002;m<100001000;m6){ m1m-1; ksqrt(m1); for (i3;i<k;i2)if(m1%i0) br…

Python之操作HBASE数据库

目前有两个库可以操作HBASE&#xff1a;hbase-thrift 和 happybase happybase使用起来比较简单方便&#xff0c;因此重点学习该库&#xff0c;hbase-thrift只做简要介绍。 &#xff08;一&#xff09;hbase-thrift 1、使用前先添加库和依赖库&#xff1a; pip install thrift …

fla 走迷宫游戏 源码_迷宫新玩法,果断一试

迷宫&#xff0c;真的是谜一样的存在&#xff0c;大到几十岁的成年人&#xff0c;小到三岁小儿&#xff0c;都对其没有抵抗力。而迷宫君也是真给力&#xff0c;除了能给人带来愉悦感与成就感&#xff0c;还能同时锻炼专注力、空间感、思维力、视觉追踪等&#xff0c;是儿童感统…

电脑桌面老是弹出计算机,电脑桌面老是弹出游戏怎么解决

如果玩游戏时桌面始终自动弹出&#xff0c;该怎么办&#xff1f;在360游戏模式下玩就足够了如何解决游戏在计算机上弹出的问题&#xff1f; _1首先打开我们的计算机&#xff0c;在我们的计算机桌面上找到计算机管家&#xff0c;然后单击它。 2.输入后&#xff0c;单击屏幕右下方…

[jQuery] jQuery是通过哪个方法和Sizzle选择器结合的?

[jQuery] jQuery是通过哪个方法和Sizzle选择器结合的&#xff1f; 通过创建一个div元素&#xff0c;检测被传入的fn是否被当前浏览器支bai持 function assert( fn ) { var div document.createElement("div");//此处用try-catch的原因是&#xff1a;被传入的fn很有…

用OmniPeek快速定义的过滤器来抓网页提交信息

编写网络程序的人&#xff0c;经常要抓取HTTP操作过程的一些数据&#xff0c;常用的软件有HTTPSniffer、httpLook等软件&#xff0c;这些软件比常简单&#xff0c;这儿就不作介绍了。这里重点介绍一下用OmniPeek来抓取数据包。OmniPeek 是一款非常优秀的网管软件&#xff0c;功…

类的构造器-init和new

提到构造器&#xff0c;大家都会想到 __init__&#xff0c;那么__new__是什么&#xff1f;也是构造器。 init 构造器 都很熟悉了&#xff0c;直接上代码 class MyClass(object):def __init__(self):passdef m1(self):print(3)mc MyClass() mc.m1() # 3 是不是很简单 别…

c++ dll发消息到主窗口_PyQt5学习笔记(五)窗口图形绘制

PyQt5提供了绘制图形的API&#xff0c;支持绘制&#xff1a;文本各种图形&#xff08;直线&#xff0c;点&#xff0c;椭圆&#xff0c;弧&#xff0c;扇形&#xff0c;多边形等&#xff09;图像绘制图形需要一个类QPainter。基本的绘制过程&#xff1a;# 创建QPainter对象 pai…

[jQuery] 针对jQuery性能的优化方法有哪些?

[jQuery] 针对jQuery性能的优化方法有哪些&#xff1f; show slide animate 等频繁修改 dom 很耗性能&#xff0c;可采用 jquery.transit 插件等使用单个 id 或 class 选择器当然也是优化点咯&#xff0c;元素选择器是真的会卡每次调用 $() 其实都是生成一个超大的对象&#xf…

[转] SQL Server中的行列转换问题

原表结构序号性别部门工资1男部门a8002女部门b9003男部门a4004女部门d 14005男部门e12006男部门f5007女部门a 3008男部门d10009女部门d123010女部门b200011男部门c200012男部门b1200最终显示 部门名 人数 男 女 小于800元 从800至999 从1000元至1190元 大于12…

vue-cli@2的原理解析

作为一个菜鸟&#xff0c;我有一颗好奇的心&#xff0c;每当vue init 的时候&#xff0c;看到那流畅的进度和神奇的结果&#xff0c;心里都充满一窥其本质的期望…… 以下就是我不断的console&#xff0c;大致理出来的一个流程心得&#xff0c;纪录在此&#xff0c;以作备忘。 …

怎么用计算机直接截图,电脑截图快捷键怎么使用,电脑怎么快捷键截图

我们对电脑快捷键都不陌生&#xff0c;有快捷键的帮助&#xff0c;我们可以加快电脑操作速度。那不知道大家对电脑截图快捷键有了解吗&#xff1f;下面小编就跟大家分享下电脑截图快捷键的几种使用方法。1. 首先使用电脑自带的截图。我们只需要使用快捷键【PrtScn】即可。在需要…

c语言数组指定位置插入和删除_Apache POI在指定位置插入表格

接到的需求是在模板表格的指定位置再插入表格。比如在模板的${proTable}处插入表格。依赖的包org.apache.poi poi 3.15org.apache.poi poi-ooxml 3.15插入表格由于是在表格里的指定地方插入表格&#xff0c;所以要遍历表格的每个单元格&#xff0c;查找到要插入点的占位符。// …

[jQuery] jQuery与jQuery UI有啥区别?

[jQuery] jQuery与jQuery UI有啥区别&#xff1f; 1&#xff09;jQuery是一个js库&#xff0c;主要提供的功能是选择器、属性修改和事件绑定等 2&#xff09;jQuery UI则是在jQuery的基础上&#xff0c;利用jQuery的扩展性&#xff0c;设计的插件。提供了一些常用的界面元素&a…

学习URLRewriter.dll的使用

1.添加引用 2.配置webconfig webconfig1<?xml version"1.0" encoding"utf-8"?> 2<configuration> 3 4 <configSections> 5 <section name"RewriterConfig" type"URLRewriter.Config.RewriterConfigSerializer…

高斯消元

高斯消元 高斯消元可真是复杂啊。。。。。 高斯消元求解n元一次线性方程组的板子题&#xff1a; P3389 【模板】高斯消元法 举个栗子&#xff1a; 2x y - z 8 -3x - y 2z -11-2x y 2z -3先将它存到矩阵中&#xff1a;②①* (2/3) ③① 接着对①变…

uoni扫地机器人好用吗_扫地机器人好用吗?了解性能看这篇

扫地机器人这类智能家电已经逐渐渗透到大众家庭中,尽管大家对这一品类不再陌生,但对它的性能了解并不全面。况且,市场上扫地机器人产品多不胜数,可实际使用效果和宣称效果存在较大差异。因此建议大家在选购和使用产品时要关注以下几个方面:本文引用地址&#xff1a;http://www.…