CF613D Kingdom and its Cities 虚树
$\sum k \leq 100000$虚树套路题
设$f_{i,0/1}$表示处理完$i$以及其所在子树的问题,且处理完后$i$所在子树内是否存在$1$个关键点满足它到$i$的路径上不存在任何点被封的最小代价。
转移考虑$i$是否是关键点以及是否封$i$号点。
注意判断相邻两个点同时是关键点的情况。同时需要注意:如果虚树上两个点不相邻,可以封这两个点之间的点。
#include<bits/stdc++.h> //This code is written by Itst using namespace std; inline int read(){ ; ; char c = getchar(); while(c != EOF && !isdigit(c)){ if(c == '-') f = ; c = getchar(); } while(c != EOF && isdigit(c)){ a = (a << ) + (a << ) + (c ^ '); c = getchar(); } return f ? -a : a; } ; struct Edge{ int end , upEd; }Ed[MAXN << ] , newEd[MAXN]; ] , newHead[MAXN] , s[MAXN] , dfn[MAXN] , num[MAXN] , dp[MAXN][] , dep[MAXN]; int N , headS , cntEd , cntNewEd , ts , cnt; bool imp[MAXN]; inline void addEd(Edge* Ed , int* head , int& cntEd , int a , int b){ Ed[++cntEd].end = b; Ed[cntEd].upEd = head[a]; head[a] = cntEd; } void init(int now , int fa){ dfn[now] = ++ts; dep[now] = dep[fa] + ; jump[now][] = fa; ; jump[now][i - ] ; ++i) jump[now][i] = jump[jump[now][i - ]][i - ]; for(int i = head[now] ; i ; i = Ed[i].upEd) if(Ed[i].end != fa) init(Ed[i].end , now); } inline int jumpToLCA(int x , int y){ if(dep[x] < dep[y]) swap(x , y); ; i >= ; --i) << i) >= dep[y]) x = jump[x][i]; if(x == y) return x; ; i >= ; --i) if(jump[x][i] != jump[y][i]){ x = jump[x][i]; y = jump[y][i]; } ]; } inline void create(){ imp[] = ; dp[][] = dp[][] = ; ; i <= cnt ; ++i){ imp[num[i]] = ; dp[num[i]][] = ; dp[num[i]][] = N + ; } ; i <= cnt ; ++i) if(!headS) s[++headS] = num[i]; else{ int t = jumpToLCA(s[headS] , num[i]); if(t != s[headS]){ ]] > dep[t]){ addEd(newEd , newHead , cntNewEd , s[headS - ] , s[headS]); --headS; } addEd(newEd , newHead , cntNewEd , t , s[headS]); if(s[--headS] != t) s[++headS] = t; } s[++headS] = num[i]; } ){ addEd(newEd , newHead , cntNewEd , s[headS - ] , s[headS]); --headS; } ) addEd(newEd , newHead , cntNewEd , , s[headS]); --headS; } void dfs(int now){ ; for(int i = newHead[now] ; i ; i = newEd[i].upEd){ int t = newEd[i].end; dfs(t); if(imp[now]) ] == now) dp[now][] += dp[t][]; else dp[now][] += min(dp[t][] , dp[t][] + ); else{ ] == now) dp[now][] = min(sum + dp[t][] , dp[now][] + dp[t][]); else dp[now][] = min(sum + dp[t][] , dp[now][] + min(dp[t][] , dp[t][] + )); ] == now) sum += dp[t][]; else sum += min(dp[t][] , dp[t][] + ); } ] > N) dp[now][] = N + ; ) sum = N + ; } sum = ; for(int i = newHead[now] ; i ; i = newEd[i].upEd){ int t = newEd[i].end; if(!imp[now]){ sum += min(dp[t][] , dp[t][]); dp[now][] += dp[t][]; } dp[t][] = dp[t][] = imp[t] = ; } if(!imp[now]) dp[now][] = min(dp[now][] , sum + ); newHead[now] = ; } bool cmp(int a , int b){ return dfn[a] < dfn[b]; } int main(){ #ifndef ONLINE_JUDGE freopen("613D.in" , "r" , stdin); //freopen("613D.out" , "w" , stdout); #endif N = read(); ; i < N ; ++i){ int a = read() , b = read(); addEd(Ed , head , cntEd , a , b); addEd(Ed , head , cntEd , b , a); } init( , ); for(int M = read() ; M ; --M){ cnt = read(); ; i <= cnt ; ++i) num[i] = read(); sort(num + , num + cnt + , cmp); create(); dfs(); ][] , dp[][]); printf( ? - : t); } ; }
CF613D Kingdom and its Cities 虚树的更多相关文章
- CF613D Kingdom and its Cities 虚树 树形dp 贪心
LINK:Kingdom and its Cities 发现是一个树上关键点问题 所以考虑虚树刚好也有标志\(\sum k\leq 100000\)即关键点总数的限制. 首先当k==1时 答案显然为0 ...
- CF613D Kingdom and its Cities 虚树 + 树形DP
Code: #include<bits/stdc++.h> #define ll long long #define maxn 300003 #define RG register usi ...
- 【CF613D】Kingdom and its Cities 虚树+树形DP
[CF613D]Kingdom and its Cities 题意:给你一棵树,每次询问给出k个关键点,问做多干掉多少个非关键点才能使得所有关键点两两不连通. $n,\sum k\le 10^5$ 题 ...
- CF613D:Kingdom and its Cities(树形DP,虚树)
Description 一个王国有n座城市,城市之间由n-1条道路相连,形成一个树结构,国王决定将一些城市设为重要城市. 这个国家有的时候会遭受外敌入侵,重要城市由于加强了防护,一定不会被占领.而非重 ...
- CF613D Kingdom and its Cities(虚树+贪心)
很休闲的一个题啊 其实一看到关于\(\sum k\)的限制,就知道是个虚树的题了 首先我们把虚树建出来,然后考虑怎么计算个数呢? 我们令\(f[x]\)表示以\(x\)的子树中,剩余了多少个还没有切断 ...
- [CF613D]Kingdom and its Cities
description 题面 data range \[n, q,\sum k\le 10^5\] solution 还是虚树的练手题 \(f[0/1][u]\)表示\(u\)的子树内,\(u\)是否 ...
- 【CF613D】Kingdom and its Cities(虚树,动态规划)
[CF613D]Kingdom and its Cities(虚树,动态规划) 题面 洛谷 CF 翻译洛谷上有啦 题解 每次构建虚树,首先特判无解,也就是关键点中存在父子关系. 考虑\(dp\),设\ ...
- CodeForces - 613D:Kingdom and its Cities(虚树+DP)
Meanwhile, the kingdom of K is getting ready for the marriage of the King's daughter. However, in or ...
- Codeforces Round #613 Div.1 D.Kingdom and its Cities 贪心+虚树
题目链接:http://codeforces.com/contest/613/problem/D 题意概述: 给出一棵树,每次询问一些点,计算最少删除几个点可以让询问的点两两不连通,无解输出-1.保证 ...
随机推荐
- 【读书笔记】iOS-优化iOS Web应用
一,代码优化: 代码优化是任何优化技术的第一步,因为归根结底网页上的一切都是构建在代码之上的.优秀的代码可以节省宽带,减少渲染延迟,以及提高页面的可读性和长远的可维护性.下面列出了一些在Web应用中编 ...
- MIPS 安全相关paper阅读笔记
前言 论文来自 https://cyber-itl.org/2018/12/07/a-look-at-home-routers-and-linux-mips.html Linux_MIPS_mis ...
- JAVA 设计模式遵循的六大基本准则
JAVA 设计模式遵循的六大基本准则 一.单一职责原则:(Single Responsibility Pinciple) 一个类只负责一项职责. 当超过一项职责需要负责时,需要增加新的类来负责新的职 ...
- 三步搞定Centos 7 上特定版本的 docker 安装
由于国内网络原因,使用centos的用户yum源常用国内的阿里云.现在把centos7上安装docker的详细过程记录如下: 一.配置centos7的yum源(阿里云) 1.cd /etc/yum. ...
- Java——语句
空语句: ; 符合语句:{} if语句:if () {} else {} break 语句:跳出单层循环 循环语句:for(;;){} do{}while()
- 总结Hibernate4.1+版本与Hibernate3.3+版本区别
利用休假时间好好学习了当今流行的ORMapping框架-Hibernate,看完了马士兵老师经典的Hibernate视频教程,也算是小小入门了吧. 马老师在讲课中使用的Hibernate版本是3.3. ...
- 高通 sensor 从native到HAL
app注册传感器监听 Android Sensor Framework 的整体架构如下图所示: 前几篇sensor相关的文章介绍了sensor的hal的知识,以press_sensor实时显示气压坐标 ...
- cc1plus.exe: error: unrecognized command line option "-fno-keep-inline-dllexport "
在Windows环境下的控制台上,通过qmake指令编译Qt程序时,出现 cc1plus.exe: error: unrecognized command line option "-fno ...
- C++基础算法学习——熄灯问题
有一个由按钮组成的矩阵, 其中每行有6个按钮, 共5行– 每个按钮的位置上有一盏灯– 当按下一个按钮后, 该按钮以及周围位置(上边, 下边,左边, 右边)的灯都会改变状态26熄灯问题 POJ1222– ...
- January 26th, 2018 Week 04th Friday
A great forest is set on fire by a small spark. 最小的火能点着最大的树林. It is just a spark, but it is enough t ...