Hacker Rank: Kingdom Division 不完全报告
原题链接:
Kingdom Division
- 由于树的层次可能很深,所以这里不能使用递归版的DFS。我使用了BFS。
- BFS确定各结点的父结点和它的孩子数。
- 用逆拓扑排序确定结点的计算顺序。
- same[u][] 表示u结点颜色为0孩子结点颜色全为1时组合数。 diff[u][] 表示u结点颜色为0时可行组合数。本结点颜色为0,子结点颜色为1,孙结点颜色全为0是无效组合。反之亦然。由于这里颜色0、1相互对称, same[u][]=same[u][]; diff[u][]=diff[u][]; 。
- 为排除无效组合,计算 diff[u][] 时没有乘以 same[u][] 。
- 本结点为0,孩子结点全为1,是无效组合,因此 diff[u][] 最后还要减去 same[u][] 。
#include <cmath>
#include <cstdio>
#include <cassert>
#include <vector>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
const int MOD = 1e9+;
int main() {
/* Enter your code here. Read input from STDIN. Print output to STDOUT */
int n = ; assert( == scanf("%d", &n));
vector<vector<int>> adjList(n + );
for(int i = ; i < n - ; i++){
int u, v; assert( == scanf("%d %d", &u, &v));
adjList[u].push_back(v);
adjList[v].push_back(u);
}
vector<vector<long long>> diff(n + , vector<long long>(, ));
vector<vector<long long>> same(n + , vector<long long>(, ));
vector<int> parent(n + , );
vector<int> child_cnt(n + , );
queue<int> traversal_array;
vector<bool> visited(n + , false);
traversal_array.push();
visited[] = true;
while(!traversal_array.empty()){
int tmp = traversal_array.front();
traversal_array.pop();
for(auto vit: adjList[tmp]){
if(!visited[vit]){
visited[vit] = true;
child_cnt[tmp]++;
parent[vit] = tmp;
traversal_array.push(vit);
}
}
} for(int c_i = ; c_i <= n; c_i++){
if(!child_cnt[c_i]){
traversal_array.push(c_i);
}
} while(!traversal_array.empty()){
int tmp = traversal_array.front();
traversal_array.pop();
child_cnt[parent[tmp]]--;
if(child_cnt[parent[tmp]] == ){
traversal_array.push(parent[tmp]);
}
for(auto vit: adjList[tmp]){
if(vit != parent[tmp]){
same[tmp][] = same[tmp][] * diff[vit][] % MOD;
same[tmp][] = same[tmp][] * diff[vit][] % MOD;
}
}
for(auto vit: adjList[tmp]){
if(vit != parent[tmp]){
diff[tmp][] = diff[tmp][] * (diff[vit][] + diff[vit][] + same[vit][]) % MOD;
diff[tmp][] = diff[tmp][] * (diff[vit][] + diff[vit][] + same[vit][]) % MOD;
}
}
diff[tmp][] = (diff[tmp][] - same[tmp][] + MOD) % MOD;
diff[tmp][] = (diff[tmp][] - same[tmp][] + MOD) % MOD;
}
printf("%lld\n", (diff[][] + diff[][])%MOD);
return ;
}
Hacker Rank: Kingdom Division 不完全报告的更多相关文章
- [Gym - 100517K] Kingdom Division 2 二分
大致题意: 给出一个凸包,以及凸包内的两个点p1,p2,求有多少条经过凸包顶点的直线能够将凸包分割为两部分,且给出的两点分别属于不同的部分 枚举凸包的顶点,二分求出p1,p2线段左边的最大坐标L以及右 ...
- 「BZOJ1385」「Baltic2000」Division expression 解题报告
Division expression Description 除法表达式有如下的形式: \(X_1/X_2/X_3.../X_k\) 其中Xi是正整数且\(X_i \le 1000000000(1 ...
- Hacker Rank: Two Strings - thinking in C# 15+ ways
March 18, 2016 Problem statement: https://www.hackerrank.com/challenges/two-strings/submissions/code ...
- LightOj1385 - Kingdom Division(数学几何题)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1385 题意:下图中已知面积 a b c 求 d; 如果d的面积不确定,输出-1. 连接 ...
- Hackrank Kingdom Division 树形DP
题目链接:传送门 题意: 给你一棵树,n个点 每个点可以染成红色和蓝色 但是红色的点与其相邻的点中必须有红色节点,蓝色也是 问你有多少种染色的方案 题解: 树形dp 先转化为有根树,取1为根 设定dp ...
- interview material
Articles Recommended: Steve Yegge – Get That Job at Google [web] Carlos Bueno – Get That Job at Face ...
- Programming Series 1.0 — C Programming
In the growing world of technology, C programming has kind of lost its way. Today, we have a million ...
- JavaScript函数式编程究竟是什么?
摘要: 理解函数式编程. 作者:前端小智 原文:JS中函数式编程基本原理简介 Fundebug经授权转载,版权归原作者所有. 在长时间学习和使用面向对象编程之后,咱们退一步来考虑系统复杂性. 在做了一 ...
- Facebook Hacker Cup 2014 Qualification Round 竞赛试题 Square Detector 解题报告
Facebook Hacker Cup 2014 Qualification Round比赛Square Detector题的解题报告.单击这里打开题目链接(国内访问需要那个,你懂的). 原题如下: ...
随机推荐
- Ensemble Learning: Bootstrap aggregating (Bagging) & Boosting & Stacked generalization (Stacking)
Booststrap aggregating (有些地方译作:引导聚集),也就是通常为大家所熟知的bagging.在维基上被定义为一种提升机器学习算法稳定性和准确性的元算法,常用于统计分类和回归中. ...
- Select()使用否?
David Treadwell ,Windows Socket 的一位开发者,曾经在他的一篇名为"Developing Transport-Independent Applications ...
- AIM Tech Round 4 (Div. 2)ABCD
A. Diversity time limit per test 1 second memory limit per test 256 megabytes input standard input o ...
- Button标签自动刷新问题
在form表单中,button标签在IE浏览器 type类型默认是button ,而在其他浏览器默认是submit. 解决方法1: 设置类型type="button" <bu ...
- IE9总是弹出“ICBC Anti-Phishing class” 加载项是否要启用还是不启用的提示
解决方法: 后来在通过查询,发现 IcbcDaemon.exe 进程是写在系统服务中的,我们可以在系统的服务管理工具中停止该服务: 1.单击开始,在搜索框中输入 services.msc ,按下回车键 ...
- Web API 路由 [二] Attribute Routing
1) 启用.在App_Start - WebApiConfig.cs下 //在Register函数添加如下代码: config.MapHttpAttributeRoutes(); 2) 使用.Cont ...
- ch1-vuejs基础入门(hw v-bind v-if v-for v-on v-model 应用组件简介 小案例)
1 hello world 引入vue.min.js 代码: ----2.0+版本 <div id="test"> {{str}} </div> <s ...
- SqlServer2008 导入导出txt或Execl数据
--右键user表所在的数据库,然后任务--导出数据,然后根据提示设置就行 --从txt中导入 EXEC master..xp_cmdshell 'bcp Northwind.dbo.sysusers ...
- ActiveMQ——activemq的详细说明,queue、topic的区别(精选)
JMS中定义了两种消息模型:点对点(point to point, queue)和发布/订阅(publish/subscribe,topic).主要区别就是是否能重复消费. 点对点:Queue,不可重 ...
- python基于万象优图识别图片中的中文
最近一直在研究光学字符识别,即OCR.最开始在谷爹那里了解到了开源的Tesseract,可以拿来识别简单的英文和数字.但是识别中文的准确率并不高. 然后从Tesseract到Tesseract.js, ...