zoukankan      html  css  js  c++  java
  • [BZOJ5329][SDOI2018]战略游戏

    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|(2le |S|le n))
    表示小C占领的城市数量,然后给出(|S|)个整数(s1,s2,...s|S|,(1le s1<s2<s_{|S|}le n)),表示小C占领的城市。
    (1le T le 10)
    (2le nle 10^5) 且$ n-1le mle 2*10^5$,
    (1le qle 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
    ",ans-k);
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    论有一个服务器后可以干什么
    golang的安装后的文件目录解析
    使用go自带的http包搭建一个的web服务器
    python字符串问题—文件排版
    Python 整数的N进制字符串表示,循环和函数_亲密数,DNA匹配A
    mongodb 基本CRUD
    pip;python包管理工具
    STM32中assert_param的使用
    stm32.cube(一)——系统架构及目录结构
    HTTP、TCP、UDP,Socket,HTTPS
  • 原文地址:https://www.cnblogs.com/zhoushuyu/p/9087842.html
Copyright © 2011-2022 走看看