bzoj

luogu

Description

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

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

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

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

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

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

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

Input

第一行包含一个正整数\(T\),表示测试数据的组数,

对于每组测试数据,

第一行是两个整数\(n\)和\(m\),表示地图的城市数和道路数,

接下来\(m\)行,每行包含两个整数\(u\)和\(v\)表示第\(u\)个城市和第\(v\)个城市之间有一条道路,同一对城市之间可能有多条道路连接,

第\(m+1\)行是一个整数\(q\),表示游戏的局数,

接下来\(q\)行,每行先给出一个整数\(|S|(2\le |S|\le n)\)

表示小C占领的城市数量,然后给出\(|S|\)个整数\(s1,s2,...s|S|,(1\le s1<s2<s_{|S|}\le n)\),表示小C占领的城市。

\(1\le T \le 10\)

\(2\le n\le 10^5\) 且$ n-1\le m\le 2*10^5$,

\(1\le q\le 10^5\),

对于每组测试数据,有\(\sum |S|\le 2*10^5\)

Output

对于每一局游戏,输出一行,包含一个整数,表示这一局游戏中有多少个城市在小Q摧毁之后能够让他赢下这一局游戏。

Sample Input

2

7 6

1 2

1 3

2 4

2 5

3 6

3 7

3

2 1 2

3 2 3 4

4 4 5 6 7

6 6

1 2

1 3

2 3

1 4

2 5

3 6

4

3 1 2 3

3 1 2 6

3 1 5 6

3 4 5 6

Sample Output

0

1

3

0

1

2

3

sol

这种题基本上可以一眼秒出是圆方树+虚树吧。。。

怎么算答案?

就是用给定的点建出虚树后每条边的长度之和吧。因为切断这棵虚树上的任意一条边都是符合题意的。

所以维护一下路径上有多少个圆点即可。

code

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int gi(){
int x=0,w=1;char ch=getchar();
while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if (ch=='-') w=0,ch=getchar();
while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return w?x:-x;
}
const int N = 4e5+5;
int n,tot,m,Q,dfn[N],low[N],tim,S[N];
int fa[N],dep[N],dis[N],sz[N],son[N],top[N],s[N],q[N];
struct Graph{
int to[N],nxt[N],head[N],cnt;
void init(){
memset(head,0,sizeof(head));
cnt=0;
}
void link(int u,int v){
to[++cnt]=v;nxt[cnt]=head[u];head[u]=cnt;
to[++cnt]=u;nxt[cnt]=head[v];head[v]=cnt;
}
}G1,G2;
void Tarjan(int u){
dfn[u]=low[u]=++tim;S[++S[0]]=u;
for (int e=G1.head[u];e;e=G1.nxt[e]){
int v=G1.to[e];
if (!dfn[v]){
Tarjan(v),low[u]=min(low[u],low[v]);
if (low[v]>=dfn[u]){
G2.link(++tot,u);int x=0;
do{
x=S[S[0]--];G2.link(tot,x);
}while (x!=v);
}
}
else low[u]=min(low[u],dfn[v]);
}
}
void dfs1(int u,int f){
fa[u]=f;dep[u]=dep[f]+1;dis[u]=dis[f]+(u<=n);sz[u]=1;
for (int e=G2.head[u];e;e=G2.nxt[e]){
int v=G2.to[e];if (v==f) continue;
dfs1(v,u);sz[u]+=sz[v];
if (sz[v]>sz[son[u]]) son[u]=v;
}
}
void dfs2(int u,int up){
top[u]=up;dfn[u]=++tim;
if (son[u]) dfs2(son[u],up);
for (int e=G2.head[u];e;e=G2.nxt[e]){
int v=G2.to[e];if (v==fa[u]||v==son[u]) continue;
dfs2(v,v);
}
low[u]=tim;
}
int getlca(int u,int v){
while (top[u]^top[v]){
if (dep[top[u]]<dep[top[v]]) swap(u,v);
u=fa[top[u]];
}
return dep[u]<dep[v]?u:v;
}
bool cmp_dfn(int i,int j){return dfn[i]<dfn[j];}
int main(){
int T=gi();while (T--){
tot=n=gi();m=gi();G1.init();G2.init();tim=0;
while (m--){
int u=gi(),v=gi();
G1.link(u,v);
}
memset(dfn,0,sizeof(dfn));
memset(son,0,sizeof(son));
for (int i=1;i<=n;++i) if (!dfn[i]) Tarjan(i);
tim=0,dfs1(1,0),dfs2(1,1);
Q=gi();while (Q--){
int k=gi(),len=k,tp=0,ans=0;
for (int i=1;i<=k;++i) s[i]=gi();
sort(s+1,s+k+1,cmp_dfn);
for (int i=1;i<k;++i) s[++len]=getlca(s[i],s[i+1]);
sort(s+1,s+len+1,cmp_dfn);len=unique(s+1,s+len+1)-s-1;
ans=s[1]<=n;
for (int i=1;i<=len;++i){
while (tp&&low[q[tp]]<dfn[s[i]]) --tp;
if (tp) ans+=dis[s[i]]-dis[q[tp]];
q[++tp]=s[i];
}
printf("%d\n",ans-k);
}
}
return 0;
}

最新文章

  1. Excel文件转plist文件出现的文件编码问题
  2. PLSQL数据库操作(excel)
  3. assert_option()可以用来对assert()进行一些约束和控制
  4. Android异步任务机制之AsycTask
  5. loaded the &quot;ViewController&quot; nib but the view outlet was not set.&#39;
  6. CoreData (表结构变化处理)
  7. WPF 之 布局(三)
  8. IOS - 常用宏定义和功能方法
  9. CodeForces 577A Multiplication Table 质因子数
  10. 创建和分析excel文件
  11. tomcat安装完设定用户名和密码
  12. 【死磕Java并发】-----深入分析volatile的实现原理
  13. 最近使用 .NET Core 遇到的一些坑
  14. Android笔记(五)利用Intent启动活动
  15. Knockout 官网学习文档目录
  16. 关于查询中查询无果,也不报错,inpout标签中的value属性为‘ ’的判断问题
  17. jsp页面无法使用EL
  18. Elastic Stack之Logstash进阶
  19. CSS_选择符
  20. golang使用chan注意事项

热门文章

  1. python脚本7_打印九九乘法表
  2. Svn Replacement For Git Stash
  3. 十五 web爬虫讲解2—urllib库中使用xpath表达式—BeautifulSoup基础
  4. Python3 学习第十四弹: 模块学习六之re模块 + 正则表达式 (转)
  5. RabbitMQ消息队列(十)RPC应用2
  6. Spring入门2. IoC中装配Bean
  7. ubuntu安装amd/ati显卡驱动
  8. 【51nod-1521】一维战舰
  9. Django之model操作(续)
  10. 数据仓库(Data Warehouse)建设