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来获取当前 ...
随机推荐
- C# Reflection exception Method not found
C# Reflection exception Method not found Ok I figured it out. The server has Microsft .NET 4.0 insta ...
- Aveva Marine 新建项目001
1# 项目代号定义,三个字符,例如Abc 2# 新建文件夹,命名为“Abc” 3# 新建文件名为evars.bat文件,放到项目文件夹的根目录 内容为: SET Abc000=项目文件夹路径\Abc0 ...
- .NET监视程序运行时间
使用Stopwatch类(命名空间:System.Diagnostics;) 示例: using System; using System.Collections.Generic; using Sys ...
- 【ES6 】const命令
本质 const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动. 对于简单类型的数据(数值.字符串.布尔值),值就保存在变量指向的那个内存地址,因此等同于常量. ...
- 关于VSS(Volume Shadow Copy Service)一
在开发windows VSS应用程序时 我们应该先下载相关SDK,微软描述如下 When developing your own VSS application, you should observe ...
- 佳能单反SDK 步骤
EdsInitializeSDK(); EdsGetCameraList(&eclr);//获取相机列表 EdsGetChildCount(eclr, &camCount); //获 ...
- 深入理解hadoop数据倾斜
深入理解hadoop之数据倾斜 1.什么是数据倾斜 我们在用map /reduce程序执行时,有时候会发现reduce节点大部分执行完毕,但是有一个或者几个reduce节点运行很慢,导致整个程序的处理 ...
- IOS 伪类:active失效
IOS中不兼容:active伪类,所以在状态控制上就会有问题,解决办法是,添加一个空的点击事件: 移动端添加:ontouchstart <a class="m-btn" on ...
- 有关图片上传的相关知识input type=file,HTML5的 input:file上传类型控制
遇到项目,要求做一个影像系统,对于前端开发需要了解file的相关属性,以及如何开发.工欲善其事,必先利器嘛.度娘一阵子搜索,找资料.这年头,需要的是你解决问题的能力啊! 参考应用:https://ww ...
- Groovy--使用模板引擎和GroovyShell执行插值字符串
package curveJudge import groovy.text.SimpleTemplateEngine /** * Created by Jxy on 2019/8/26 17:16 * ...