树包含N个点和N-1条边。树的边有2中颜色红色('r')和黑色('b')。给出这N-1条边的颜色,求有多少节点的三元组(a,b,c)满足:节点a到节点b、节点b到节点c、节点c到节点a的路径上,每条路径都至少有一条边是红色的。
注意(a,b,c), (b,a,c)以及所有其他排列被认为是相同的三元组。输出结果对1000000007取余的结果。

 
 
Input
第1行:1个数N(1 <= N <= 50000)
第2 - N行:每行2个数加一个颜色,表示边的起始点和结束的以及颜色。
Output
输出1个数,对应符合条件的3元组的数量。

预处理对每条边(a,b),从a出发经过b的路径有多少条是经过/不经过红边的

存在两种情况:

1.a,b,c两两间路径不经过第三点,这时三条路径有唯一公共点,公共点到a,b,c的路径至少有两条有红边,由此可以统计

2.a,b,c中有两点的路径经过第三点,这时枚举被经过的点进行统计

#include<cstdio>
typedef long long i64;
const int N=,R=N*;
char buf[R+],*ptr=buf-;
int _(){
int x=,c=*++ptr;
while(c<)c=*++ptr;
while(c>)x=x*+c-,c=*++ptr;
return x;
}
int _c(){
int c=*++ptr;
while(c<'a')c=*++ptr;
return c=='r';
}
int n;
int es[N*],enx[N*],e0[N],ev[N*],ep=;
int f1[N],f2[N],f3[N],sz[N];
i64 ans=;
void dfs1(int w,int pa){
sz[w]=;
for(int i=e0[w];i;i=enx[i]){
int u=es[i];
if(u!=pa){
dfs1(u,w);
sz[w]+=sz[u];
if(ev[i])f1[w]+=f3[u]=sz[u];
else f1[w]+=f3[u]=f1[u];
}
}
}
void dfs2(int w,int pa){
for(int i=e0[w];i;i=enx[i]){
int u=es[i];
if(u!=pa){
if(ev[i])f2[u]=n-sz[u];
else f2[u]=f2[w]+f1[w]-f1[u];
dfs2(u,w);
}
}
}
void dfs3(int w,int pa){
static i64 fs[N],fl[N],fr[N],ss[N],sl[N],sr[N];
static int p;
for(int i=e0[w];i;i=enx[i]){
int u=es[i];
if(u!=pa)dfs3(u,w);
}
p=;
for(int i=e0[w];i;i=enx[i]){
int u=es[i];
++p;
if(u!=pa){
fs[p]=fl[p]=fr[p]=f3[u];
ss[p]=sl[p]=sr[p]=sz[u]-fs[p];
}else{
fs[p]=fl[p]=fr[p]=f2[w];
ss[p]=sl[p]=sr[p]=n-sz[w]-fs[p];
}
}
i64 a0=ans;
for(int i=;i<=p;++i)fl[i]+=fl[i-],sl[i]+=sl[i-];
for(int i=p-;i;--i)fr[i]+=fr[i+],sr[i]+=sr[i+];
for(int i=;i<p;++i){
ans+=fl[i-]*(fs[i]*sr[i+]+ss[i]*fr[i+]);
ans+=(sl[i-]+fl[i-])*fs[i]*fr[i+];
}
for(int i=;i<p;++i)ans+=fl[i]*fs[i+];
}
int main(){
fread(buf,,R,stdin);
n=_();
for(int i=;i<n;++i){
int a=_(),b=_(),c=_c();
es[ep]=b;enx[ep]=e0[a];ev[ep]=c;e0[a]=ep++;
es[ep]=a;enx[ep]=e0[b];ev[ep]=c;e0[b]=ep++;
}
dfs1(,);
dfs2(,);
dfs3(,);
printf("%lld",ans%);
return ;
}

