[43] (CSP 集训) CSP-S 模拟 10

news/2024/12/22 1:22:51/文章来源:https://www.cnblogs.com/HaneDaCafe/p/18451391

B.清扫

考虑从叶子节点往上推

首先可以发现的几个性质

  • 子树内需要消除的数,要么通过子树根节点 “发送” 到上面(只经过子树内一个叶节点),要么通过自己的叶节点解决
  • 对于子树内既不是根也不是叶节点的节点,节点上的值只能由这一支路的叶节点消除,所以如果他节点上的值和下面节点 “发送” 上来的值不相等时,无解

然后考虑怎么去计算子树根节点向上的 “发送” 数量

设这个数量为 \(k\),子树各支路 “发送” 到子树根节点的数量总和为 \(s\),子树根节点的权值为 \(a\),可以发现

  • 子树内解决会为 \(s\) 带来 \(-2\) 的贡献
  • “发送” 出去会为 \(s\) 带来 \(-1\) 的贡献
  • 无论何种操作,每次操作总会给 \(a\) 带来 \(-1\) 的贡献

因此:

\[k+2(a-k)=s \]

由此可以唯一确定 \(k\),将这个值继续往上传即可

例图

这是一个 \(k=0\) 的图

需要注意的

  • 由题有 \(0\le k\le a\),否则无解
  • 我们在上述式子中只判断了数量关系,但实际上,由于子树内必须要选择不同的叶子配对,因此可能会出现有叶子无法使用的情况,此时是无解的

这种情况的判断方式:\(s\) 个数的最大配对次数是 \(s/2\),其次,每个点不能和自己匹配,所以有一个限制是 \(s-\max\)(其中 \(\max\) 是子树传入的最大值),这两个值取 \(\min\),然后和子树的值总和比较,小于说明有剩余,报告无解

  • 注意 \(n=2\) 的情况需要特判
#include<bits/stdc++.h>
using namespace std;
int n;
int a[100001];
vector<int>e[100001];
int degree[100001];
bool flag=false;
int dfs(int now,int last){
//	cout<<"dfs "<<now<<" "<<last<<endl;int res=0,cnt=0,maxn=0;for(int i:e[now]){if(i!=last){cnt++;int r=dfs(i,now);res+=r;maxn=max(maxn,r);if(flag) return 0;}}if(cnt==0){return a[now];}if(cnt==1){if(res!=a[now]){flag=true;return 0;}return res;}if(res<a[now] or res>2*a[now]){flag=true;return 0;}if(min(res/2,res-maxn)<res-a[now]){flag=true;return 0;} return 2*a[now]-res;
}
int main(){freopen("tree.in","r",stdin);freopen("tree.out","w",stdout);
//	freopen("b.in","r",stdin);scanf("%d",&n);for(int i=1;i<=n;++i){scanf("%d",&a[i]);}if(n==2){cout<<(a[1]==a[2]?"YES":"NO")<<'\n';return 0;}for(int i=1;i<=n-1;++i){int x,y;scanf("%d %d",&x,&y);e[x].push_back(y);e[y].push_back(x);degree[x]++;degree[y]++;}for(int i=1;i<=n;++i){
//		cout<<i<<" "<<degree[i]<<"::"<<endl;if(degree[i]!=1){if(dfs(i,0)){flag=true;}break;}}cout<<(flag?"NO":"YES");
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/809892.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DevNow: Search with Lunrjs

前言 假期真快,转眼国庆假期已经到了最后一天。这次国庆没有出去玩,在北京看了看房子,原先的房子快要到期了,找了个更加通透一点的房子,采光也很好。 闲暇时间准备优化下 DevNow 的搜索组件,经过上一版 搜索组件优化 - Command ⌘K 的优化,现在的搜索内容只能支持标题,…

Nuxt.js 应用中的 page:start 钩子详解

title: Nuxt.js 应用中的 page:start 钩子详解 date: 2024/10/8 updated: 2024/10/8 author: cmdragon excerpt: page:start 是一个关键的钩子,可以在页面加载时执行必要的逻辑,以提升用户体验。通过合理地使用这个钩子,可以创建流畅的页面导航体验,并提供用户反馈。 ca…

01-flask简单介绍

Flask是一个使用 Python 编写的轻量级 Web 应用框架,对比与Django框架呢,他的灵活度就很高了,可以自己一些设计代码框架。比较适合一些,分层比较少,逻辑不怎么复杂的web项目pip安装pip install flask -i https://pypi.tuna.tsinghua.edu.cn/simple 简单实例from flask im…

MySQL9的3个新特性

本文讲解MySQL9的3个新特性:支持将JSON输出保存到用户变量、支持准备语句以及支持面向AI的向量存储。 17.12 MySQL9新特性1——支持将JSON输出保存到用户变量 从MySQL 9版本开始支持将EXPLAIN FORMAT的JSON输出保存到用户变量,下面通过一个案例来理解该新特性。创建演示数据…

CSP-S 2024 第十次

AK 了就结束,USACO 赛制是吧( 神秘难度排序,D<C<A<B A 手模一下可以发现线性基里的数最多也只有两位,考虑模拟一个数插进线性基的过程。 对于 \(2^x\),其会依次异或上 \(2^x+2^{x},2^{x}+2^{x}\)……直到线性基里找不到最高位为 \(x\) 的数,或者某时刻异或上了一…

技术解读GaussDB (for MySQL)流控机制

本文详细分析了GaussDB (for MySQL) 在不同层级的流控机制,包括反馈式流控在存储层和计算层的策略和流程,以及计算节点的主动平滑流控的方案。本文分享自华为云社区《【华为云MySQL技术专栏】GaussDB (for MySQL)流控技术解读》,作者:GaussDB 数据库。本文主要介绍GaussDB …

sicp每日一题[2.36-2.37]

果然习惯不能停,就两天没学,昨天就忘的干干净净了。。今天把昨天的补上Exercise 2.36The procedure accumulate-n is similar to accumulate except that it takes as its third argument a sequence of sequences, which are all assumed to have the same number of elemen…

秒杀系统的原则和注意项

做秒杀方案亦是如此,秒杀活动经常会引发高并发、系统宕机和库存超卖的棘手问题,作为开发者,我们该如何在保证系统稳定性的同时,防止业务风险呢?做任何技术方案都需要结合当时的业务场景、资金情况、用户体量等维度综合考虑,没有最好的技术方案,只有最合适的技术方案。做…

电力佩戴安全帽监测 安全带穿戴监测系统

电力佩戴安全帽监测和安全带穿戴监测系统通过在电力作业区域安装摄像头,电力佩戴安全帽监测 安全带穿戴监测系统对工作人员的佩戴情况进行实时监测。电力佩戴安全帽监测 安全带穿戴监测系统利用图像识别和深度学习技术,对工作人员的安全帽和安全带的佩戴情况进行识别和分析。…

比裁员更侮辱人的事发生了。。。

大家好,我是R哥。 前段时间和一个粉丝聊天,说他去年降过一次薪,今年公司又裁了一批,工资又不高,他现在一个人干着几个人的活,每天忙的要命,想脱离,看看更好的机会。 他躲过了裁员,没躲过降薪,没躲过一个人泰山压顶。 本想着冲动离职全身心找工作, 又想到有房贷要供,…