CF613D Kingdom and its Cities 虚树 树形dp 贪心
发现是一个树上关键点问题 所以考虑虚树刚好也有标志\(\sum k\leq 100000\)即关键点总数的限制。
首先当k==1时 答案显然为0。
然后考虑无解情况 容易发现这种情况是两个点同时为关键点 那么我们只需要判断是否存在两个点相连的情况就好了。
这个可以在建立虚树时候判断 我多此一举了 直接标记父亲然后判断父亲是否存在。
接下来考虑如何统计答案。
可以从下往上观察 在某个点处统计儿子们的贡献。
假设儿子都是关键点 考虑当前点是否是关键点 如果是 显然都得断开一遍。且向上传递的时候这个点是关键点。
如果当前不是 那么如果有>1个儿子 那么在当前断开显然是比较优的且向上传递的时候这个点不是关键点、
如果只有一个儿子 可以在当前断开 不过更优的是可以去上面断开这个结果不会更差。
其实就这三种情况(类似dp 可以发现第一个决策时固定的 第二个决策是最优的 第三个决策根据不会更差的那套理论 可以发现也是最优的。
注意特判 有效儿子为0的情况.
code
//#include<bits\stdc++.h>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<string>
#include<ctime>
#include<cmath>
#include<cctype>
#include<cstdlib>
#include<queue>
#include<deque>
#include<stack>
#include<vector>
#include<algorithm>
#include<utility>
#include<bitset>
#include<set>
#include<map>
#define ll long long
#define db double
#define INF 1000000000
#define ldb long double
#define pb push_back
#define put_(x) printf("%d ",x);
#define get(x) x=read()
#define gt(x) scanf("%d",&x)
#define gi(x) scanf("%lf",&x)
#define put(x) printf("%d\n",x)
#define putl(x) printf("%lld\n",x)
#define gc(a) scanf("%s",a+1)
#define rep(p,n,i) for(RE int i=p;i<=n;++i)
#define go(x) for(int i=lin[x],tn=ver[i];i;tn=ver[i=nex[i]])
#define fep(n,p,i) for(RE int i=n;i>=p;--i)
#define vep(p,n,i) for(RE int i=p;i<n;++i)
#define pii pair<int,int>
#define mk make_pair
#define RE register
#define P 1000000007
#define gf(x) scanf("%lf",&x)
#define pf(x) ((x)*(x))
#define uint unsigned long long
#define ui unsigned
#define EPS 1e-8
#define sq sqrt
#define S second
#define F first
using namespace std;
char buf[1<<15],*fs,*ft;
inline char getc()
{
return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;
}
inline int read()
{
RE int x=0,f=1;RE char ch=getc();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getc();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getc();}
return x*f;
}
const int MAXN=100010;
int n,Q,len,cnt,ans,top;
int f[MAXN][20],Log[MAXN],dfn[MAXN],d[MAXN];
int lin[MAXN],ver[MAXN<<1],nex[MAXN<<1];
int a[MAXN],vis[MAXN],s[MAXN],v[MAXN];
vector<int>g[MAXN];
inline int cmp(int x,int y){return dfn[x]<dfn[y];}
inline void add(int x,int y)
{
ver[++len]=y;
nex[len]=lin[x];
lin[x]=len;
}
inline void dfs(int x,int fa)
{
dfn[x]=++cnt;d[x]=d[fa]+1;f[x][0]=fa;
rep(1,Log[d[x]],i)f[x][i]=f[f[x][i-1]][i-1];
for(int i=lin[x];i;i=nex[i])
{
int tn=ver[i];
if(tn==fa)continue;
dfs(tn,x);
}
}
inline int LCA(int x,int y)
{
if(d[x]>d[y])swap(x,y);
fep(Log[d[y]],0,i)if(d[f[y][i]]>=d[x])y=f[y][i];
if(x==y)return x;
fep(Log[d[x]],0,i)if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
return f[x][0];
}
inline void insert(int x)
{
if(top==1)return s[++top]=x,void();
int lca=LCA(s[top],x);
if(s[top]==lca)return s[++top]=x,void();
while(top>1&&dfn[s[top-1]]>=dfn[lca])
{
g[s[top-1]].pb(s[top]);
--top;
}
if(s[top]!=lca)
{
g[lca].pb(s[top]);
s[top]=lca;
}
s[++top]=x;
}
inline void dp(int x)
{
int mark=0;
vep(0,g[x].size(),i)
{
int tn=g[x][i];
dp(tn);
if(!v[tn])continue;
if(v[x])++ans;
else ++mark;
v[tn]=0;
}
if(!v[x])
{
if(mark==1)v[x]=1;
else ++ans;
}
g[x].clear();
}
int main()
{
//freopen("1.in","r",stdin);
get(n);
rep(2,n,i)
{
int get(x),get(y);
add(x,y);add(y,x);
Log[i]=Log[i>>1]+1;
}
dfs(1,0);get(Q);
rep(1,Q,T)
{
int get(k),flag=0;
rep(1,k,i)get(a[i]),vis[f[a[i]][0]]=1;
rep(1,k,i)if(vis[a[i]])flag=1;
rep(1,k,i)vis[f[a[i]][0]]=0;
if(k==1){puts("0");continue;}
if(flag){puts("-1");continue;}
sort(a+1,a+1+k,cmp);v[a[1]]=1;
s[top=1]=1;if(a[1]!=1)insert(a[1]);
rep(2,k,i)insert(a[i]),v[a[i]]=1;
while(top>1)g[s[top-1]].pb(s[top]),--top;
ans=0;dp(1);put(ans);v[1]=0;
}
return 0;
}
</details>
CF613D Kingdom and its Cities 虚树 树形dp 贪心的更多相关文章
- 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 虚树
传送门 $\sum k \leq 100000$虚树套路题 设$f_{i,0/1}$表示处理完$i$以及其所在子树的问题,且处理完后$i$所在子树内是否存在$1$个关键点满足它到$i$的路径上不存在任 ...
- 【BZOJ-3572】世界树 虚树 + 树形DP
3572: [Hnoi2014]世界树 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1084 Solved: 611[Submit][Status ...
- 【BZOJ-2286】消耗战 虚树 + 树形DP
2286: [Sdoi2011消耗战 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2120 Solved: 752[Submit][Status] ...
- bzoj 2286(虚树+树形dp) 虚树模板
树链求并又不会写,学了一发虚树,再也不虚啦~ 2286: [Sdoi2011]消耗战 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 5002 Sol ...
- BZOJ_2286_[Sdoi2011]消耗战_虚树+树形DP+树剖lca
BZOJ_2286_[Sdoi2011]消耗战_虚树+树形DP Description 在一场战争中,战场由n个岛屿和n-1个桥梁组成,保证每两个岛屿间有且仅有一条路径可达.现在,我军已经侦查到敌军的 ...
- BZOJ5341[Ctsc2018]暴力写挂——边分治+虚树+树形DP
题目链接: CSTC2018暴力写挂 题目大意:给出n个点结构不同的两棵树,边有边权(有负权边及0边),要求找到一个点对(a,b)满足dep(a)+dep(b)-dep(lca)-dep'(lca)最 ...
- [WC2018]通道——边分治+虚树+树形DP
题目链接: [WC2018]通道 题目大意:给出三棵n个节点结构不同的树,边有边权,要求找出一个点对(a,b)使三棵树上这两点的路径权值和最大,一条路径权值为路径上所有边的边权和. 我们按照部分分逐个 ...
随机推荐
- css可以修改超链接颜色吗?
超链接a标签大家都应该很熟悉,这篇文章主要的讲的是a标签的基础css样式设置,下面我们来看一下css修改超链接颜色的方法. css可以使用下面几个伪类来设置超链接: a:link :是未被访问的样式, ...
- salesman,动态规划带一点点贪心。
题目直接链接 分析一下: 这题题意还是比较明白的(少见的一道中文题),他的意思就是:有这么一个无向图:保证联通且点与点直接有唯一的简单路径(说白了就是棵树,根节点是1),每个节点有一个权值(有正有负) ...
- Python 最强 IDE 详细使用指南!
PyCharm 是一种 Python IDE,可以帮助程序员节约时间,提高生产效率.那么具体如何使用呢?本文从 PyCharm 安装到插件.外部工具.专业版功能等进行了一一介绍,希望能够帮助到大家.作 ...
- c++ 数字与字符串的相互转换
首先推荐用用C++的stringstream. 主要原因是操作简单. 0x00 字符串转数字 // zcj_14.cpp : //该程序是一个注册机,原理是对输入的字符每个与2求异或的结果取低位即为注 ...
- day15 作业
day15 作业 目录 day15 作业 第一题 第二题 第三题 第四题 第五题 第六题 第七题 第一题 ===================题目一=================== input ...
- Linux07 /redis的配置、五大数据类型、发布订阅、持久化、主从复制、哨兵配置、集群搭建
Linux07 /redis的配置.五大数据类型.发布订阅.持久化.主从复制.哨兵配置.集群搭建 目录 Linux07 /redis的配置.五大数据类型.发布订阅.持久化.主从复制.哨兵配置.集群搭建 ...
- 微信小程序动态修改title,动态配置title,动态配置头部,微信小程序动态配置头部
微信小程序的title是在json里面配置的 "navigationBarTitleText": "title名称" 这种title是固定死的不灵活处理一些页面 ...
- 证明:ThreadLocal的get,set方法无法防止内存泄漏
先给出结论:get,set两个方法都不能完全防止内存泄漏,还是每次用完ThreadLocal都勤奋的remove一下靠谱. 前言: 看到有的博客说在把ThreadLocal的所有强引用置空前,调用 ...
- 媳妇儿喜欢玩某音中的动漫特效,那我就用python做一个图片转化软件。
最近某音上的动漫特效特别火,很多人都玩着动漫肖像,我媳妇儿也不例外.看着她这么喜欢这个特效,我决定做一个图片处理工具,这样媳妇儿的动漫头像就有着落了.编码 为了快速实现我们的目标,我们 ...
- J.U.C体系进阶(四):juc-sync 同步器框架
Java - J.U.C体系进阶 作者:Kerwin 邮箱:806857264@qq.com 说到做到,就是我的忍道! juc-sync 同步器框架 同步器名称 作用 CountDownLatch 倒 ...