解题: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\) 次操作,每次操作选择一些点作为关键点,询问有多少个点满足删去该点及与其相邻的边后,至少有两个关键点不 ...
随机推荐
- servlet ServletContext
一.Servlet简介 1.什么是Servlet Servlet 运行在服务端的Java小程序,是sun公司提供一套规范(接口),用来处理客户端请求.响应给浏览器的动态资源.但servlet的实质就是 ...
- 搭建ELK日志分析系统
看了辣么多博客,就数这个最详细最容易理解了:https://blog.csdn.net/qq_22211217/article/details/80764568 >>>>> ...
- synchronized无法禁止指令重排序的证明
package demo.reorder; import java.util.concurrent.ExecutorService; import java.util.concurrent.Execu ...
- mac 中登陆mysql忘记密码解决办法
1.打开终端,输入命令:cd /usr/local/mysql/bin 2.mysql -uroot -p,用这条命令登陆时报错信息: 报错:Enter password: ERROR 1045 (2 ...
- 部署ingress及使用
一.下载yaml文件 wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/mandatory.y ...
- array_merge
1.array_merge 中有两个参数:将两个关联数组合并为一个数组 <?php $a1=array("a"=>"red","b&quo ...
- HTML 中的 href\src\url
1. 2. -------from Stack Overflow <a><link>使用 href; <img><script>使用 src;
- NAND闪存供过于求的情况今年会有所好转吗?
2018年,NAND闪存全年供过于求,价格一直下跌,导致西数.东芝等厂商毛利率大幅下滑.如今到了2019年,情况会有所好转吗? 近日,集邦科技旗下半导体研究中心DRAMeXchange发布调查报告指出 ...
- HTML条件注释
前面的话 IE条件注释是微软从IE5开始就提供的一种非标准逻辑语句,作用是可以灵活的为不同IE版本浏览器导入不同html元素.很显然这种方法的最大好处就在于属于微软官方给出的兼容解决办法而且还能通过W ...
- nginx反向代理时配置访问密码
在有些情况下,我们需要对服务器上的某些资源进行限流或者禁止陌生人访问,我们可以通过nginx配置来对url添加访问密码. 效果如下 nginx 开启访问验证在 nginx 下,提供了 ngx_http ...