51nod1253 Kundu and Tree

第1行:1个数N(1 <= N <= 50000)
第2 - N行:每行2个数加一个颜色,表示边的起始点和结束的以及颜色。
输出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的更多相关文章
- 51Nod1253 Kundu and Tree 容斥原理
原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1253.html 题目传送门 - 51Nod1253 题意 树包含 N 个点和 N-1 条边.树的边有 ...
- 51nod-1253: Kundu and Tree
[传送门:51nod-1253] 简要题意: 给出一棵n个点的树,树上的边要么为黑,要么为红 求出所有的三元组(a,b,c)的数量,满足a到b,b到c,c到a三条路径上分别有至少一条红边 题解: 显然 ...
- 【51nod1253】Kundu and Tree(容斥+并查集)
点此看题面 大致题意: 给你一棵树,每条边为黑色或红色, 求有多少个三元组\((x,y,z)\),使得路径\((x,y),(x,z),(y,z)\)上都存在至少一条红色边. 容斥 我们可以借助容斥思想 ...
- HackerRank "Kundu and Tree" !!
Learnt from here: http://www.cnblogs.com/lautsie/p/3798165.html Idea is: we union all pure black edg ...
- 51nod_1253:Kundu and Tree(组合数学)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1253 全为红边的情况下,ans=C(n,3).假设被黑边相连 ...
- 51nod 1253:Kundu and Tree(组合数学)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1253 所有的三元组的可能情况数有ans0=C(n,3).然后 ...
- [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法
二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...
- SAP CRM 树视图(TREE VIEW)
树视图可以用于表示数据的层次. 例如:SAP CRM中的组织结构数据可以表示为树视图. 在SAP CRM Web UI的术语当中,没有像表视图(table view)或者表单视图(form view) ...
- 无限分级和tree结构数据增删改【提供Demo下载】
无限分级 很多时候我们不确定等级关系的层级,这个时候就需要用到无限分级了. 说到无限分级,又要扯到递归调用了.(据说频繁递归是很耗性能的),在此我们需要先设计好表机构,用来存储无限分级的数据.当然,以 ...
随机推荐
- (理论篇)53个要点提高PHP编程效率
用单引号代替双引号来包含字符串,这样做会更快一些.因为php会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的"函数"( ...
- How to adjust OOM score for a process?
转载自http://www.dbasquare.com/kb/how-to-adjust-oom-score-for-a-process/ How to adjust OOM score for a ...
- 解决Eclipse Pydev中import时报错:Unresolved import
在安装 图像处理工具包 mahotas 后,在eclipse中尝试import mahotas时,出现Unresolved import错误,按快捷无法自动生成代码提示 但是,程序运行时可以通过,在命 ...
- ZMMR106-批量更新PO交货日期
************************************************************************ Title : ZMMR106 ** Applicat ...
- numpy之sum
Definition : sum(a, axis=None, dtype=None, out=None, keepdims=False) axis: None or int or tuple of i ...
- 16年大连网络赛 1006 Football Games
题目链接:http://acm.hdu.edu.cn/contests/contest_showproblem.php?cid=725&pid=1006 Football Games Time ...
- Java 前端加密传输后端解密以及验证码功能
目录(?)[-] 加密解密 1 前端js加密概述 2 前后端加密解密 21 引用的js加密库 22 js加密解密 23 Java端加密解密PKCS5Padding与js的Pkcs7一致 验证码 1 概 ...
- JavaScript学习记录总结(五)——servlet将json数据写出去
定义teacher和student实体 json.do List<Student> stus=new ArrayList<Student>(); stus.a ...
- php MySQL数据库操作类源代码
php MySQL数据库操作类源代码: <?php class MySQL{ private $host; //服务器地址 private $name; //登录账号 private $pwd; ...
- 在js自定义函数中使用$(event.target)代替$(this)
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...