传送门


弱化版

考虑到去掉一个点使得存在两个点不连通的形式类似割点,不难想到建立圆方树。那么在圆方树上对于给出的关键点建立虚树之后,我们需要求的就是虚树路径上所有圆点的数量减去关键点的数量。

因为没有DP,所以其实没有必要将虚树建立起来,只需要维护一个链并就可以了。

#include<bits/stdc++.h>
//This code is written by Itst
using namespace std; inline int read(){
int a = 0;
char c = getchar();
bool f = 0;
while(!isdigit(c) && c != EOF){
if(c == '-')
f = 1;
c = getchar();
}
if(c == EOF)
exit(0);
while(isdigit(c)){
a = a * 10 + c - 48;
c = getchar();
}
return f ? -a : a;
} const int MAXN = 2e5 + 7;
int head[MAXN] , N , M , cnt , cntEd , ans;
int dfn[MAXN] , low[MAXN] , st[MAXN] , ts , top;
int ind[MAXN] , dep[MAXN] , TS;
vector < int > ch[MAXN];
int num[MAXN] , jump[MAXN][19];
struct Edge{
int end , upEd;
}Ed[MAXN << 1];
struct cmp{
bool operator ()(int a , int b){
return ind[a] < ind[b];
}
};
set < int , cmp > s;
set < int , cmp > :: iterator it1 , it2; inline void addEd(int a , int b){
Ed[++cntEd].end = b;
Ed[cntEd].upEd = head[a];
head[a] = cntEd;
} void pop(int x , int bot){
++cnt;
ch[cnt].clear();
ch[x].push_back(cnt);
do{
ch[cnt].push_back(st[top]);
}while(st[top--] != bot);
} void tarjan(int x , int p){
dfn[x] = low[x] = ++ts;
st[++top] = x;
ch[x].clear();
for(int i = head[x] ; i ; i = Ed[i].upEd)
if(Ed[i].end != p)
if(!dfn[Ed[i].end]){
tarjan(Ed[i].end , x);
low[x] = min(low[x] , low[Ed[i].end]);
if(low[Ed[i].end] >= dfn[x])
pop(x , Ed[i].end);
}
else
low[x] = min(low[x] , dfn[Ed[i].end]);
} void dfs(int x , int p){
ind[x] = ++TS;
dep[x] = dep[p] + 1;
jump[x][0] = p;
for(int i = 1 ; i <= 18 ; ++i)
jump[x][i] = jump[jump[x][i - 1]][i - 1];
num[x] = num[p] + (x <= N);
for(int i = 0 ; i < ch[x].size() ; ++i)
dfs(ch[x][i] , x);
} inline int LCA(int x , int y){
if(dep[x] < dep[y])
swap(x , y);
for(int i = 18 ; i >= 0 ; --i)
if(dep[x] - (1 << i) >= dep[y])
x = jump[x][i];
if(x == y)
return x;
for(int i = 18 ; i >= 0 ; --i)
if(jump[x][i] != jump[y][i]){
x = jump[x][i];
y = jump[y][i];
}
return jump[x][0];
} inline void insert(int x){
s.insert(x);
it1 = it2 = s.find(x);
int p = 0 , q = 0;
if(it1 != s.begin())
p = LCA(*(--it1) , x);
if(++it2 != s.end())
q = LCA(*it2 , x);
p = dep[p] < dep[q] ? q : p;
ans += num[x] - num[p];
} int main(){
#ifndef ONLINE_JUDGE
freopen("in","r",stdin);
freopen("out","w",stdout);
#endif
for(int T = read() ; T ; --T){
cnt = N = read();
M = read();
memset(head , 0 , sizeof(head));
memset(dfn , 0 , sizeof(dfn));
cntEd = ts = TS = top = 0;
for(int i = 1 ; i <= M ; ++i){
int a = read() , b = read();
addEd(a , b);
addEd(b , a);
}
tarjan(1 , 0);
dfs(1 , 0);
for(int Q = read() ; Q ; --Q){
s.clear();
ans = 0;
int S = read() , t;
for(int i = 1 ; i <= S ; ++i){
int a = read();
if(i == 1)
t = a;
else
if(t != 1)
t = LCA(t , a);
insert(a);
}
printf("%d\n" , ans - S - num[jump[t][0]]);
}
}
return 0;
}

