Codechef:Path Triples On Tree
Path Triples On Tree
题意是求树上都不相交或者都相交的路径三元组数量。
发现blog里没什么树形dp题,也没有cc题,所以来丢一道cc上的树形dp题。
比较暴力,比较恶心
#include<cstdio> #include<algorithm> #define MN 300001 #define ui long long using namespace std;ui read_p,read_ca; inline ui read(){read_p=0;read_ca=getchar();while(read_ca<'0'||read_ca>'9') read_ca=getchar();while(read_ca>='0'&&read_ca<='9') read_p=read_p*10+read_ca-48,read_ca=getchar();return read_p; } ui n,N,m,l[MN],num=0,fa[MN],s[MN],d[MN],_s[MN],S[MN],GS[MN],_S[MN],si[MN],MMH=0,_MMH=0,x,y; struct na{ui y,ne;}b[MN<<1]; inline void in(ui x,ui y){b[++num].y=y;b[num].ne=l[x];l[x]=num;} const ui MOD=1e9+7; inline ui _M(ui x){while(x>=MOD)x-=MOD;while(x<0)x+=MOD;return x;} inline void M(ui &x){while(x>=MOD)x-=MOD;while(x<0)x+=MOD;} void dfs(ui x){si[x]=1;ui i,k=0,al=0;for (i=l[x];i;i=b[i].ne) if (!si[b[i].y]) fa[b[i].y]=x,dfs(b[i].y),al=(1LL*si[x]*si[b[i].y]+al)%MOD,si[x]+=si[b[i].y],M(s[x]+=s[b[i].y]),M(k+=d[b[i].y]);for (i=l[x];i;i=b[i].ne) if (b[i].y!=fa[x])M(MMH+=1LL*d[b[i].y]*(al-1LL*si[b[i].y]*(si[x]-si[b[i].y])%MOD)%MOD+1LL*_s[b[i].y]*(si[x]-si[b[i].y])%MOD-MOD),M(GS[x]+=1LL*s[b[i].y]*(si[x]-si[b[i].y])%MOD+GS[b[i].y]-MOD);s[x]=(1LL*al*si[x]+s[x])%MOD;M(S[x]=(1LL*(si[x]-1)*si[x]>>1)%MOD*si[x]%MOD-s[x]);d[x]=(1LL*al*(al-1)>>1)%MOD;_s[x]=k;for (i=l[x];i;i=b[i].ne) if (b[i].y!=fa[x])d[x]=(1LL*(si[x]-si[b[i].y])*s[b[i].y]+d[b[i].y]+d[x])%MOD,_s[x]=(1LL*(k-d[b[i].y])*si[b[i].y]+_s[x]+_s[b[i].y])%MOD,M(_S[x]+=(1LL*GS[b[i].y]*(si[x]-si[b[i].y])+(-1LL*si[b[i].y]*(si[x]-si[b[i].y])%MOD+al)*s[b[i].y]+_S[b[i].y])%MOD);} void DFS(ui x,ui v,ui _v){ui i,S=0,AL=0,k=0,_k=0,P=0,al=0,o;for (i=l[x];i;i=b[i].ne) if (b[i].y!=fa[x])M(al+=1LL*(si[x]-si[b[i].y])*si[b[i].y]%MOD),M(k+=s[b[i].y]),M(_k+=1LL*s[b[i].y]*(n-si[b[i].y])%MOD),M(P+=d[b[i].y]),M(AL+=(1LL*(si[b[i].y]+1)*(n-si[b[i].y])-1)%MOD*si[b[i].y]%MOD);al=1LL*(al+si[x]-1)*((MOD+1)/2)%MOD;M(MMH+=1LL*v*al%MOD);for (i=l[x];i;i=b[i].ne) if (b[i].y!=fa[x]) o=S=_M((1LL*(si[x]-si[b[i].y])*(n-si[x])-1LL*(si[x]-si[b[i].y])*si[b[i].y]+al)%MOD),o=1LL*o*(n-si[b[i].y])%MOD,S=(1LL*S*(S-1)>>1)%MOD,M(S+=P-d[b[i].y]),DFS(b[i].y,_M(_M(v+_k-1LL*s[b[i].y]*(n-si[b[i].y])%MOD-1LL*(k-s[b[i].y])*si[b[i].y]%MOD)+1LL*(si[x]-si[b[i].y])*_v%MOD-MOD+S),_M(_v+k-MOD-s[b[i].y]+o)); } void _DFS(ui x){ui i,k=0,al=0;for (i=l[x];i;i=b[i].ne) if (b[i].y!=fa[x]) _DFS(b[i].y),M(al+=1LL*(si[x]-si[b[i].y])*si[b[i].y]%MOD);al=1LL*(al+si[x]-1)*((MOD+1)/2)%MOD;for (i=l[x];i;i=b[i].ne) if (b[i].y!=fa[x]) M(_MMH+=((1LL*(si[x]-si[b[i].y])*(n-si[x])-1LL*(si[x]-si[b[i].y])*si[b[i].y]+al)%MOD*(si[x]-si[b[i].y])%MOD+k)*s[b[i].y]%MOD),M(k+=s[b[i].y]);for (i=l[x];i;i=b[i].ne) if (b[i].y!=fa[x]) M(_MMH+=1LL*GS[b[i].y]*(n-si[b[i].y])%MOD*(si[x]-si[b[i].y])%MOD),M(_MMH+=1LL*_S[b[i].y]*(si[x]-si[b[i].y])%MOD); } int main(){register ui i;n=read();for (i=1;i<n;i++) x=read(),y=read(),in(x,y),in(y,x);N=(1LL*n*(n-1)>>1)%MOD;m=1LL*N*(N-1)%MOD*(N-2)%MOD*((MOD+1)/6)%MOD;dfs(1);DFS(1,0,0);_DFS(1);M(m-=MMH+_MMH);printf("%lld\n",m); }
View Code
转载于:https://www.cnblogs.com/Enceladus/p/6764938.html
Codechef:Path Triples On Tree相关推荐
- BZOJ 3221: [Codechef FEB13] Obserbing the tree树上询问( 可持久化线段树 + 树链剖分 )
树链剖分+可持久化线段树....这个一眼可以看出来, 因为可持久化所以写了标记永久化(否则就是区间修改的线段树的持久化..不会), 结果就写挂了, T得飞起...和管理员拿数据调后才发现= = 做法: ...
- shell命令tree
在Windwows下很喜欢tree命令,在CenntOS下也有这条命令,在网上找到了源代码和一段简单的脚本, 完整的tree源代码可以在这里下载: ftp://mama.indstate.edu/li ...
- 安利一款Python开发的仿Linux树形显示目录tree命令
大家好,我是小小明,今天我要给大家分享一个用python实现的仿Linux的tree命令. 详见:https://pypi.org/project/filestools/ 通过以下命令安装即可直接使用 ...
- LeetCode 1245 Tree Diameter
Given an undirected tree, return it's diameter, which is the number of edges in a longest path in th ...
- [小清新] 一段 node 脚本生成风格优雅的 Directory Tree
一些烦恼 如果你常常在博客中插入一些文件目录结构,不免会有碰到诸如此类的问题: 使用图片输出的话,感官上不够和谐,尤其在移动端环境下,图片内容可能会被多次转码.缩放以至于影响阅读体验. 使用文本输出的 ...
- CPU0 处理器的架构及应用
CPU0 处理器的架构及应用 简介 CPU0 是一个 32 位的处理器,包含 R0-R15, IR, MAR, MDR 等缓存器,结构如下图所示. 图 1 :CPU0 处理器的结构 其中各个缓存器的用 ...
- 启动targetcli时遭遇ImportError: cannot import name ALUATargetPortGroup故障
targetcli是一个iSCSI配置管理工具,该工具简单易用,可以直接替换scsi-target-utils.满心欢喜的装上它,正准备一睹为快,就杯具了.报错ImportError: cannot ...
- linux c 内存泄漏调试工具 《valgrind用户手册》 2. 使用和理解Valgrind核心
valgrind 用户手册原版地址:https://valgrind.org/docs/manual/manual.html 此原文地址:https://valgrind.org/docs/manua ...
- voc生成xml 代码
目录 lxml windows安装 读取示例 可视化 生成示例 上面是代码,下面有调用示例 api调用代码,其实只有几行: 这个生成代码也很简洁: python生成voc xml文件_jacke121 ...
最新文章
- 029 浏览器不能访问虚拟机的问题解决
- 不在pytorch中的损失的函数
- 使用javabean类用户注册
- mysql服务器的HA集群之corosync+drbd+pacemaker实现 上
- 2.scala控制结构、函数、异常处理
- js/jquery遇到的坑总结
- 使用Recast.AI创建具有人工智能的聊天机器人
- 知乎大神深入解析:单片机晶振脚原理是什么?
- k8s - 如何变更CNI网络插件IP池?
- 关于application title一直是untitled的问题
- Berenson机器人艺术鉴赏家亮相切尔西画廊
- Servlet中参数获取方法
- MATLAB_平面几何_判断两平面矩形是否干涉
- floatmap 二维数组_第 2 章 数组
- 基于android的电子词典设计_基于安卓Android电子词典移动客户端APP设计(AndroidStudio,SQLit...
- 不同浏览器的url长度限制
- 手机点餐系统概述_廖师兄 微信点餐系统 springcloud学习笔记
- 【转】常用的shell脚本
- 图形界面介绍Create Placement Blockage
- 【idea】如何设置默认的JDK
热门文章
- SpringDataJpa框架单元测试实现增删改查
- java单链表例子_写一个java链表的例子?随便举例说一下。
- 师范类专业可以不考计算机二级吗,2021师范专业要考教师资格证吗?师范生需要考的证有哪些?...
- 第三阶段:2.产品运营:4.活动运营
- BZOJ2821: 作诗(Poetize)
- java.util.Properties类,保存时保留注释及格式不变
- 半斤八两中级破解 (四) TCP_UDP协议转向本地验证
- 依赖注入之Autofac使用总结
- J2EE项目工具集(转)
- 使用自己的按钮关闭或刷新RadWindow