树包含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. RG100A-AA 中大校园网上网及远程配置

    由于无线网卡用得不爽,wifi经常断,所以想整个路由器,造福群众.在朋友介绍下购得一台已经刷好 Openwrt 的上海贝尔RG100A-AA路由器,根据下面的简单步骤,就能连接上校园网. 一.准备工作 ...

  2. 提示gtk错误,无法打开便器器(sudo gedit filename失败)

    解决方法:安装gtksource,命令 sudo apt-get install gir1.2-gtksource-3.0

  3. form表单验证

    <script> $(document).ready(function(){ $('.pinglunform').submit(function(){ var issubmit = 0; ...

  4. 编码规范(一)之Code Templates的设置(转)

    编码规范(一)之Code Templates的设置 基于公司的主流开发工具为eclipse,但每个人都有自己的编码习惯,为了统一格式,这里通过三个方面:设置Code Templates.Checkst ...

  5. meta name="viewport" 属性详解

    随着高端手机(Andriod,Iphone,Ipod,WinPhone等)的盛行,移动互联应用开发也越来越受到人们的重视,用html5开发移动应用是最好的选择.然而,每一款手机有不同的分辨率,不同屏幕 ...

  6. C++编程开发学习的50条建议(转)

    每个从事C++开发的朋友相信都能给后来者一些建议,但是真正为此进行大致总结的很少.本文就给出了网上流传的对C++编程开发学习的50条建议,总结的还是相当不错的,编程学习者(不仅限于C++学习者)如果真 ...

  7. 【转】 iOS 开发之静态库.a和动态库详解 -- 不错

    原文网址:http://blog.csdn.net/lxl_815520/article/details/52154331 一, 简单介绍 1.什么是库 库是程序代码的集合,是共享程序代码的一种方式 ...

  8. stl迭代器原理

    具体实现肯定不如书上讲的清楚了,这里只是根据侯捷书上的讲解,自己建立一条思路以及形成一些相关的概念 迭代器也可被称作智能指针,用于遍历容器内的元素,stl每个容器都实现了自己的iterator,ite ...

  9. php(验证网址是否存在)错误

      $ra=get_headers('http://hi.baidu.com'); if($ra[0]==='HTTP/1.1 200 OK'){ echo 'ok'; } 这是错误的,因为有时会返回 ...

  10. QQ登入(4)QQ分享-内容转载

    ///////////////////QQ分享///////////// public void myclick3(View v){ //shareType : SHARE_TO_QQ_TYPE_IM ...