bzoj 5329 战略游戏
题目大意:
一个无向图 Q个询问 每次给一些点的集合
求有多少个点满足去掉这个点后使这些点的集合中有一个点对不连通
思路:
点双缩点 相当于每次求这些点中的所有路径上的圆点个数
可以将这些点按dfs序排序 每次求a i 和 a i+1两个点路径上的圆点个数
最后答案/2 后减去这些点的个数(因为不能取这些点) 再判断 a i 和a n的lca是否是圆点
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#define inf 2139062143
#define ll long long
#define MAXN 400100
#define V1 (g1.to[i])
#define V2 (g2.to[i])
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) {x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,m;
int dfn[MAXN],st[MAXN],low[MAXN],top,stp;
int f[MAXN][],dep[MAXN],dis[MAXN];
struct graph
{
int fst[MAXN],nxt[MAXN<<],to[MAXN<<],cnt;
void mem(){memset(fst,,sizeof(fst));cnt=;}
void add(int u,int v) {nxt[++cnt]=fst[u],fst[u]=cnt,to[cnt]=v;}
}g1,g2;
void tarjan(int x)
{
dfn[x]=low[x]=++stp,st[++top]=x;int now=;
for(int i=g1.fst[x];i;i=g1.nxt[i])
if(!dfn[V1])
{
tarjan(V1);low[x]=min(low[x],low[V1]);
if(low[V1]<dfn[x]) continue;m++;
do{now=st[top--];g2.add(m,now);}
while(now!=V1);g2.add(x,m);
}
else low[x]=min(low[x],dfn[V1]);
}
void dfs(int x)
{
dfn[x]=++stp;
for(int i=;(<<i)<=dep[x];i++) f[x][i]=f[f[x][i-]][i-];
for(int i=g2.fst[x];i;i=g2.nxt[i])
{f[V2][]=x,dep[V2]=dep[x]+,dis[V2]=dis[x]+(V2<=n);dfs(V2);}
}
int lca(int a,int b)
{
if(dep[a]<dep[b]) swap(a,b);
int t=dep[a]-dep[b];
for(int i=;i>=;i--) if((<<i)&t) a=f[a][i];
if(a==b) return a;
for(int i=;i>=;i--) if(f[a][i]!=f[b][i]) a=f[a][i],b=f[b][i];
return f[a][];
}
bool cmp(const int &a,const int &b) {return dfn[a]<dfn[b];}
inline int calc(int a,int b) {return dis[a]+dis[b]-(dis[lca(a,b)]<<);}
int main()
{
int T=read(),a,b,k,q,res;
while(T--)
{
g1.mem();g2.mem();memset(dfn,,sizeof(dfn));
memset(f,,sizeof(f));
n=read(),m=read(),stp=top=;
while(m--) {a=read(),b=read();g1.add(a,b);g1.add(b,a);}
m=n;tarjan();dis[]=dep[]=,stp=;dfs();
q=read();
while(q--)
{
k=read(),top=,res=;
while(k--) st[++top]=read();
sort(st+,st+top+,cmp);
for(int i=;i<=top;i++)
res+=calc(st[i],st[i%top+]);
if(lca(st[],st[top])<=n) printf("%d\n",(res+-top*)>>);
else printf("%d\n",(res-top*)>>);
}
}
}
bzoj 5329 战略游戏的更多相关文章
- bzoj 5329: [Sdoi2018]战略游戏
Description 省选临近,放飞自我的小Q无心刷题,于是怂恿小C和他一起颓废,玩起了一款战略游戏. 这款战略游戏的地图由n个城市以及m条连接这些城市的双向道路构成,并且从任意一个城市出发总能沿着 ...
- [BZOJ5329][SDOI2018]战略游戏
bzoj luogu Description 省选临近,放飞自我的小Q无心刷题,于是怂恿小C和他一起颓废,玩起了一款战略游戏. 这款战略游戏的地图由n个城市以及m条连接这些城市的双向道路构成,并且从任 ...
- 【BZOJ5329】【SDOI2018】战略游戏(圆方树,虚树)
[BZOJ5329][SDOI2018]战略游戏(圆方树,虚树) 题面 BZOJ 洛谷 Description 省选临近,放飞自我的小Q无心刷题,于是怂恿小C和他一起颓废,玩起了一款战略游戏. 这款战 ...
- BZOJ5329: [SDOI2018]战略游戏——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5329 https://www.luogu.org/problemnew/show/P4606 省选 ...
- bzoj3924 [Zjoi2015]幻想乡战略游戏 点分树,动态点分
[BZOJ3924][Zjoi2015]幻想乡战略游戏 Description 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网 ...
- bzoj5315/luoguP4517 [SDOI2018]战略游戏(圆方树,虚树)
bzoj5315/luoguP4517 [SDOI2018]战略游戏(圆方树,虚树) bzoj Luogu 题目描述略(太长了) 题解时间 切掉一个点,连通性变化. 上圆方树. $ \sum |S| ...
- D3D游戏编程系列(三):自己动手编写即时战略游戏之寻路
说起即时战略游戏,不得不提的一个问题是如何把一个物体从一个位置移动到另一个位置,当然,我说的不是瞬移,而是一个移动的过程,那么在这个移动的过程中我们如何来规划路线呢,这就不得不提到寻路了. 我所了解到 ...
- 【BZOJ3924】幻想乡战略游戏(动态点分治)
[BZOJ3924]幻想乡战略游戏(动态点分治) 题面 权限题...(穷死我了) 洛谷 题解 考虑不修改 发现一个贪心的做法 假设当前放在当前位置 如果它有一个子树的兵的总数大于总数的一半 那么,放到 ...
- 『战略游戏 最大利润 树形DP』
通过两道简单的例题,我们来重新认识树形DP. 战略游戏(luoguP1026) Description Bob喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的办法.现在他有个问题.他要 ...
随机推荐
- [HDU5919]Sequence II
[HDU5919]Sequence II 试题描述 Mr. Frog has an integer sequence of length n, which can be denoted as a1,a ...
- [codeforces722C]Destroying Array
[codeforces722C]Destroying Array 试题描述 You are given an array consisting of n non-negative integers a ...
- [HAOI2006]受欢迎的牛(tarjan缩点)
洛谷传送门 直接tarjan求scc,然后统计出度为0的缩点,如果多余1个就输出0,只有一个就输出这个缩点里的点. ——代码 #include <cstdio> #include < ...
- BZOJ1573: [Usaco2009 Open]牛绣花cowemb
求半径d<=50000的圆(不含边界)内n<=50000条直线有多少交点,给直线的解析式. 一开始就想,如果能求出直线交点与原点距离<d的条件,那么从中不重复地筛选即可.然而两个kx ...
- 怎么删除"自豪地采用WordPress"
wordpress刚刚安装完毕,打开默认的主页,会发现底部有这样的一行文字:“自豪地采用WordPress”.当然了,我们做一个网站,不一定需要这些文字,我们可以删除或者修改这些文字.今天,小编就来教 ...
- python学习之-- socketserver模块
socketserver 模块简化了网络服务器的编写,主要实现并发的处理. 主要有4个类:这4个类是同步进行处理的,另外通过ForkingMixIn和ThreadingMixIn类来支持异步.sock ...
- topcoder 650 srm
500 遇到这种构造题 就给跪了 比赛的时候想很多方法 DP,贪心,模拟 发现越写越烦琐.看到别人出这么快,肯定又是奇葩思路. 后来居然想到 2^50的暴力 +剪枝 不过暴力肯定卡你 IDEA: 只要 ...
- uva 11691
贪心 ~~ 使用优先队列 #include <cstdio> #include <cstdlib> #include <cmath> #include <se ...
- MySQL查询count(*)、count(1)、count(field)的区别收集
经过查询研究得出这个和MySQL中用什么引擎有关,比如InnoDB和MyISAM在处理这count(*).count(1).count(field)都有不同的方式,还有就是和版本都有关系,不同的版本会 ...
- Ribbon简介
Ribbon简介