「AGC034E」 Complete Compress

显然可以枚举根。

然后把某两棵棋子同时往深度浅的方向提,即对不存在祖先关系的两个棋子进行操作。

如果能到达那么就更新答案。

问题转化为如何判定能够到达。

考虑对于某一个节点,合法的条件是什么。

设 \(f_u\) 为以 \(u\) 为根的子树中的棋子还需要移动多少步,容易发现对于节点 \(u\) 的所有孩子 \(v\),若存在一个 \(x\) 有 \(f_x>(\sum f_v)-f_x\),那么 \(f_x\) 一定不能移动完。

然后根据这个东西随便 \(\texttt{DP}\) 转移一下就行。

似乎存在更优秀的做法。

/*---Author:HenryHuang---*/
/*---Never Settle---*/
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
char s[maxn];
int w[maxn],dep[maxn];
int f[maxn],siz[maxn];
vector<int> e[maxn];
void dfs(int u,int fa){
dep[u]=dep[fa]+1;dep[u]=f[u]=0,siz[u]=w[u];
int son=0;
for(auto v:e[u]){
if(v==fa) continue;
dfs(v,u);
siz[u]+=siz[v];dep[u]+=dep[v];
if(f[v]>f[son]) son=v;
}
f[u]=(f[son]<=dep[u]-dep[son]?dep[u]&1:f[son]-(dep[u]-dep[son]));
dep[u]+=siz[u],f[u]+=siz[u];
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int n;cin>>n;
cin>>(s+1);
for(int i=1;i<=n;++i) w[i]=s[i]-'0';
for(int i=1;i<n;++i){
int a,b;cin>>a>>b;
e[a].emplace_back(b);
e[b].emplace_back(a);
}
int ans=998244353;
for(int i=1;i<=n;++i){
dep[0]=-1;
dfs(i,0);
if(f[i]==siz[i]) ans=min(ans,(dep[i]-siz[i])/2);
}
if(ans==998244353) cout<<-1<<'\n';
else cout<<ans<<'\n';
return 0;
}

「AGC034E」 Complete Compress的更多相关文章

  1. 「CF716D」Complete The Graph「最短路」

    题意 给定一个\(n\)个点\(m\)条边的无向图,有一些边权暂时为\(0\),你需要分配一个\([1, 10^{18}]\)的数.最终使得\(s\)到\(t\)最短路为\(L\),输出一个可行的分配 ...

  2. 【微信小程序】开发实战 之 「配置项」与「逻辑层」

    微信小程序作为微信生态重要的一环,在实际生活.工作.商业中的应用越来越广泛.想学习微信小程序开发的朋友也越来越多,本文将在小程序框架的基础上就微信小程序项目开发所必需的基础知识及语法特点进行了详细总结 ...

  3. 「MoreThanJava」Java发展史及起航新世界

    「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...

  4. 「译」JUnit 5 系列:条件测试

    原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...

  5. 「译」JUnit 5 系列:扩展模型(Extension Model)

    原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...

  6. JavaScript OOP 之「创建对象」

    工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...

  7. 「C++」理解智能指针

    维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...

  8. 「JavaScript」四种跨域方式详解

    超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...

  9. 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management

    写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...

随机推荐

  1. GO学习-(25) Go操作Redis实战

    Go操作Redis实战   安装Redis客户端 Go语言中使用第三方库https://github.com/go-redis/redis连接Redis数据库并进行操作.使用以下命令下载并安装: go ...

  2. 查询rman备份信息常用指令

      查询rman备份信息常用指令 ----登陆到rman $rman target / ----以精简的格式查看备份信息 RMAN> list backup of database summar ...

  3. Jmeter- 笔记4 - 参数化 、函数

    参数化 调用变量的用法: ${变量名} 参数化第一 二种. 定义变量的两种方法: 配置元件(Config Element) -> 用户定义的变量(User Defined Variables) ...

  4. 点云配准的端到端深度神经网络:ICCV2019论文解读

    点云配准的端到端深度神经网络:ICCV2019论文解读 DeepVCP: An End-to-End Deep Neural Network for Point Cloud Registration ...

  5. MegEngine 框架设计

    MegEngine 框架设计 MegEngine 技术负责人许欣然将带了解一个深度学习框架是如何把网络的定义逐步优化并最终执行的,从框架开发者的视角来看待深度学习. 背景 AI 浪潮一波又一波,仿佛不 ...

  6. 使用Runtime执行推理(C++)

    使用Runtime执行推理(C++) 概述 通过MindSpore Lite模型转换后,需在Runtime中完成模型的推理执行流程.本教程介绍如何使用C++接口编写推理代码. Runtime总体使用流 ...

  7. 编译器架构Compiler Architecture(上)

    编译器架构Compiler Architecture(上) 编译器是程序,通常是非常大的程序.它们几乎都有一个基于翻译分析综合模型的结构. CONTENTS Overview • Compiler C ...

  8. 孟老板 BaseAdapter封装(五) ListAdapter

    BaseAdapter封装(一) 简单封装 BaseAdapter封装(二) Header,footer BaseAdapter封装(三) 空数据占位图 BaseAdapter封装(四) PageHe ...

  9. 简单测试 APISIX2.6 网关

    Apache APISIX是一个动态的.实时的.高性能的 API 网关.它提供丰富的流量管理功能,例如负载均衡.动态上游服务.金丝雀发布.断路.身份验证.可观察性等.您可以使用 Apache APIS ...

  10. 深入解读Redis分布式锁

    之前码甲哥写了两篇有关线程安全的文章: 你管这叫线程安全? .NET八股文:线程同步技术解读 分布式锁是"线程同步"的延续 最近首度应用"分布式锁",现在想想, ...