2018.09.22 atcoder Integers on a Tree(构造)

本文探讨了在图论问题中,如何通过检查特殊点的权值奇偶性和取值范围合法性来判断解的存在性,并提供了一种有效的解构算法。通过深度优先搜索(DFS)验证条件并构造解,确保了在满足条件的情况下总能找到一组解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传送门
先考虑什么时候不合法。
第一是考虑任意两个特殊点的权值的奇偶性是否满足条件。
第二是考虑每个点的取值范围是否合法。
如果上述条件都满足的话就可以随便构造出一组解。
代码:

#include<bits/stdc++.h>
#define N 100005
#define inf 0x3f3f3f3f
using namespace std;
inline int read(){
	int ans=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return ans;
}
int n,k,first[N],cnt,fa[N],val[N],low[N],high[N],ans[N],rt;
bool is[N];
struct edge{int v,next;}e[N<<1];
inline void add(int u,int v){e[++cnt].v=v,e[cnt].next=first[u],first[u]=cnt;}
inline int max(int a,int b){return a>b?a:b;}
inline int min(int a,int b){return a<b?a:b;}
inline bool dfs1(int p,int fa,bool tmp){
	if(is[p]&&tmp!=(val[p]&1))return false;
	for(int i=first[p];i;i=e[i].next){
		int v=e[i].v;
		if(v==fa)continue;
		if(!dfs1(v,p,(tmp^1)))return false;
	}
	return true;
}
inline bool dfs2(int p,int fa){
	if(is[p])low[p]=high[p]=val[p];
	for(int i=first[p];i;i=e[i].next){
		int v=e[i].v;
		if(v==fa)continue;
		if(!dfs2(v,p))return false;
		low[p]=max(low[p],low[v]-1),high[p]=min(high[p],high[v]+1);
	}
	return low[p]<=high[p];
}
inline void dfs3(int p,int fa,int w){
	ans[p]=w;
	for(int i=first[p];i;i=e[i].next){
		int v=e[i].v;
		if(v==fa)continue;
		dfs3(v,p,(low[v]<=w-1&&high[v]>=w-1?w-1:w+1));
	}
}
int main(){
	n=read();
	for(int i=1;i<n;++i){
		int a=read(),b=read();
		add(a,b),add(b,a);
	}
	for(int i=1;i<=n;++i)low[i]=-inf,high[i]=inf;
	k=read();
	for(int i=1;i<=k;++i){
		int a=read(),b=read();
		val[a]=b,is[a]=1,rt=a;
	}
	if(!dfs1(rt,0,(val[rt]&1))||!dfs2(rt,0)){puts("No");return 0;}
	puts("Yes");
	dfs3(rt,0,val[rt]);
	for(int i=1;i<=n;++i)printf("%d\n",ans[i]);
	return 0;
}

转载于:https://www.cnblogs.com/ldxcaicai/p/9738231.html

### 关于 `np.random.Generator.integers` 的方法解析 `np.random.Generator.integers` 是 NumPy 中用于生成随机整数的方法之一。它可以从离散均匀分布中抽取样本,支持多种参数配置来满足不同的需求。 #### 参数说明 以下是该方法的主要参数及其作用: - **low**: 随机数范围的下界(包含)。如果仅提供此参数,则生成的随机数范围为 `[0, low)`。 - **high (可选)**: 随机数范围的上界(不包含)。如果不指定,默认情况下会将 `low` 视作上限,并从区间 `[0, low)` 抽取随机数[^2]。 - **size (可选)**: 输出数组的形状。可以是一个整数值表示一维数组长度,或者元组形式定义多维数组大小。如果没有指定,则返回单个值。 - **dtype (可选)**: 返回数据类型的种类,例如 `int`, `uint32` 等。默认为最接近输入范围的数据类型。 - **endpoint (可选)**: 布尔型标志位。当设置为 `True` 时,`high` 将被视作闭区间的端点;即随机数可能等于 `high`。 #### 示例代码展示 下面是一些具体的例子演示如何使用这个功能强大的工具。 ```python import numpy as np rng = np.random.default_rng() # 创建一个新的随机数生成器实例 # 单个随机整数生成 single_random_int = rng.integers(low=1, high=10) print(f"Single Random Integer between 1 and 9: {single_random_int}") # 多个随机整数的一维数组 array_of_randoms = rng.integers(low=-5, high=5, size=(5,)) print(f"One-dimensional Array of Random Integers: {array_of_randoms}") # 构建二维随机整数矩阵 matrix_of_randoms = rng.integers(low=0, high=100, size=(3, 3)) print("Two-dimensional Matrix of Random Integers:") print(matrix_of_randoms) # 使用 endpoint=True 来允许达到 upper bound inclusive_upper_bound = rng.integers(low=1, high=6, size=(4,), endpoint=True) print(f"Inclusive Upper Bound Example with Endpoint True: {inclusive_upper_bound}") ``` #### 结果解释 上述脚本执行后将会打印出一系列由不同条件约束下的伪随机整数集合。注意每次运行程序都会得到新的结果集除非种子固定不变如前述提到通过特定 seed 初始化 generator 实现重复实验的目的[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值