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下载】
无限分级 很多时候我们不确定等级关系的层级,这个时候就需要用到无限分级了. 说到无限分级,又要扯到递归调用了.(据说频繁递归是很耗性能的),在此我们需要先设计好表机构,用来存储无限分级的数据.当然,以 ...
随机推荐
- Bean实例化(Spring源码阅读)-我们到底能走多远系列(33)
我们到底能走多远系列(33) 扯淡: 各位: 命运就算颠沛流离 命运就算曲折离奇 命运就算恐吓着你做人没趣味 别流泪 心酸 更不应舍弃 ... 主题: Spring源码阅读还在继 ...
- python学习笔记 - assert用法
[转自]http://blog.sina.com.cn/s/blog_76e94d210100vz37.html 1.assert语句用来声明某个条件是真的. 2.如果你非常确信某个你使用的列表中 ...
- Sql优化(一) Merge Join vs. Hash Join vs. Nested Loop
原创文章,首发自本人个人博客站点,转载请务必注明出自http://www.jasongj.com Nested Loop,Hash Join,Merge Join介绍 Nested Loop: 对于被 ...
- Awesome Reinforcement Learning
Awesome Reinforcement Learning A curated list of resources dedicated to reinforcement learning. We h ...
- matlab 工具之各种降维方法工具包,下载及使用教程,有PCA, LDA, 等等。。。
最近跑深度学习,提出的feature是4096维的,放到我们的程序里,跑得很慢,很慢.... 于是,一怒之下,就给他降维处理了,但是matlab 自带的什么pca( ), princomp( )函数, ...
- centos6.4 网络适配器设置仅主机模式
网络适配器设置仅主机模式时: 1.vmnet1网卡必须开启
- 谓词的使用 -ios
#import <Foundation/Foundation.h> @interface Person : NSObject<NSCopying> @property(nona ...
- 利用zip(或者phar)协议进行本地文件包含
$include_file=$_GET[include_file];if ( isset( $include_file ) && strtolower( substr( $includ ...
- 如何用ABBYY把PDF如何转换成HTML
将PDF转换成HTML网页格式,是快速打造专业级网站的方法之一.当用户找到了非常详实的PDF资料,打算将之制作成为网页格式时,如果重新开发往往需要耗费大量的时间,可是又不知道怎么样才可以将PDF文件转 ...
- SET ROWCOUNT,SET NOCOUNT
SET ROWCOUNT (Transact-SQL) 在停止特定查询之前要处理的行数(整数). 重要提示 在 SQL Server 的将来版本中,使用 SET ROWCOUNT 将不会影响 DELE ...