luogu P4606 [SDOI2018]战略游戏
LINK:战略游戏
一道很有价值的题目。这道题 一张无向联通图 每次询问给出K个关键点 问摧毁图中哪个点可以使得这K个关键的两两之间有一对不能联通 去掉的这个点不能是关键点 求方案数。
可以发现 当K==2的时候 我们从一个点到另外一个点 能摧毁的必然是关键点 一张无向联通图 如果是关键点的话 那么必然不存在另外一条路径 所以这个关键点符合割点的定义 我们只需要求出路径上有多少个割点即可。
考虑 K个点怎么做 可以发现建出圆方树 这样两点之间的割点数量就是圆方树上圆点数量。那么我们只要建出虚树按边来统计答案即可。
更简便的是我们K个点按dfs序排序后 两两之间的路径形成了整体的两倍。不需要建虚树直接计算即可。
考虑这是点权 并非边权 所以我们把点权放到边权上 显然是放到父亲的那个边上。这样统计下来可以发现只有最上方的公共LCA没有被统计到 加上即可。
最上方LCA 显然是深度最浅的所以我们可以比大小得出 更简便的是 考虑dfs序 可以发现 LCA为第一个点和最后一个点的LCA。
坑点:多组数据 清空一定要清空好 多测不清空 爆零两行泪。我就是以为自己清空了 结果没清空干净导致GG 调了2h硬是没看出来哪错了。
我的倍增数组f 没有清空我以为不用清空其实是需要的 在倍增的时候可能有上次的信息 导致找不到LCA 这点值得特殊注意。
const int MAXN=200010;
int T,n,Q,m,len,cnt,id,top,sum;
int dfn[MAXN],f[MAXN][20],Log[MAXN],low[MAXN],d[MAXN],s[MAXN];
int lin[MAXN],ver[MAXN<<1],nex[MAXN<<1],v[MAXN],a[MAXN];
vector<int>g[MAXN];
inline void cle()
{
id=top=len=cnt=0;
rep(1,200000,i)lin[i]=0,g[i].clear(),dfn[i]=0,v[i]=0,low[i]=0;
}
inline int cmp(int a,int b){return dfn[a]<=dfn[b];}
inline void add(int x,int y)
{
ver[++len]=y;
nex[len]=lin[x];
lin[x]=len;
}
inline void dfs(int x)//构建圆方树
{
dfn[x]=low[x]=++cnt;
s[++top]=x;
for(int i=lin[x];i;i=nex[i])
{
int tn=ver[i];
if(!dfn[tn])
{
dfs(tn);
low[x]=min(low[x],low[tn]);
if(dfn[x]==low[tn])//x为近似割点
{
++id;
for(int j=0;j!=tn;--top)
{
j=s[top];
g[id].pb(j);
}
g[x].pb(id);
}
}
else low[x]=min(low[x],dfn[tn]);
}
}
inline int LCA(int x,int y)
{
if(d[x]<d[y])swap(x,y);
for(int i=Log[d[x]];i>=0;--i)
if(d[f[x][i]]>=d[y])x=f[x][i];
if(x==y)return x;
for(int i=Log[d[x]];i>=0;--i)
if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
return f[x][0];
}
inline void dp(int x,int fa)
{
d[x]=d[fa]+1;dfn[x]=++cnt;
//if(T==0){++sum;cout<<d[x]<<' '<<sum<<endl;}
v[x]=v[fa]+(x<=n);f[x][0]=fa;
rep(1,19,i)f[x][i]=f[f[x][i-1]][i-1];
if(!g[x].size())return;
rep(0,g[x].size()-1,i)
{
int tn=g[x][i];
dp(tn,x);
}
}
int main()
{
freopen("1.in","r",stdin);
get(T);
rep(2,200000,i)Log[i]=Log[i>>1]+1;
while(T--)
{
get(n);get(m);
cle();id=n;
rep(1,m,i)
{
int x,y;
get(x);get(y);
add(x,y);add(y,x);
}
dfs(1);
cnt=0;//put(id);
dp(1,0);
get(Q);
//rep(1,id,i)put(v[i]);
//if(top!=1){puts("ww");return 0;}
rep(1,Q,i)
{
int x;get(x);
rep(1,x,j)get(a[j]);
sort(a+1,a+1+x,cmp);
int ans=0;a[x+1]=a[1];
int minn=INF,p=0;
rep(1,x,j)
{
int lca=LCA(a[j],a[j+1]);
if(d[lca]<minn)minn=d[lca],p=lca;
ans+=v[a[j]]+v[a[j+1]]-v[lca]*2;
}
//put(ans);
ans+=(p<=n)*2;
ans=ans>>1;ans-=x;
put(ans);
}
}
return 0;
}
luogu P4606 [SDOI2018]战略游戏的更多相关文章
- Luogu P4606 [SDOI2018] 战略游戏 圆方树 虚树
https://www.luogu.org/problemnew/show/P4606 把原来的图的点双联通分量缩点(每个双联通分量建一个点,每个割点再建一个点)(用符合逻辑的方式)建一棵树(我最开始 ...
- [bzoj5329] P4606 [SDOI2018]战略游戏
P4606 [SDOI2018]战略游戏:广义圆方树 其实会了圆方树就不难,达不到黑,最多算个紫 那个转换到圆方树上以后的处理方法,画画图就能看出来,所以做图论题一定要多画图,并把图画清楚点啊!! 但 ...
- 洛谷P4606 [SDOI2018]战略游戏 【圆方树 + 虚树】
题目链接 洛谷P4606 双倍经验:弱化版 题解 两点之间必经的点就是圆方树上两点之间的圆点 所以只需建出圆方树 每次询问建出虚树,统计一下虚树边上有多少圆点即可 还要讨论一下经不经过根\(1\)的情 ...
- 洛谷P4606 [SDOI2018]战略游戏 [广义圆方树]
传送门 思路 先考虑两点如何使他们不连通. 显然路径上所有的割点都满足条件. 多个点呢?也是这样的. 于是可以想到圆方树.一个点集的答案就是它的虚树里圆点个数减去点集大小. 可以把点按dfs序排序,然 ...
- bzoj5315/luoguP4517 [SDOI2018]战略游戏(圆方树,虚树)
bzoj5315/luoguP4517 [SDOI2018]战略游戏(圆方树,虚树) bzoj Luogu 题目描述略(太长了) 题解时间 切掉一个点,连通性变化. 上圆方树. $ \sum |S| ...
- [SDOI2018]战略游戏 圆方树,树链剖分
[SDOI2018]战略游戏 这题是道路相遇(题解)的升级版,询问的两个点变成了\(S\)个点. LG传送门 还是先建出圆方树,考虑对于询问的\(S\)个点,答案就是圆方树上能包含这些点的最小连通块中 ...
- BZOJ5329: [SDOI2018]战略游戏——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5329 https://www.luogu.org/problemnew/show/P4606 省选 ...
- [BZOJ5329][SDOI2018]战略游戏
bzoj luogu Description 省选临近,放飞自我的小Q无心刷题,于是怂恿小C和他一起颓废,玩起了一款战略游戏. 这款战略游戏的地图由n个城市以及m条连接这些城市的双向道路构成,并且从任 ...
- BZOJ5329:[SDOI2018]战略游戏(圆方树,虚树)
Description 省选临近,放飞自我的小Q无心刷题,于是怂恿小C和他一起颓废,玩起了一款战略游戏. 这款战略游戏的地图由n个城市以及m条连接这些城市的双向道路构成,并且从任意一个城市出发总能沿着 ...
随机推荐
- IDEA怎么设置类的注释模板和方法注释模板
文件头注释模板 File | Settings | Editor | File and Code Templates /** * @Author your name * @DateTime ${YEA ...
- 阿里云服务器ecs配置之安装jdk(转)
一.安装环境 操作系统:Centos 7.4 JDK版本:1.8 工具:Xshell5.Xftp5 二.安装步骤 第一步:下载安装包 (官网)链接: 下载适合自己系统的jdk版本,如图:我下载的是64 ...
- ASP.NET MVC Route详解
在MVC3.0版本的时候,微软终于引入了第二种模板引擎:Razor.在这之前,我们一直在使用WebForm时代沿留下来的ASPX引擎或者第三方的NVelocity模板引擎.Razor在减少代码冗余.增 ...
- shell专题(二):Shell解析器
(1)Linux提供的Shell解析器有: [atguigu@hadoop101 ~]$ cat /etc/shells /bin/sh /bin/bash /sbin/nologin /bin/da ...
- selenium报错Element is not clickable at point及四种解决方法
使用Selenium时,触发点击事件,经常报如下异常:Element is not clickable at point 1.未加载没加载出来就等待元素加载出来,再往下执行.可以使用python库ti ...
- python 生成器(五):生成器实例(一)创建数据处理管道
问题 你想以数据管道(类似Unix管道)的方式迭代处理数据. 比如,你有个大量的数据需要处理,但是不能将它们一次性放入内存中. 解决方案 生成器函数是一个实现管道机制的好办法. 为了演示,假定你要处理 ...
- bzoj1640[Usaco2007 Nov]Best Cow Line 队列变换*&&bzoj1692[Usaco2007 Dec]队列变换*
bzoj1640[Usaco2007 Nov]Best Cow Line 队列变换 bzoj1692[Usaco2007 Dec]队列变换 题意: 有一个奶牛队列.每次可以在原来队列的首端或是尾端牵出 ...
- bzoj4300绝世好题
bzoj4300绝世好题 题意: 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0.n≤100000,ai≤10^9. 题解: 用f[i]表示当前二进制i为1 ...
- java大数据最全课程学习笔记(2)--Hadoop完全分布式运行模式
目前CSDN,博客园,简书同步发表中,更多精彩欢迎访问我的gitee pages 目录 Hadoop完全分布式运行模式 步骤分析: 编写集群分发脚本xsync 集群配置 集群部署规划 配置集群 集群单 ...
- Java中使用方法的注意事项
Java方法使用的注意事项 本文列举了几个小白在java中使用方法应该注意的几个地方 1. 方法应该定义在类中2.方法中不可以再嵌套方法3.方法定义的前后顺序无所谓4.想要执行方法必须要调用5.如果方 ...