首页 > 其他分享 >CF1702G2 Passable Paths (hard version)

CF1702G2 Passable Paths (hard version)

时间:2023-07-09 09:46:26浏览次数:47  
标签:Paths ch int hard st rd Passable SIZE

Passable Paths (hard version)

思路

题意:判断是否存在一条链包含树上给定点集。

考虑把 \(1\) 当做树的根,将无根树转化为有根树。

考虑这样一个性质:若存在满足条件的最短链,则点集中深度最深的点 \(u\) 是该链的一个端点,点集中距离 \(u\) 最远的点 \(v\) 是该链的另一端点。

证明:若点 \(u\) 不是链的端点,则 \(u\) 的子孙节点中还存在点集中的点,以保证 \(u\) 被包含在可行最短链中,这与 \(u\) 深度最深矛盾。若 \(v\) 不是点集中距离 \(u\) 最远的点,则对于 \(u\) 与 \(v\) 简单路径上的所有点(包含端点)到 \(u\) 的距离均小于等于 \(v\) 到 \(u\) 的距离,此时链不能包含点集中距离 \(u\) 最远的点,矛盾。

之后只要判断点集中其余 \(k-2\) 个点是否均在 \(u\) 和 \(v\) 的简单路径上就可以了。

考虑分三类:

  1. 如果点 \(i\) 的深度小于 \(u\) 与 \(v\) 的 \(\text{lca}\) 的深度,则不可行。

  2. 否则如果点 \(i\) 在 \(u\) 或 \(v\) 任一点到 \(1\) 的路径上,则可行。

  3. 其余情况均不可行。

每个点利用倍增 \(\text{LCA}\) 判断即可。

时间复杂度 \(O(q \log n)\)。

代码

点击查看代码
#include <bits/stdc++.h>
using namespace std;
const int SIZE = 200005;
int n, tot, st;
vector<int> e[SIZE];
int a[SIZE], d[SIZE], f[SIZE][30];
 
inline int rd(){
	int f = 1, x = 0;
	char ch = getchar();
	while(!isdigit(ch)){
		if(ch == '-') f = -1;
		ch = getchar();
	}
	while(isdigit(ch)){
		x = (x << 1) + (x << 3) + (ch ^ 48);
		ch = getchar();
	}
	return f*x;
}
 
void dfs(int x, int fa){
	f[x][0] = fa; d[x] = d[fa] + 1;
	for(int i = 1; i <= 23; i++){
		f[x][i] = f[f[x][i-1]][i-1];
	}
	for(int i = 0; i < e[x].size(); i++){
		int y = e[x][i];
		if(y == fa) continue;
		dfs(y, x);
	}
}
 
int LCA(int x, int y){
	if(d[x] < d[y]) swap(x, y);
	for(int i = 23; i >= 0; i--){
		if(d[f[x][i]] >= d[y]) x = f[x][i];
		if(x == y) return x;	
	}
	for(int i = 23; i >= 0; i--){
		if(f[x][i] != f[y][i]){
			x = f[x][i], y = f[y][i];
		}
	}
	return f[x][0];
}
 
