2020牛客寒假算法基础集训营1 F-maki和tree
链接:https://ac.nowcoder.com/acm/contest/3002/F
来源:牛客网
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
这个树有
maki想知道,取两个不同的点,它们的简单路径上有且仅有一个黑色点的取法有多少?
注:
①树上两点简单路径指连接两点的最短路。
②
输入描述:
- 第一行一个正整数n。代表顶点数量。
- 第二行是一个仅由字符'B'和'W'组成的字符串。第 i个字符是B代表第 i 个点是黑色,W代表第 i个点是白色。
- 接下来的n-1行,每行两个正整数 x , y,代表 x 点和 y点有一条边相连
输出描述:
- 一个正整数,表示只经过一个黑色点的路径数量。
说明

关于_find中为什么是sum += sz[r2]的问题,因为建的是无向图,不保证此时的fa[r1]一定是与fa[r2]相等的
- #include <bits/stdc++.h>
- #define dbg(x) cout << #x << "=" << x << endl
- using namespace std;
- typedef long long LL;
- const int maxn = 1e6 + ;
- int n;
- LL ans;
- int fa[maxn];
- int a[maxn];
- int head[maxn];
- char c[maxn];
- int cnt = ;
- LL sz[maxn];
- LL num[maxn];
- int _count = ;
- //vector <int> g[maxn];
- struct Edge {
- int to,nxt;
- }edge[maxn];
- void BuildGraph(int u, int v) {
- edge[cnt].to = v;
- edge[cnt].nxt = head[u];
- head[u] = cnt++;
- edge[cnt].to = u;
- edge[cnt].nxt = head[v];
- head[v] = cnt++;
- }
- void init()
- {
- memset(head, -, sizeof(head));
- for(int i = ; i <= n; i++) {
- fa[i] = i;
- sz[i] = ;
- }
- }
- namespace _buff {
- const size_t BUFF = << ;
- char ibuf[BUFF], *ib = ibuf, *ie = ibuf;
- char getc() {
- if (ib == ie) {
- ib = ibuf;
- ie = ibuf + fread(ibuf, , BUFF, stdin);
- }
- return ib == ie ? - : *ib++;
- }
- }
- int read() {
- using namespace _buff;
- int ret = ;
- bool pos = true;
- char c = getc();
- for (; (c < '' || c > '') && c != '-'; c = getc()) {
- assert(~c);
- }
- if (c == '-') {
- pos = false;
- c = getc();
- }
- for (; c >= '' && c <= ''; c = getc()) {
- ret = (ret << ) + (ret << ) + (c ^ );
- }
- return pos ? ret : -ret;
- }
- int fid(int x)
- {
- int r = x;
- while(fa[r] != r) {
- r = fa[r];
- }
- int i,j;///路径压缩
- i = x;
- while(fa[i] != r) {
- j = fa[i];
- fa[i] = r;
- i = j;
- }
- return r;
- }
- void join(int r1,int r2)///合并
- {
- int fidroot1 = fid(r1), fidroot2 = fid(r2);
- int root = min(fidroot1, fidroot2);
- sz[root] = sz[fidroot1] + sz[fidroot2];
- if(fidroot1 != fidroot2) {
- fa[fidroot2] = root;
- fa[fidroot1] = root;
- }
- }
- LL _find(int x) {
- //dbg(x);
- LL sum = ;
- for(int i = head[x]; ~i; i = edge[i].nxt) {
- int v = edge[i].to;
- if(a[v]) {
- //num[v] = 0;
- continue;
- }
- int r1 = fid(x), r2 = fid(v);
- sum += sz[r2];
- num[++_count] = sz[r2];
- }
- return sum;
- }
- int main()
- {
- scanf("%d\n",&n);
- init();
- ans = ;
- scanf("%s",c);
- for(int i = ; i < n; ++i) {
- if(c[i] == 'W') {
- a[i+] = ;
- }
- else {
- a[i+] = ;
- }
- }
- for(int i = ; i < n; ++i) {
- int x, y;
- scanf("%d %d",&x, &y);
- BuildGraph(x,y);
- if(!a[x] && !a[y]) {
- join(x,y);
- }
- }
- for(int i = ; i <= n; ++i) {
- if(a[i] == ) continue;
- _count = ;
- memset(num, , sizeof(num));
- ans += _find(i);
- for(int j = ; j <= _count; ++j) {
- for(int k = j+; k <= _count; ++k) {
- ans += num[j] * num[k];
- }
- }
- }
- printf("%lld\n",ans);
- }
2020牛客寒假算法基础集训营1 F-maki和tree的更多相关文章
- 2020牛客寒假算法基础集训营2 J题可以回顾回顾
2020牛客寒假算法基础集训营2 A.做游戏 这是个签到题. #include <cstdio> #include <cstdlib> #include <cstring ...
- 2020牛客寒假算法基础集训营1 J题可以回顾回顾
2020牛客寒假算法基础集训营1 这套题整体来说还是很简单的. A.honoka和格点三角形 这个题目不是很难,不过要考虑周全,面积是1,那么底边的长度可以是1也可以是2, 注意底边1和2会有重复的, ...
- 2020牛客寒假算法基础集训营4-F树上博弈
链接:https://ac.nowcoder.com/acm/contest/3005/F来源:牛客网 题目描述 现有一个 n 个点,n-1条边组成的树,其中 1 号点为根节点. 牛牛和牛妹在树上玩游 ...
- 2020牛客寒假算法基础集训营4-I 匹配星星【贪心】
链接:https://ac.nowcoder.com/acm/contest/3005/I来源:牛客网 示例1 输入 复制 2 1 1 0 2 2 1 2 1 1 0 2 2 1 输出 复制 1 1 ...
- 牛客寒假算法基础集训营4 F Applese 的大奖
链接:https://ac.nowcoder.com/acm/contest/330/H来源:牛客网 Applese 和它的小伙伴参加了一个促销的抽奖活动,活动的规则如下:有一个随机数生成器,能等概率 ...
- 牛客寒假算法基础集训营4 F Applese 的QQ群
链接:https://ac.nowcoder.com/acm/contest/330/F来源:牛客网 Applese 有一个QQ群.在这个群中,大家互相请教问题.如 b 向 a 请教过问题,就把 a ...
- 2020牛客寒假算法基础集训营5 G街机争霸
题目描述 哎,又是银首,要是你这个签到题少WA一发就金了 牛牛战队的队员打完比赛以后又到了日常甩锅的时间.他们心情悲伤,吃完晚饭以后,大家相约到一个街机厅去solo.牛牛和牛能进入了一个迷宫,这个迷宫 ...
- 2020牛客寒假算法基础集训营4 D:子段异或
D : 子段异或 考察点 : 位运算,前缀和,异或的性质和应用 坑点 : 0 - L 的异或值是 0 的话也是一个区间 相同的值可能有多个,那么这时候区间就会有多个(x * (x + 1) / 2) ...
- 2020牛客寒假算法基础集训营6 I.导航系统 (最小生成树)
https://ac.nowcoder.com/acm/contest/3007/I 题中给定的图必定是一棵树 容易发现,如果将输入的N(N-1)个距离看做N(N-1)条无向边的话,那么如果数据合法, ...
随机推荐
- 解决IIS程序池回收webapi定时程序造成的影响
问题描述: webapi中有一个定时器线程,在iis程序池在1740分钟回收后,定时器中止 问题解决步骤: 1.设置程序池定期回收,设置每天定时回收 2.在windows自带的任务计划中,添加一条任务 ...
- JavaScript-装饰器模式
装饰器模式 为对象添加新功能 不改变其原有的结构和功能 传统 UML 类图 javascript 中的装饰器 装饰类 @testDec clss Demo { } function testDec(t ...
- [PHP] 使用PHP在mongodb中进行嵌套查询
作为文档数据库,数据库中存储的数据是类似json的结构,比如{“modelInfo”:{"status":1,audited:"1"}},想要查询status是 ...
- 极具性价比优势的工业控制以及物联网解决方案-米尔MYD-C8MMX开发板测评
今天要进行测评的板子是来自米尔电子的MYD-C8MMX开发板.MYD-C8MMX开发板是米尔电子基于恩智浦,i.MX 8M Mini系列嵌入式应用处理器设计的开发套件,具有超强性能.工业级应用.10年 ...
- 获取Windows平台下 安装office 版本位数信息
最近在处理客户端安装程序过程,有一个需求:需要检测Windows平台下安装office 版本信息以及获取使用的office是32 位还是64 位: 当检测出office 位数为64位时,提示当前off ...
- day 8 函数编程_byets
定义 bytes类型是指一堆字节的集合,在python中以b开头的字符串都是bytes类型 b'\xe5\xb0\x8f\xe7\x8c\xbf\xe5\x9c\x88' #b开头的都代表是bytes ...
- opencv —— erode、dilate 腐蚀与膨胀
腐蚀与膨胀是形态学滤波.其中,腐蚀是最小值滤波,膨胀是最大值滤波,即分别选取内核中的最小值与最大值赋值给锚点.若内核为 N×1 或 1×N 形状,可用于横纵方向直线检测. 膨胀:dilate 函数 v ...
- UVA-1588
只用C来写 题目:https://vjudge.net/problem/UVA-1588 #include<stdio.h> #include<string.h> #defin ...
- D. Domino for Young
基本思想是利用涂色的方法,用黑白两种颜色把方格全部涂色,相邻方格不同色. 方法1:基于二分图匹配的思想 一开始也想过二分图匹配,但数据量太大,就放弃了这种想法.其实根据增广路的定义.如果白色的方格的数 ...
- PP: Time series anomaly detection with variational autoencoders
Problem: unsupervised anomaly detection Model: VAE-reEncoder VAE with two encoders and one decoder. ...