Luogu4606 SDOI2018 战略游戏 圆方树、虚树、链并的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. 【SDOI2018】战略游戏(同时普及虚树)

    先看一道虚树普及题:给你一棵 $n$ 个点的树,$m$ 次询问,每次询问给你 $k$ 个关键点,求把这些点都连起来的路径并的最短长度.$1\le n,m\le 100000,\space 1\le \ ...

  7. [SDOI2018]战略游戏(圆方树+虚树)

    喜闻乐见的圆方树+虚树 图上不好做,先建出圆方树. 然后答案就是没被选到的且至少有两条边可以走到被选中的点的圆点的数量. 语文不好,但结论画画图即可得出. 然后套路建出虚树. 发现在虚树上DP可以得出 ...

  8. 仙人掌 && 圆方树 && 虚树 总结

    仙人掌 && 圆方树 && 虚树 总结 Part1 仙人掌 定义 仙人掌是满足以下两个限制的图: 图完全联通. 不存在一条边处在两个环中. 其中第二个限制让仙人掌的题做 ...

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

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

随机推荐

  1. 【读书笔记】iOS-流式音频与Pandora Radio之路

    复杂性是不可避免的,而且只会随时间增长,所以在增加特性时一定要为重构和代码简化留出时间.真正遇到问题这前先不要担心性能.iPhone非常强壮,你可能永远也不会遇到预想的性能问题. 能过互联网向一个设备 ...

  2. 【读书笔记】iOS-MVC

    用户的每一个动作都是以一个View的Action方式传递给Controller,然后,Controller再发送消息通知Model做出响应的逻辑处理,当Model层面上的业务逻辑处理有了结果之后,Mo ...

  3. ES6模块化与常用功能

    目前开发环境已经普及使用,如vue,react等,但浏览器环境却支持不好,所以需要开发环境编译,下面介绍下开发环境的使用和常用语法: 一,ES6模块化 1,模块化的基本语法 ES6 的模块自动采用严格 ...

  4. FreeSSHD login with permission denied

    登录遇到问题: Permission denied, please try again. 解决方法: 在window中使用freesshd开启ssh后,客户端登陆时报 access denied错误 ...

  5. Android View 绘制流程

    Android 中 Activity 是作为应用程序的载体存在,代表着一个完整的用户界面,提供了一个窗口来绘制各种视图,当 Activity 启动时,我们会通过 setContentView 方法来设 ...

  6. Linux profile1,bashrc,.bash_profile,.bash_login,.profile,.bashrc,.bash_logout浅析 Part1

    profile,bashrc,.bash_profile,.bash_login,.profile,.bashrc,.bash_logout浅析 Part 1   by:授客 QQ:103355312 ...

  7. Expo大作战(三十)--expo sdk api之Permissions(权限管理模块),Pedometer(计步器api)

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

  8. 性能测试—JMeter 常用元件(四)

    <零成本web性能测试>第三章 Web性能测试脚本录制与开发中JMeter常用测试元件 测试计划描述了JMeter运行时将会执行的一系列步骤,一个完整的测试计划包含一个或多个线程组.逻辑控 ...

  9. CSS网页菜单

    <%@ Control Language="C#" AutoEventWireup="true" CodeFile="WebUserContro ...

  10. 【PAT】B1054 求平均值(20 分)

    一开始就想用sscanf和sprintf去实现,但是没有设计好思路,卡住了. 看了网上别人的博客,都是用的很复杂的逻辑分别判断,一言不合就七八十航代码 今天早上看了柳神的代码,发现跟自己的思路一样,开 ...