Description

省选临近,放飞自我的小Q无心刷题,于是怂恿小C和他一起颓废,玩起了一款战略游戏。

这款战略游戏的地图由n个城市以及m条连接这些城市的双向道路构成,并且从任意一个城市出发总能沿着道路走到

任意其他城市。现在小C已经占领了其中至少两个城市,小Q可以摧毁一个小C没占领的城市,同时摧毁所有连接这

个城市的道路。只要在摧毁这个城市之后能够找到某两个小C占领的城市u和v,使得从u出发沿着道路无论如何都不

能走到v,那么小Q就能赢下这一局游戏。

小Q和小C一共进行了q局游戏,每一局游戏会给出小C占领的城市集合S

你需要帮小Q数出有多少个城市在他摧毁之后能够让他赢下这一局游戏。

Solution

首先建出圆方树,我们发现答案就是把关键点连起来之后所形成的连通块中圆点的个数减去关键点数量

把关键点建立虚树,答案就是每一条边的权值和,边的权值就是省略的节点个数

按照建立虚树的方法直接算边权就好了

#include<bits/stdc++.h>
using namespace std;
template<class T>void gi(T &x){
int f;char c;
for(f=1,c=getchar();c<'0'||c>'9';c=getchar())if(c=='-')f=-1;
for(x=0;c<='9'&&c>='0';c=getchar())x=x*10+(c&15);x*=f;
}
const int N=4e5+10;
int n,m,Q,head[N],nxt[N*2],to[N*2],num=1,dfn[N],low[N],DFN=0,Head[N];
int st[N],top=0,k,a[N],dis[N],w[N],id[N],fa[N][20],dep[N];
inline void link(int x,int y){nxt[++num]=head[x];to[num]=y;head[x]=num;}
inline void Link(int x,int y){
nxt[++num]=Head[x];to[num]=y;Head[x]=num;
nxt[++num]=Head[y];to[num]=x;Head[y]=num;
}
inline void tarjan(int x,int last){
dfn[x]=low[x]=++DFN;st[++top]=x;
for(int i=head[x];i;i=nxt[i]){
if(i==last)continue;
int u=to[i];
if(!dfn[u]){
tarjan(u,i^1);
low[x]=min(low[x],low[u]);
if(low[u]>=dfn[x]){
Link(++n,x);
while(top && st[top]!=u)Link(n,st[top--]);
Link(n,st[top--]);
}
}
else low[x]=min(low[x],dfn[u]);
}
}
inline void dfs(int x,int last){
dis[x]+=w[x];id[x]=++DFN;
for(int i=1;i<=19;i++)fa[x][i]=fa[fa[x][i-1]][i-1];
for(int i=Head[x],u;i;i=nxt[i]){
if((u=to[i])==last)continue;
dis[u]=dis[x];dep[u]=dep[x]+1;fa[u][0]=x;dfs(u,x);
}
}
inline int lca(int x,int y){
if(dep[x]<dep[y])swap(x,y);
for(int i=19;i>=0;i--)if((dep[x]-dep[y])>>i&1)x=fa[x][i];
if(x==y)return x;
for(int i=19;i>=0;i--)if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];
return fa[x][0];
}
inline bool comp(const int &i,const int &j){return id[i]<id[j];}
inline void solve(){
gi(k);
int ans=0;
for(int i=1;i<=k;i++)gi(a[i]);
sort(a+1,a+k+1,comp);
st[++top]=a[1];
for(int i=2;i<=k;i++){
int x=a[i],z=lca(x,st[top]);
while(top>1 && dep[st[top-1]]>=dep[z]){
ans+=dis[st[top]]-dis[st[top-1]];
top--;
}
ans+=dis[st[top]]-dis[z],top--;
if(st[top]!=z)st[++top]=z;
st[++top]=x;
}
while(top>1)ans+=dis[st[top]]-dis[st[top-1]],top--;
if(top && w[st[top]])ans++;top--;
printf("%d\n",ans-k);
}
inline void Clear(){
num=1;DFN=0;
for(register int i=0;i<N;i++)
head[i]=Head[i]=dep[i]=dis[i]=dfn[i]=low[i]=w[i]=0;
}
inline void work(){
Clear();
int x,y;
cin>>n>>m;
for(int i=1;i<=n;i++)w[i]=1;
for(int i=1;i<=m;i++){
gi(x);gi(y);
link(x,y);link(y,x);
}
for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i,0);
top=DFN=0;
dfs(1,1);
cin>>Q;
while(Q--)solve();
}
int main(){
freopen("pp.in","r",stdin);
freopen("pp.out","w",stdout);
int T;cin>>T;
while(T--)work();
return 0;
}

