解题:SDOI2018 战略游戏
先圆方树然后建虚树,答案就是虚树大小。虚树没必要建出来,把原来的点的点权设为1,直接dfs序排序后相邻点求距离加上首尾两个点的距离,最后除以二(画一下可以发现是正反算了两遍),注意还要去掉询问点和补上首尾两个点的LCA
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#define vint vector<int>
#define vit vector<int> ::iterator
using namespace std;
const int N=,M=;
int T,n,m,c,q,o,t1,t2,rt,pt,cnt,Cnt,tot;
int dfn[N],low[N],stk[N],isc[N],col[N];
int p[N],noww[M],goal[M],P[N],Noww[M],Goal[M];
int siz[N],dep[N],fth[N],imp[N],top[N],qry[M],dis[N]; vint pbc[N];
void Link(int f,int t)
{
noww[++cnt]=p[f];
goal[cnt]=t,p[f]=cnt;
noww[++cnt]=p[t];
goal[cnt]=f,p[t]=cnt;
}
void Linka(int f,int t)
{
Noww[++Cnt]=P[f];
Goal[Cnt]=t,P[f]=Cnt;
Noww[++Cnt]=P[t];
Goal[Cnt]=f,P[t]=Cnt;
}
bool cmp(int a,int b)
{
return dfn[a]<dfn[b];
}
void Init()
{
memset(p,,sizeof p);
memset(P,,sizeof P);
memset(dfn,,sizeof dfn);
memset(low,,sizeof low);
memset(imp,,sizeof imp);
memset(top,,sizeof top);
for(int i=;i<=c;i++) pbc[i].clear();
cnt=Cnt=tot=c=;
}
void RTPBC(int nde)
{
int tmp=;
dfn[nde]=low[nde]=++tot,stk[++pt]=nde;
for(int i=p[nde],g;i;i=noww[i])
if(!dfn[g=goal[i]])
{
RTPBC(g),low[nde]=min(low[nde],low[g]);
if(dfn[nde]<=low[g])
{
if(nde!=rt||++tmp>) isc[nde]=true;
int tep; c++;
do
{
tep=stk[pt--],col[tep]=c;
pbc[c].push_back(tep);
}while(tep!=g);
pbc[c].push_back(nde);
}
}
else low[nde]=min(low[nde],dfn[g]);
}
void DFS(int nde,int far,int dth)
{
int tmp=;
siz[nde]=,fth[nde]=far,dep[nde]=dth;
for(int i=P[nde],g;i;i=Noww[i])
if((g=Goal[i])!=far)
{
dis[g]=dis[nde]+(g<=n);
DFS(g,nde,dth+),siz[nde]+=siz[g];
if(siz[g]>tmp) tmp=siz[g],imp[nde]=g;
}
}
void Mark(int nde,int upt)
{
top[nde]=upt,dfn[nde]=++tot;
if(imp[nde])
{
Mark(imp[nde],upt);
for(int i=P[nde],g;i;i=Noww[i])
if((g=Goal[i])!=fth[nde]&&g!=imp[nde]) Mark(g,g);
}
}
int LCA(int x,int y)
{
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]])
swap(x,y); x=fth[top[x]];
}
return dep[x]<dep[y]?x:y;
}
int Dist(int x,int y)
{
int lca=LCA(x,y);
return dis[x]+dis[y]-*dis[lca];
}
int main()
{
scanf("%d",&T);
while(T--)
{
Init();
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
scanf("%d%d",&t1,&t2),Link(t1,t2);
RTPBC(rt=);
for(int i=;i<=c;i++)
for(vit it=pbc[i].begin();it!=pbc[i].end();it++) Linka(*it,n+i);
tot=,DFS(,,),Mark(,);
scanf("%d",&q);
while(q--)
{
scanf("%d",&o); int ans=;
for(int i=;i<=o;i++) scanf("%d",&qry[i]);
sort(qry+,qry++o,cmp),qry[++o]=qry[];
for(int i=;i<=o;i++) ans+=Dist(qry[i],qry[i-]);
printf("%d\n",(ans>>)-o++(LCA(qry[o],qry[o-])<=n));
}
}
return ;
}
解题:SDOI2018 战略游戏的更多相关文章
- [SDOI2018]战略游戏 圆方树,树链剖分
[SDOI2018]战略游戏 这题是道路相遇(题解)的升级版,询问的两个点变成了\(S\)个点. LG传送门 还是先建出圆方树,考虑对于询问的\(S\)个点,答案就是圆方树上能包含这些点的最小连通块中 ...
- [bzoj5329] P4606 [SDOI2018]战略游戏
P4606 [SDOI2018]战略游戏:广义圆方树 其实会了圆方树就不难,达不到黑,最多算个紫 那个转换到圆方树上以后的处理方法,画画图就能看出来,所以做图论题一定要多画图,并把图画清楚点啊!! 但 ...
- bzoj5315/luoguP4517 [SDOI2018]战略游戏(圆方树,虚树)
bzoj5315/luoguP4517 [SDOI2018]战略游戏(圆方树,虚树) bzoj Luogu 题目描述略(太长了) 题解时间 切掉一个点,连通性变化. 上圆方树. $ \sum |S| ...
- BZOJ5329:[SDOI2018]战略游戏(圆方树,虚树)
Description 省选临近,放飞自我的小Q无心刷题,于是怂恿小C和他一起颓废,玩起了一款战略游戏. 这款战略游戏的地图由n个城市以及m条连接这些城市的双向道路构成,并且从任意一个城市出发总能沿着 ...
- [BZOJ5329][SDOI2018]战略游戏
bzoj luogu Description 省选临近,放飞自我的小Q无心刷题,于是怂恿小C和他一起颓废,玩起了一款战略游戏. 这款战略游戏的地图由n个城市以及m条连接这些城市的双向道路构成,并且从任 ...
- BZOJ5329: [SDOI2018]战略游戏——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5329 https://www.luogu.org/problemnew/show/P4606 省选 ...
- bzoj 5329: [Sdoi2018]战略游戏
Description 省选临近,放飞自我的小Q无心刷题,于是怂恿小C和他一起颓废,玩起了一款战略游戏. 这款战略游戏的地图由n个城市以及m条连接这些城市的双向道路构成,并且从任意一个城市出发总能沿着 ...
- luogu P4606 [SDOI2018]战略游戏
LINK:战略游戏 一道很有价值的题目.这道题 一张无向联通图 每次询问给出K个关键点 问摧毁图中哪个点可以使得这K个关键的两两之间有一对不能联通 去掉的这个点不能是关键点 求方案数. 可以发现 当K ...
- [SDOI2018] 战略游戏
Description 给定一张 \(n\) 个点 \(m\) 条边的无向联通图,共有 \(q\) 次操作,每次操作选择一些点作为关键点,询问有多少个点满足删去该点及与其相邻的边后,至少有两个关键点不 ...
随机推荐
- mysql5.7 的 user表的密码字段从 password 变成了 authentication_string
来源: http://www.zhimengzhe.com/shujuku/other/267631.html 感觉还是挺坑的 自己没了解清楚 就动手 转帖一下 mark 一下. 1.首先停止正在运行 ...
- PHP二维数组(或任意维数组)转换成一维数组的方法汇总(实用)
目录 1 array_reduce函数法 2 array_walk_recursive函数法 3 array_map函数法 假设有下面一个二维数组: $user = array( '0' => ...
- SQL Server 2014备份维护计划
1. 数据库 -> [管理]-> [维护计划] -> [新建维护计划](如果没有操作过可以,选择“维护计划向导”): 2. 直接点击下一步,然后填写计划名称.说 ...
- laravel5.3安装redis扩展包
1,编辑 laravel 根目录下的 composer.json 文件: "require": { "php": ">=5.6.4", ...
- Django进阶知识
drf学习之Django进阶点 一.Django migrations原理 1.makemigrattions: 相当于在每个app下的migrations文件夹下生成一个py脚本文件用于创建表或则修 ...
- 老男孩python学习自修第二十四天【多进程】
1. 体验多进程的运行速度 #!/usr/bin/env python # _*_ coding:UTF-8 _*_ from multiprocessing import Pool import t ...
- Python自动化测试之selenium从入门到精通
1. 安装selenium 首先确保python安装成功,输入python -V 在windows下使用pip安装selenium,详情如图所示: 在ubuntu下使用pip install sele ...
- linux的使用
第一 安装ubuntu操作系统 1. ubuntu下解决中英文输入法问题 问题: ubuntu在安装了搜狗输入法后无法切换英文,即使在搜狗输入法中设置了切换按键依然无反应, 原因在于当前系统中只有一个 ...
- wget 下载网页
如有转载,不胜荣幸.http://www.cnblogs.com/aaron-agu/ wget --http-user=username --http-passwd=password http:/w ...
- How to remove ROM in MAME
/usr/share/games/mame/roms/ /usr/local/share/games/mame/roms/ sudo rm /usr/local/share/games/mame/ro ...