CF1228F One Node is Gone
问题分析
这题感觉就是有很多种方法,然后一种都写不明白……
首先分为3种情况:
- 删了根节点下的一个节点,对应两个答案;
- 删了一个叶节点,对应一个答案;
- 删了一个其他节点,对应一个答案。
可以从叶子向上一层一层处理。第一个情况比较好判断;剩下两种情况通过对应节点儿子的个数来判断。注意第二种情况叶节点最大深度差只能是1,其他的点不能有深度差(毕竟是完全二叉树)。
面向数据编程
参考程序
#include <bits/stdc++.h>
//#include <unistd.h>
using namespace std;
const int Maxn = 131100;
struct edge {
int To, Next;
edge() {}
edge( int _To, int _Next ) : To( _To ), Next( _Next ) {}
};
edge Edge[ Maxn << 1 ];
int Start[ Maxn ], Used;
inline void AddEdge( int x, int y ) {
Edge[ ++Used ] = edge( y, Start[ x ] );
Start[ x ] = Used;
return;
}
int deep, n;
int Deg[ Maxn ], Dep[ Maxn ], Deep, Son[ Maxn ];
int Rec[ Maxn ], Left, Vis[ Maxn ];
int Ans[ 10 ];
int main() {
scanf( "%d", &deep );
n = 1; for( int i = 1; i <= deep; ++i ) n *= 2; n -= 2;
memset( Deg, 0, sizeof( Deg ) );
for( int i = 1; i < n; ++i ) {
int x, y;
scanf( "%d%d", &x, &y );
AddEdge( x, y );
AddEdge( y, x );
++Deg[ x ]; ++Deg[ y ];
}
Left = n;
Deep = 1;
for( int i = 1; i <= n; ++i )
if( Deg[ i ] == 1 )
Dep[ i ] = Deep;
while( Left > 1 ) {
//printf( "========================================\n" );
//printf( "Deg B:\n" );
//for( int i = 1; i <= n; ++i ) printf( "%d ", Deg[ i ] );
//printf( "\n" );
Rec[ 0 ] = 0;
for( int i = 1; i <= n; ++i )
if( Deg[ i ] == 1 ) {
Rec[ ++Rec[ 0 ] ] = i;
if( Son[ i ] != 3 && Dep[ i ] != Deep ) {
printf( "0\n" );
return 0;
}
if( Son[ i ] == 3 && Dep[ i ] + 1 != Deep ) {
printf( "0\n" );
return 0;
}
if( Son[ i ] != 2 && Son[ i ] != 0 ) {
if( Ans[ 0 ] ) {
printf( "0\n" );
return 0;
}
Ans[ ++Ans[ 0 ] ] = i;
}
}
//printf( "Rec %d\n", Rec[ 0 ] );
//for( int i = 1; i <= Rec[ 0 ]; ++i ) printf( "%d ", Rec[ i ] );
//printf( "\n" );
if( Rec[ 0 ] == 2 && Left == 2 ) {
if( Ans[ 0 ] ) {
printf( "0\n" );
return 0;
}
printf( "2\n%d %d\n", Rec[ 1 ], Rec[ 2 ] );
return 0;
}
for( int i = 1; i <= Rec[ 0 ]; ++i )
Vis[ Rec[ i ] ] = 1;
for( int i = 1; i <= Rec[ 0 ]; ++i ) {
int u = Rec[ i ];
for( int t = Start[ u ]; t; t = Edge[ t ].Next ) {
int v = Edge[ t ].To;
if( Vis[ v ] ) continue;
--Deg[ u ]; --Deg[ v ];
++Son[ v ];
if( Dep[ v ] == 0 ) Dep[ v ] = Deep + 1;
}
}
Left -= Rec[ 0 ];
++Deep;
//printf( "Deg A:\n" );
//for( int i = 1; i <= n; ++i ) printf( "%d ", Deg[ i ] );
//printf( "\n" );
//printf( "Left = %d\n", Left );
//printf( "Son:\n" );
//for( int i = 1; i <= n; ++i ) printf( "%d ", Son[ i ] );
//printf( "\n" );
//printf( "Ans = %d\n", Ans[ 0 ] );
//sleep( 3 );
}
printf( "1\n%d\n", Ans[ 1 ] );
return 0;
}
CF1228F One Node is Gone的更多相关文章
- babeljs源码
babel.min.js!function(e,t){"object"==typeof exports&&"object"==typeof mo ...
- NPM (node package manager) 入门 - 基础使用
什么是npm ? npm 是 nodejs 的包管理和分发工具.它可以让 javascript 开发者能够更加轻松的共享代码和共用代码片段,并且通过 npm 管理你分享的代码也很方便快捷和简单. 截至 ...
- node服务的监控预警系统架构
需求背景 目前node端的服务逐渐成熟,在不少公司内部也开始承担业务处理或者视图渲染工作.不同于个人开发的简单服务器,企业级的node服务要求更为苛刻: 高稳定性.高可靠性.鲁棒性以及直观的监控和报警 ...
- node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理
一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...
- 细说WebSocket - Node篇
在上一篇提高到了 web 通信的各种方式,包括 轮询.长连接 以及各种 HTML5 中提到的手段.本文将详细描述 WebSocket协议 在 web通讯 中的实现. 一.WebSocket 协议 1. ...
- 高大上的微服务可以很简单,使用node写微服务
安装 npm install m-service --save 使用 编写服务处理函数 // dir1/file1.js // 使用传入的console参数输出可以自动在日志里带上request id ...
- 构建通用的 React 和 Node 应用
这是一篇非常优秀的 React 教程,这篇文章对 React 组件.React Router 以及 Node 做了很好的梳理.我是 9 月份读的该文章,当时跟着教程做了一遍,收获很大.但是由于时间原因 ...
- 利用Node.js的Net模块实现一个命令行多人聊天室
1.net模块基本API 要使用Node.js的net模块实现一个命令行聊天室,就必须先了解NET模块的API使用.NET模块API分为两大类:Server和Socket类.工厂方法. Server类 ...
- Node.js:进程、子进程与cluster多核处理模块
1.process对象 process对象就是处理与进程相关信息的全局对象,不需要require引用,且是EventEmitter的实例. 获取进程信息 process对象提供了很多的API来获取当前 ...
随机推荐
- 终身机器学习(Lifelong Machine Learning)综述
终身机器学习(Lifelong Machine Learning)综述 2015年10月23日 17:34:57 qrlhl 阅读数 7805更多 分类专栏: 机器学习 版权声明:本文为博主原创文 ...
- 怎样终止(杀掉) Linux 中的进程?
使用 kill -9 进程号 命令, 可是强行终止该进程. 如果使用直接使用 kill 进程号 命令, 则会让进程 "自行了断" . 因此, 一般是 kill -9 进程号 用得较 ...
- 使用Enablebuffering多次读取Asp Net Core 请求体
使用Enablebuffering多次读取Asp Net Core 请求体 1 .Net Core 2.X时代 使用EnableRewind倒带 public IActionResult Index( ...
- url协议+域名+端口号
string url = System.Web.HttpContext.Current.Request.Url.Scheme + "://" + ...
- Intellij Idea 建立maven项目 报错 :java: 错误: 不支持发行版本 5
百度一搜这个错误,好多人都遇到了 不计其数的人都遇到.网上大多数都是菜鸟的愚见.经过本人的测试发现,用Idea建立普通的Java项目 然后随便建立一个类运行就不会报错. 但是如果用Idea建立一个普通 ...
- phpcms修改重置后台账号和密码
通过Phpmyadmin等工具,打开数据库中找到v9_admin表: 把password字段值改为: 0b817b72c5e28b61b32ab813fd1ebd7f再把encrypt字段值改为: 3 ...
- 前端配置jenkins
tar命令详解:https://www.cnblogs.com/luck123/p/11401007.html
- 用php连接数据库,并执行数据库操作
1,建立与数据库之间的连接 (能通过php代码执行一个SQL语句得到查询的结果) <?php mysqli_connect(' , 'demo01'); 这里要注意两个问题: ①mysqli 是 ...
- 2 java开发环境的配置步骤
1 首先需要下载JDK(以java se development kit java标准版开发包) 8.0 如果只是单纯的运行java程序则只需要安装JRE(java runtime envirome ...
- 【NOIP2017】小凯的疑惑
原题: 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有 无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的.现在小 凯想知道在无法准确支付的物品中,最贵的价 ...