51nod1253 Kundu and Tree的更多相关文章

  1. 51Nod1253 Kundu and Tree 容斥原理

    原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1253.html 题目传送门 - 51Nod1253 题意 树包含 N 个点和 N-1 条边.树的边有 ...

  2. 51nod-1253: Kundu and Tree

    [传送门:51nod-1253] 简要题意: 给出一棵n个点的树,树上的边要么为黑,要么为红 求出所有的三元组(a,b,c)的数量,满足a到b,b到c,c到a三条路径上分别有至少一条红边 题解: 显然 ...

  3. 【51nod1253】Kundu and Tree(容斥+并查集)

    点此看题面 大致题意: 给你一棵树,每条边为黑色或红色, 求有多少个三元组\((x,y,z)\),使得路径\((x,y),(x,z),(y,z)\)上都存在至少一条红色边. 容斥 我们可以借助容斥思想 ...

  4. HackerRank "Kundu and Tree" !!

    Learnt from here: http://www.cnblogs.com/lautsie/p/3798165.html Idea is: we union all pure black edg ...

  5. 51nod_1253:Kundu and Tree(组合数学)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1253 全为红边的情况下,ans=C(n,3).假设被黑边相连 ...

  6. 51nod 1253:Kundu and Tree(组合数学)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1253 所有的三元组的可能情况数有ans0=C(n,3).然后 ...

  7. [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法

    二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...

  8. SAP CRM 树视图(TREE VIEW)

    树视图可以用于表示数据的层次. 例如:SAP CRM中的组织结构数据可以表示为树视图. 在SAP CRM Web UI的术语当中,没有像表视图(table view)或者表单视图(form view) ...

  9. 无限分级和tree结构数据增删改【提供Demo下载】

    无限分级 很多时候我们不确定等级关系的层级,这个时候就需要用到无限分级了. 说到无限分级,又要扯到递归调用了.(据说频繁递归是很耗性能的),在此我们需要先设计好表机构,用来存储无限分级的数据.当然,以 ...

随机推荐

  1. Linux发展史

    简述 Linux是一套自由加开放源代码的类Unix操作系统,诞生于1991年10月5日(第一次正式向外公布),由芬兰学生Linus Torvalds和后来陆续加入的众多爱好者共同开发完成. Linux ...

  2. archlinux设置无线网络连接

    Check the driver $ lspci -k Open the network card $ ip link set <设备名> up Check device status $ ...

  3. CentOS下解决”用户账户is not in the sudoers file“问题

    如上图,在当前用户cent(我的用户名)下使用sudo命令时,提示"cent is not in the sudoers file. This incident will be report ...

  4. jquery节点操作

    很久没有jquery写东西了,最近使用jquery的时候发现很多节点的操作都不太熟悉了,于是就进行了一个小小的总结. 创建节点:var dom=$('<div></div>') ...

  5. hdu 2795 线段树(二维问题一维化)

    Billboard Time Limit: 20000/8000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  6. 【转】Entity Framework技术导游系列开篇与热身

    转自:http://blog.csdn.net/bitfan/article/details/12779517 Entity Framework走马观花 之 把握全局 ================ ...

  7. HTML DOM部分---做竖向横向的下拉导航 下拉菜单 图片轮播(圆点、箭头) 选项卡 进度条;

    1,竖向下拉导航 鼠标单击打开 再打击关闭 <style> *{ margin:0px auto; padding:0px;} div{ width:100px; height:50px; ...

  8. AttributeError: 'NoneType' object has no attribute 'bytes' python3.4 win64

    解决方法: easy_install -U pip 详见: https://github.com/pypa/pip/issues/2669

  9. leetcode 145. Binary Tree Postorder Traversal ----- java

    Given a binary tree, return the postorder traversal of its nodes' values. For example:Given binary t ...

  10. 放课后的约定 by:S_H_Y

    题目背景 十年.十年前.天空的蔚蓝,云彩的舒软.我,怎么会认识你.洁白的,洁白的,十年前.我无法忘却.终究是小时候的约定.记忆被困在冻土里,有时我不认识那天的我.难道一切,都锁在心里面了吗? 题目描述 ...