解题: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\) 次操作,每次操作选择一些点作为关键点,询问有多少个点满足删去该点及与其相邻的边后,至少有两个关键点不 ...
随机推荐
- springmvc通过HttpServletRequest进行参数传递
@RequestMapping("/itemEdit") public String itemEdit(HttpServletRequest request, Model mode ...
- :before添加图片,IE8兼容
这是项目开发中遇到的奇怪的小问题: 在IE8下出现按钮点击后消失了,鼠标点击页面后却又出现: 最初的代码:添加背景图片的方法,这样是存在兼容问题的. 更改后代码:content中添加图片,完美兼容IE ...
- 剑指offer(7)
今天的几道题目都是关于斐波那契数列的. 题目1: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 传统的方法采用递归函数,这种 ...
- python之tips(三)--为什么Python有相同的不可变对象id不同?
参考 : https://www.jianshu.com/p/0f6f0db0ce8f
- java学习之—栈
/** * 栈 * Create by Administrator * 2018/6/11 0011 * 上午 10:20 **/ public class StackX { private int ...
- 用python写一个预警机器人(支持微信和钉钉)
背景 线上的系统在运行中,发生故障时怎么及时的通过手机通知到相关人员?当然这是个很简单的需求,现有的方法有很多,例如: 如果我们用的云产品,那么一般都会有配套对应的监控预警功能,根据需要配置一下即可, ...
- DAY09、函数
一.函数的定义:跟变量名的定义大同小异 1.声明函数的关键词:def 2.函数(变量)名:使用函数的依据 3.参数列表:() 参数个数可以为0到n个,但()一定不能丢,完成功能的必要条件 4.函数 ...
- Delphi中带缓存的数据更新技术
一. 概念 在网络环境下,数据库应用程序是c/s或者是多层结构的模式.在这种环境下,数据库应用程序的开发应当尽可能考虑减少网络数据传输量,并且尽量提高并发度.基于这个目的,带缓存的数据更新技术应运而生 ...
- Python——Flask框架——程序的基本结构
一.安装 pip install flask 二.初始化 from flask import Flask app = Flash(__name__) 三.路由:处理URL和函数之间的关系的程序称为路由 ...
- The Bug and Exception of Hibernate
1: hibernate4.3.5 的@oneToOne注解有Bug,建议不使用该版本,或者使用该版本不使用@table annotation. 2:今天在用hibernate4.2.13的时候, ...