Description

给出一棵n个节点的树,你需要删去并加入一条边,使得原图仍然是一棵树,并且有完美匹配。
求方案数。
n<=5*1e5

Solution

考虑枚举删去一条边,我们只需要统计某个子树内和外有多少个点可以成为匹配点。
可以设Dp,四种状态,根节点是否被匹配,除根外是否有节点未被匹配。
这样子可以O(n)统计出子树内的答案,但是子树外的答案似乎没有那么好求。
观察我们的转移,是从儿子向父亲合并的,这也限制了我们在换根的时候不能用前缀和来优化。
真的是这样吗?
Orz wxh
我们可以考虑把转移写成一种类似矩阵乘法(当然并不是),使得这个转移满足交换律,并且和谁是父亲无关,只需要把不是父亲的点的trans状态都加起来就是答案。
这个加法是重定义之后的,这样子就可以用前缀和优化换根到O(n)解决问题。
/注释部分是原来的转移/

Code

#include <cstdio>
#include <cstring>
#include <algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
#define rep(i,a) for(int i=lst[a];i;i=nxt[i])
using namespace std;typedef long long ll;int read() {char ch;for(ch=getchar();ch<'0'||ch>'9';ch=getchar());int x=ch-'0';for(ch=getchar();ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';return x;
}const int N=1e6+5;int t[N<<1],nxt[N<<1],lst[N],l;
void add(int x,int y) {t[++l]=y;nxt[l]=lst[x];lst[x]=l;
}int n,x,y,size[N],a[N],L[N],R[N],tot;struct Dp{int a[2][2];Dp trans() {Dp x;x.a[0][0]=a[1][0];x.a[0][1]=a[0][0]+a[1][1];x.a[1][0]=a[0][0];x.a[1][1]=a[0][1];return x;}friend Dp operator + (Dp x, Dp y) {Dp z;memset(z.a,0,sizeof(z.a));fo(i,0,1)fo(j,0,1)fo(k,0,1-i)fo(l,0,1-j)z.a[i+k][j+l]+=x.a[i][j]*y.a[k][l];/*z.a[0][0]=x.a[0][0]*y.a[1][0];z.a[0][1]=x.a[0][0]*(y.a[0][0]+y.a[1][1]);z.a[0][1]+=x.a[0][1]*y.a[1][0];z.a[1][0]=x.a[0][0]*y.a[0][0];z.a[1][0]+=x.a[1][0]*y.a[1][0];z.a[1][1]=x.a[0][0]*y.a[0][1];z.a[1][1]+=x.a[0][1]*y.a[0][0];z.a[1][1]+=x.a[1][0]*(y.a[0][0]+y.a[1][1]);z.a[1][1]+=x.a[1][1]*y.a[1][0];*/return z;}
}f[N],g[N],pre[N],Null;void dfs(int x,int y) {rep(i,x) if (t[i]!=y) dfs(t[i],x);f[x]=Null;size[x]=1;rep(i,x)if (t[i]!=y) {size[x]+=size[t[i]];f[x]=f[x]+f[t[i]].trans();}
}void dp(int x,int y) {L[x]=++tot;rep(i,x) if (t[i]!=y) a[++tot]=t[i];R[x]=tot;    pre[L[x]]=y?g[x].trans():Null;fo(i,L[x]+1,R[x]) pre[i]=pre[i-1]+f[a[i]].trans();Dp now=Null;fd(i,R[x],L[x]+1) {g[a[i]]=pre[i-1]+now;now=now+f[a[i]].trans();}fo(i,L[x]+1,R[x]) dp(a[i],x);
}int main() {n=read();fo(i,1,n-1) {x=read();y=read();add(x,y);add(y,x);}Null.a[0][0]=1;dfs(1,0);dp(1,0);ll ans=0;fo(i,2,n)if (f[i].a[1][0]==1&&g[i].a[1][0]==1) ans+=(ll)size[i]*(n-size[i]);else ans+=(ll)(f[i].a[0][0]+f[i].a[1][1])*(g[i].a[0][0]+g[i].a[1][1]);printf("%lld\n",ans);return 0;
}

[CF891D]Sloth相关推荐

  1. sloth——算法工程师标注数据的福音

    一般算法工程师做标注,都要先开发个标注工具,无非下面几个选项: 1.mfc,C#,优点是交互界面友好,开发难度适中,缺点是没法跨平台 2.matlab,优点是可以跨平台,开发难度非常低,缺点是速度慢. ...

  2. 资源 | 深度学习图像标注工具汇总

    作者 | chaibubble 来源 | CSDN 网站 对于监督学习算法而言,数据决定了任务的上限,而算法只是在不断逼近这个上限.世界上最遥远的距离就是我们用同一个模型,但是却有不同的任务.但是数据 ...

  3. 深度学习经典数据集汇总

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 很多朋友在学习了神经网络和深度学习之后,早已迫不及待要开始动手实战 ...

  4. 关于数据中台的深度思考与总结(超级干货)

    本文将总结下数据中台的相关理论知识.Flink平台化需要改进的点等等,参考<数据中台>. 原文地址:https://miaowenting.site/2020/03/24/%E5%85%B ...

  5. 网易实时数仓实践与展望

    分享嘉宾:马进 网易杭研 技术专家 编辑整理:张满意 出品平台:DataFunTalk 导读:随着大数据技术的进步,各种计算框架的涌现,数据仓库相关技术难题已经从离线数仓逐渐过渡到实时数仓,越来越多的 ...

  6. 超级干货:关于数据中台的深度思考与总结

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | http://dwz.date/aHTb 本文 ...

  7. 一些今天看到的好句子

    1. 记住该记住的,忘记该忘记的.改变能改变的,接受不能改变的 Remember what should be remembered, and forget what should be forgot ...

  8. 大数据方面核心技术有哪些?新人必读

    大数据技术的体系庞大且复杂,基础的技术包含数据的采集.数据预处理.分布式存储.NoSQL数据库.数据仓库.机器学习.并行计算.可视化等各种技术范畴和不同的技术层面.首先给出一个通用化的大数据处理框架, ...

  9. 深度学习核心技术精讲100篇(三十二)-网易实时数仓实战应用

    前言 随着大数据技术的进步,各种计算框架的涌现,数据仓库相关技术难题已经从离线数仓逐渐过渡到实时数仓,越来越多的企业对数据的实时性提出了严格的要求,如何满足企业的低延时的数据需求,如何看待批量处理和实 ...

  10. 如何自动搞定全站图片的alt属性?

    Web开发人员和内容编辑人员经常会忘记或忽略了img标签的alt属性,这是一个可以提升网站可访问性和SEO性能的重要部分,这个属性通常用来描述图片: ​​​\u0026lt;img src=\u002 ...

最新文章

  1. Linux下查找文件方法
  2. matlab 实验数据 传递函数,《传递函数MATLAB实验》.ppt
  3. 训练自己的数据_PyTorch版CenterNet训练自己的数据集
  4. C语言中的类模拟(C++编程思想)
  5. 值类型和引用类型小解
  6. 计算机网络传输速率单位MB,计算机网络中,传输速率MB/s和Gb/s如何换算?
  7. B站压片 码率标准 和 码率变化 记录
  8. Arturia Buchla Easel V for Mac - Buchla音乐画架插件
  9. HashMap遍历方法和实现原理分析
  10. Python:条件判断和逻辑表达式
  11. 我奋斗18年,和你或者咖啡没有任何关系
  12. UVA 11178-Morley's Theorem(计算几何_莫雷定理)
  13. 开源物联网平台推荐介绍
  14. 安装vue-cli遇到npm ERR! code ECONNREFUSED问题
  15. linux python pexpect,Linux pexpect非root用户安装
  16. 揭秘!一篇文章为你全盘剖析健身房管理软件的那些事
  17. 极域脱控破解分析+代码实现(杀死和重启,挂起和恢复,解除全屏按钮限制,获取极域安装路径,极域密码破解)
  18. 八位可控加法器logisim_八位二进制加法器
  19. 通信相关中英对照术语
  20. 手机下载APK文件后缀名变成txt

热门文章

  1. 微信发朋友圈功能测试点小结
  2. 换硬币-零钱换成5分、2分和1分的硬币
  3. 修改oracle用户资源限制,oracle用户登陆失败次数限制修改
  4. H5清理微信缓存的方案
  5. 什么情况下用weblogic而不用Tomcat
  6. RuntimeError:The size of tensor a (100) must match the size of tensor b (12800) at non-singleton di
  7. Keras——imdb电影评论分类
  8. mvc:annotation-driven
  9. python编程基础-类的使用
  10. 【mmdetection3d】——3D 目标检测 KITTI 数据集