int main(){
	n = rd();
	for(int i = 1; i < n; i++){
		int x = rd(), y = rd();
		e[x].push_back(y);
		e[y].push_back(x);
	}
	dfs(1, 0);
	int q = rd();
	for(int i = 1; i <= q; i++){
		int tot = rd();
		st = 0; bool flag = true;
		for(int j = 1; j <= tot; j++){
			a[j] = rd();
			if(d[a[j]] > d[st]) st = a[j];
		}
		int z = 0, jl, lc;
		for(int j = 1; j <= tot; j++){
			if(a[j] == st) continue;
			if(z == 0){
				z = a[j];
				lc = LCA(a[j], st);
				jl = d[a[j]] + d[st] - 2*d[lc];
			}
			else{
				int xx = d[a[j]] + d[st] - 2*d[LCA(a[j], st)]; 
				if(xx > jl){
					jl = xx;
					z = a[j];
					lc = LCA(a[j], st);
				}
			}
		}
		for(int j = 1; j <= tot; j++){
			if(a[j] == z || a[j] == st) continue;
			if(d[a[j]] < d[lc]){
				flag = false;
				break;	
			} 
			else{
				int xx = LCA(a[j], st), yy = LCA(a[j], z);
				if(!(xx == a[j] || yy == a[j])){
					flag = false;
					break;	
				} 
			}
		}
		if(flag) printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}

标签:Paths,ch,int,hard,st,rd,Passable,SIZE
From: https://www.cnblogs.com/Semorius/p/17538326.html

相关文章

  • SpringBoot整合Sharding-JDBC水平分表
    本文使用Sharding-JDBC完成对订单表的水平分表,通过快速入门程序的开发,快速体验Sharding-JDBC的使用方法。首先创建两张表,t_order_1和t_order_2,这两张表是订单表拆分后的表,通过Sharding-Jdbc向订单表插入数据,按照一定的分片规则,主键为偶数的进入t_order_1,另一部分数据进入t_order_......
  • 牛客练习赛113 D 小红的数组操作(hard version)
    题目要求求出最小的总代价使得平均数为整数,转换式子可得实际就是求出a,b使得(a*x-b*y+sum)%n==0且a*p+b*q要最小,平均值的为sum/n,因此对sum进行操作使其成为n的倍数即可(a*x-b*y+sum)%n==0=>((a*x+sum)%n-b*y%n)%n==0因为(a*x+sum)%n<n,b*y%n<n,因此要想二者差求余数为0一定为(......
  • 解决高可用集群篇(三)-- MySQL主从复制&ShardingSphere读写分离分库分表的具体操作步
    高可用集群篇(三)--MySQL主从复制&ShardingSphere读写分离分库分表1.什么是MySQL主从复制?MySQL主从复制是指将一个MySQL数据库服务器作为主服务器,其他MySQL服务器作为从服务器,通过将主服务器上的数据变更同步到从服务器上,实现数据的复制和同步的过程。主从复制的实现方式主......
  • mysql分库分表 sharding-jdbc 5.0的代码实现 (二)
    分库分表之前试过了分表不分库,详情见:https://www.cnblogs.com/expiator/p/17524493.html这次再试下分库分表。依赖包SpringBoot用的是2.6.13版本。<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core-spring-boot-......
  • Codeforces 293B Distinct Paths
    发现\(n,m\)的数据范围是假的,因为每一步一个颜色最多也就\(k\le10\)种颜色,所以当\(n+m-1>k\)时一定无解。接下来发现这个数据范围挺小的,考虑状压,设\(f_{x,y}\)为走到\((x,y)\)点所用的颜色的集合,其可以由\(f_{x-1,y},f_{x,y-1}\)推来。然后就可以......
  • ShardingJDBC 01_概念及主要功能
    1ShardingJDBC是什么Sharding-JDBC是ApacheShardingSphere生态圈中一款开源的分布式数据库第三方组件。ShardingSphere由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar3款相互独立的产品组成。它们均提供标准化的数据分片、分布式事务和数据库治理功能,适用于Java......
  • ShardingSphere5入门到实战
    ShardingSphere5入门到实战第01章高性能架构模式互联网业务兴起之后,海量用户加上海量数据的特点,单个数据库服务器已经难以满足业务需要,必须考虑数据库集群的方式来提升性能。高性能数据库集群的第一种方式是“读写分离”,第二种方式是“数据库分片”。1、读写分离架构读写分......
  • 倒计时 2 天!预约本周六 ShardingSphere 线上圆桌会,赢取惊喜好礼!
    ......
  • Hardware.DataCable 数据线踩的一些坑
    早在安卓4.4时代,我就买过很多数据线,一般这些线用个半年就坏了,当时最耐用的还是小米的数据线,可以用个三四年,当然小米手机一直是2.0的速率,凭传输速率无法断定数据线质量,只能说它耐操。后来米4进入typeC时代,就买过一些C口线,当时并不知道这些线的触电定义,也没有仔细研究过,只知道这些......
  • mongodb-shard cluster
    1、shardcluster搭建及规划10个实例端口:38017-38026configserver:3台构成的复制集(1主两从,不支持arbiter)38018-38020shard节点:sh1:38021-23(1主两从,复制集名字sh1)sh2:38024-26(1主两从,复制集名字sh2)mongosmongos:380172、搭建shard节点规划创建安装路径$mkdir-......