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题的解题报告.单击这里打开题目链接(国内访问需要那个,你懂的). 原题如下: ...
随机推荐
- 如何解决Python.h:No such file or directory
安装python2.7对应的dev sudo apt-get install python-dev 安装python3.6对应的dev sudo apt-get install python3-dev
- Redis学习——Redis持久化之RDB备份方式保存数据
从这一个介绍里面知道,redis比memcache作为缓存数据库强大的地方,一个是支持的数据类型比较多,另一个就是redis持久化功能. 下面就介绍Redis的持久化之RDB! 一:什么是redis的 ...
- hdu 5937 -- Equation(搜索)
题目链接 problem description Little Ruins is a studious boy, recently he learned addition operation! He ...
- apollo实现c#与android消息推送(二)
安装完成apache apollo后,org.eclipse.paho是很方便的测试软件,下来介绍paho的安装和使用 2. 搭建paho: a 下载 org.eclipse.paho.ui.app- ...
- hdu1116有向图判断欧拉通路判断
Play on Words Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
- 使用python实现后台系统的JWT认证(转)
今天的文章介绍一种适用于restful+json的API认证方法,这个方法是基于jwt,并且加入了一些从oauth2.0借鉴的改良. 1. 常见的几种实现认证的方法 首先要明白,认证和鉴权是不同的.认 ...
- Python系列之内置函数
内置函数 一.数学运算类: abs(a):求绝对值如果参数是个复数则返回复数的模. a = abs(-1) print(a) >>>1 compilex([real[, imag]] ...
- python数据结构之树和二叉树(先序遍历、中序遍历和后序遍历)
python数据结构之树和二叉树(先序遍历.中序遍历和后序遍历) 树 树是\(n\)(\(n\ge 0\))个结点的有限集.在任意一棵非空树中,有且只有一个根结点. 二叉树是有限个元素的集合,该集合或 ...
- 博客发在oschina
国内git.oschina做的很好,看到oschina还有博客 直接导入csdn博客 http://my.oschina.net/lindexi/blog
- 从零开始教你封装自己的vue组件
组件(component)是vue.js最强大的功能之一,它可以实现功能的复用,以及对其他逻辑的解耦.但经过一段时间的使用,我发现自己并没有在业务中发挥出组件的最大价值.相信很多刚开始使用vue的朋友 ...