首页 > 其他分享 >P4606 [SDOI2018] 战略游戏 对自己的警告--zhengjun

P4606 [SDOI2018] 战略游戏 对自己的警告--zhengjun

时间:2023-07-12 19:12:36浏览次数:37  
标签:cnt zhengjun -- P4606 ++ stk int low son

tarjan 多测的时候 dfn 数组要清空!!!

树剖多测的时候 son 数组要清空!!!

点双 tarjan 时可用 vector 建边,边双时用 vector 需要无重边

本题直接建圆方树,然后答案就是关键点构成的虚树上非关键原点个数。

代码

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=2e5+10,V=N*2;
int T,n,m,k,q;
struct edges{
	int to,nex;
}edge[N*2];
int kk=1,head[N];
void addedge(int u,int v){
	edge[++kk]={v,head[u]},head[u]=kk;
	edge[++kk]={u,head[v]},head[v]=kk;
}
vector<int>to[V];
int cnt,dft,dfn[N],low[N],stk[N];
void add(int u,int v){
	to[u].push_back(v),to[v].push_back(u);
}
void tarjan(int u,int las=0){
	low[u]=dfn[u]=++dft,stk[++cnt]=u;
	for(int i=head[u],v;v=edge[i].to,i;i=edge[i].nex)if(i^las^1){
		if(!dfn[v]){
			tarjan(v,i),low[u]=min(low[u],low[v]);
			if(low[v]>=dfn[u]){
				add(++k,u);
				do add(k,stk[cnt]);while(stk[cnt--]^v);
			}
		}
		else low[u]=min(low[u],dfn[v]);
	}
}
int tot,fa[V],son[V],siz[V],dep[V],top[V],sum[V],bg[V];
void dfs1(int u){
	sum[u]=sum[fa[u]]+(u<=n);
	siz[u]=1,dep[u]=dep[fa[u]]+1;
	son[u]=0;
	for(int v:to[u])if(v^fa[u]){
		fa[v]=u,dfs1(v);
		siz[u]+=siz[v];
		if(siz[v]>siz[son[u]])son[u]=v;
	}
}
void dfs2(int u,int t){
	top[u]=t,bg[u]=++tot;
	if(son[u])dfs2(son[u],t);
	for(int v:to[u])if(v^fa[u]&&v^son[u])dfs2(v,v);
}
int LCA(int u,int v){
	for(;top[u]^top[v];u=fa[top[u]]){
		if(dep[top[u]]<dep[top[v]])swap(u,v);
	}
	return dep[u]<dep[v]?u:v;
}
int t,a[N];
void get(){
	scanf("%d%d",&n,&m);
	for(int u,v;m--;){
		scanf("%d%d",&u,&v);
		addedge(u,v); 
	}
	k=n,cnt=dft=0,tarjan(1);
	tot=0,dfs1(1),dfs2(1,1);
	scanf("%d",&q);
	for(;q--;){
		scanf("%d",&t);
		for(int i=1;i<=t;i++)scanf("%d",&a[i]);
		sort(a+1,a+1+t,[](int x,int y){return bg[x]<bg[y];});
		stk[cnt=1]=a[1];
		int ans=0;
		auto add=[&](int t,int u){
			ans+=sum[u]-sum[t];
		};
		for(int i=2;i<=t;i++){
			int x=LCA(a[i],stk[cnt]);
			for(;cnt>1&&dep[stk[cnt-1]]>=dep[x];cnt--)add(stk[cnt-1],stk[cnt]);
			if(stk[cnt]^x)add(x,stk[cnt--]);
			if(stk[cnt]^x)stk[++cnt]=x;
			if(stk[cnt]^a[i])stk[++cnt]=a[i];
		}
		for(int i=1;i<cnt;i++)add(stk[i],stk[i+1]);
		ans+=stk[1]<=n;
		printf("%d\n",ans-t);
	}
}
void clear(){
	kk=1;
	for(int i=1;i<=n;i++)head[i]=dfn[i]=0;
	for(int i=1;i<=k;i++)to[i].clear();
}
int main(){
	freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	for(scanf("%d",&T);T--;clear())get();
	return 0;
}

标签:cnt,zhengjun,--,P4606,++,stk,int,low,son
From: https://www.cnblogs.com/A-zjzj/p/17548566.html

相关文章

  • jwt整合
    1.token问题目前方案是将token作为key,将登录的信息作为值存入到redis里面。2.使用jwt加入jwt之后就可以把redis去掉2.1.添加依赖2.2.创建工具类2.2.1.有效期30分钟2.2.2.令牌密钥暂时设置为1234562.2.3.创建jwt方法2.2.4.解析jwt方法......
  • 机器翻译 | Prompting Large Language Model for Machine Translation: A Case Study
    题目:机器翻译的提示大语言模型:一个案例研究摘要对提示的研究表明,在很少甚至没有监督训练的情况下,提示在许多任务中表现出色。然而,文献中对机器翻译的提示还没有充分的研究。本文对翻译提示策略进行了系统的研究,考察了提示模板和示例选择的各种因素,填补了这一空白。我们进一步......
  • Spring事务角色
       ......
  • 每日总结2023年7月12日
    今日学习:信息系统安全属性:保密性(最小授权原则、防暴露、信息加密、物理保密)、完整性(安全协议、校验码、密码校验、数字签名、公证)、可用性(综合保障(IP过滤、业务流控制、路由选择控制、审计跟踪))、不可抵赖性(数字签名);对称加密技术:加密和解密的密钥是完全一致的(加密强度不高、密钥分......
  • Vue无感刷新当前页面
    使用Vue选项/组合Apiprovide/inject Api地址,此方法可以实现无感刷新并且不会出现闪烁的空白。首先在根组件App.vue定义这个方法 html复制代码<template><divid="app"><router-viewv-if="routerAlive"></router-view></div><......
  • SpringCloud实现浏览器端大文件分片上传
    ​ 1,项目调研 因为需要研究下断点上传的问题。找了很久终于找到一个比较好的项目。 在GoogleCode上面,代码弄下来超级不方便,还是配置hosts才好,把代码重新上传到了github上面。 https://github.com/freewebsys/java-large-file-uploader-demo 效果: 上传中,显示进度,......
  • 微信小游戏代码包侵权解决办法
    微信过审机制介绍1、大致步骤就是提审->机器审核->人工审核;2、机器审核部分:审核代码部分,资源相关部分人工审核部分:审核UI相关,标题是否侵权,玩法是否符合类别3、审核时间:正常的账号在100分的情况下审核时间都会在2个小时内。审核细节1、微信目前机审大部分会从代码......
  • Spring事务简介
        @Transasctional这个可以写在方法上也可以写在类或者接口上写在类或者接口上,那么这个类或这个接口里面的全部方法都开启了事务   注意:PlatfromTransactionManager这个接口时Spring提供的标准接口,而下面的DataSourceTransactionManager实......
  • 1st-基础教程.txt
     1Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。 2Python由GuidovanRossum于1989年底发明,第一个公开发行版发行于1991年。 3 4像Perl语言一样,Python源代码同样遵循GPL(GNUGeneralPublicLicense)协议。 5 6官方宣布,2020......
  • windows下注册一个打开特定扩展名的文件
    参考 https://www.cnblogs.com/linliquan/p/10626944.html一大概步骤如下1在下面位置增加一个value指向一个应用程序能力的位置HKEY_LOCAL_MACHINE\SOFTWARE\RegisteredApplications2在能力位置处添加要支持的扩展名或者协议名称3在HKEY_CLASSES_ROOT添加一系列项,支持......