bzoj 5329: [Sdoi2018]战略游戏的更多相关文章

  1. BZOJ.5329.[SDOI2018]战略游戏(圆方树 虚树)

    题目链接 显然先建圆方树,方点权值为0圆点权值为1,两点间的答案就是路径权值和减去起点终点. 对于询问,显然可以建虚树.但是只需要计算两关键点间路径权值,所以不需要建出虚树.统计DFS序相邻的两关键点 ...

  2. bzoj5315/luoguP4517 [SDOI2018]战略游戏(圆方树,虚树)

    bzoj5315/luoguP4517 [SDOI2018]战略游戏(圆方树,虚树) bzoj Luogu 题目描述略(太长了) 题解时间 切掉一个点,连通性变化. 上圆方树. $ \sum |S| ...

  3. [SDOI2018]战略游戏 圆方树,树链剖分

    [SDOI2018]战略游戏 这题是道路相遇(题解)的升级版,询问的两个点变成了\(S\)个点. LG传送门 还是先建出圆方树,考虑对于询问的\(S\)个点,答案就是圆方树上能包含这些点的最小连通块中 ...

  4. [bzoj5329] P4606 [SDOI2018]战略游戏

    P4606 [SDOI2018]战略游戏:广义圆方树 其实会了圆方树就不难,达不到黑,最多算个紫 那个转换到圆方树上以后的处理方法,画画图就能看出来,所以做图论题一定要多画图,并把图画清楚点啊!! 但 ...

  5. [BZOJ5329][SDOI2018]战略游戏

    bzoj luogu Description 省选临近,放飞自我的小Q无心刷题,于是怂恿小C和他一起颓废,玩起了一款战略游戏. 这款战略游戏的地图由n个城市以及m条连接这些城市的双向道路构成,并且从任 ...

  6. BZOJ5329: [SDOI2018]战略游戏——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5329 https://www.luogu.org/problemnew/show/P4606 省选 ...

  7. BZOJ5329:[SDOI2018]战略游戏(圆方树,虚树)

    Description 省选临近,放飞自我的小Q无心刷题,于是怂恿小C和他一起颓废,玩起了一款战略游戏. 这款战略游戏的地图由n个城市以及m条连接这些城市的双向道路构成,并且从任意一个城市出发总能沿着 ...

  8. luogu P4606 [SDOI2018]战略游戏

    LINK:战略游戏 一道很有价值的题目.这道题 一张无向联通图 每次询问给出K个关键点 问摧毁图中哪个点可以使得这K个关键的两两之间有一对不能联通 去掉的这个点不能是关键点 求方案数. 可以发现 当K ...

  9. Luogu P4606 [SDOI2018] 战略游戏 圆方树 虚树

    https://www.luogu.org/problemnew/show/P4606 把原来的图的点双联通分量缩点(每个双联通分量建一个点,每个割点再建一个点)(用符合逻辑的方式)建一棵树(我最开始 ...

随机推荐

  1. 通过python的paramiko模块获取cisco交换机的配置

    import paramiko import time import os import threading,Queue class MyExpection(Exception): pass clas ...

  2. 【Guava】RateLimiter类

    Guava官方文档-RateLimiter类 原文链接 作者:Dimitris Andreou  译者:魏嘉鹏 校对:方腾飞 RateLimiter 从概念上来讲,速率限制器会在可配置的速率下分配许可 ...

  3. quartz实例以及主要事项(注解)

    实现任务类: package com.vnetoo.nec.base.quartz; import org.springframework.context.annotation.Lazy;import ...

  4. SDUT OJ 数据结构实验之链表八:Farey序列

    数据结构实验之链表八:Farey序列 Time Limit: 10 ms Memory Limit: 600 KiB Submit Statistic Discuss Problem Descript ...

  5. 使用vue-cli脚手架搭建项目,保存编译时出现的代码检查错误(ESLint)

    一.问题 出现这么写错误是什么原因呢?相信很多小白都会像我一样,第一次接触时有点二丈和尚摸不着头脑.其实是在你用vue-cli脚手架构建项目时用了ESLint代码检查工具,如下图 那么什么是ESLin ...

  6. mysql 5.7.22 解压缩安装

    1.下载地址:https://dev.mysql.com/downloads/mysql/5.7.html#downloads 直接点击下载项 下载后: 2.可以把解压的内容随便放到一个目录,我的是如 ...

  7. C++_异常7-exception类

    C++异常的主要目的是为了设计容错程序提供语言级支持. 即异常使得在程序设计中包含错误处理功能更加容易,以免事后采取一些严格的错误处理方式. 异常的灵活性和相对方便性激励着程序员在条件允许的情况下在程 ...

  8. 基于JsonPath和XmlPath的对象映射(Object Mapping)

    rest-assured支持映射Java对象到Json和XML以及从Json和XML中映射到Java对象.Json映射需要在classpath 中有Jackson.Jackson 2或者是Gson,X ...

  9. LeetCode记录之26——Remove Duplicates from Sorted Array

    国外的表达思维跟咱们有很大差别,做这道题的时候很明显.简单说本题就是让你把有序数组中的重复项给换成正常有序的.比如 1 2 2 3换成 1 2 3 3,根本不需要考虑重复的怎么办,怎么删除重复项等等. ...

  10. wepsocket 了解一下

    WebSocket协议是基于TCP的一种新的协议.WebSocket最初在HTML5规范中被引用为TCP连接,作为基于TCP的套接字API的占位符.它实现了浏览器与服务器全双工(full-duplex ...