CF891D Sloth
题意:给你一棵树,你选择删掉一条边,再加上一条边(也要保证为树),问最后树上的节点能够两两完美匹配的加删边方案数?
n<=5e5.
标程:
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
int read()
{
int x=;char ch=getchar();
while (ch<''||ch>'') ch=getchar();
while (''<=ch&&ch<='') x=(x<<)+(x<<)+ch-'',ch=getchar();
return x;
}
const int N=;
typedef long long ll;
int size[N],n,u,v;
ll ans;
vector<int> vec[N];
struct node{int a[][];}f[N],g[N];
vector<node> pre[N];
void init(node &x){x.a[][]=;x.a[][]=x.a[][]=x.a[][]=;}
node modi(node x,node y)
{
node c;
c.a[][]=x.a[][]*y.a[][];
c.a[][]=x.a[][]*y.a[][]+x.a[][]*y.a[][];
c.a[][]=x.a[][]*y.a[][]+x.a[][]*(y.a[][]+y.a[][]);
c.a[][]=x.a[][]*y.a[][]+x.a[][]*(y.a[][]+y.a[][])+x.a[][]*y.a[][]+x.a[][]*y.a[][];
return c;
}
node merge(node x,node y)
{
node c;
c.a[][]=x.a[][]*y.a[][];
c.a[][]=x.a[][]*y.a[][]+x.a[][]*y.a[][];
c.a[][]=x.a[][]*y.a[][]+x.a[][]*y.a[][];
c.a[][]=x.a[][]*y.a[][]+x.a[][]*y.a[][]+x.a[][]*y.a[][]+x.a[][]*y.a[][];
return c;
}
void dp1(int x,int fa)
{
size[x]=;init(f[x]);
if (fa!=-) vec[x].erase(find(vec[x].begin(),vec[x].end(),fa));//将fa删去,方便前后缀的处理
for (int i=;i<vec[x].size();i++)
{
int v=vec[x][i]; //注意内部定义
dp1(v,x);size[x]+=size[v];
f[x]=modi(f[x],f[v]);
}
}
void dp2(int x,int fa)
{
node cur;init(cur);
if (fa>) pre[x].push_back(modi(cur,g[x]));else pre[x].push_back(cur);
for (int i=;i<vec[x].size();i++)
pre[x].push_back(modi(pre[x].back(),f[vec[x][i]]));
for (int i=vec[x].size()-;i>=;i--)
{
int v=vec[x][i];
g[v]=merge(pre[x][i],cur);cur=modi(cur,f[v]);
dp2(v,x);
}
}
int main()
{
n=read();if (n&) return puts(""),;
for (int i=;i<n;i++) u=read(),v=read(),vec[u].push_back(v),vec[v].push_back(u);
dp1(,-);dp2(,-);
for (int i=;i<=n;i++)
if (f[i].a[][]&&g[i].a[][]) ans+=(ll)size[i]*(n-size[i]);
else ans+=(ll)(f[i].a[][]+f[i].a[][])*(g[i].a[][]+g[i].a[][]);
printf("%lld\n",ans);
return ;
}
易错点:1.转移式子要认真推。
2.注意函数内部定义变量。
3.将fa在vector中删去,方便前后缀寻址的对应。
题解:dp
把一条边删掉,树就分成了两个子树。要么各自匹配(这样怎么连都可以),要么连一条边后边的端点匹配,也就是两个子树在没有连边前各有一个点没有匹配。
f[i][0/1][0/1]表示以i为根的子树,根是否被匹配,子树中是否恰有一个点未被匹配的未匹配点的选法数。
g表示i为根的子树外的部分的答案(以fa[i]为根)。正反dp两遍后统计答案即可。
CF891D Sloth的更多相关文章
- sloth——算法工程师标注数据的福音
一般算法工程师做标注,都要先开发个标注工具,无非下面几个选项: 1.mfc,C#,优点是交互界面友好,开发难度适中,缺点是没法跨平台 2.matlab,优点是可以跨平台,开发难度非常低,缺点是速度慢. ...
- Seven Deadly Sins: Gluttony, Greed, Sloth, Wrath, Pride, Lust, and Envy.
Seven Deadly Sins: Gluttony, Greed, Sloth, Wrath, Pride, Lust, and Envy.七宗罪:暴食.贪婪.懒惰.暴怒.傲慢.色欲.妒忌.
- Codeforces 891D - Sloth(换根 dp)
Codeforces 题面传送门 & 洛谷题面传送门 换根 dp 好题. 为啥没人做/yiw 首先 \(n\) 为奇数时答案显然为 \(0\),证明显然.接下来我们着重探讨 \(n\) 是偶数 ...
- Java Script 编码规范【转】
Java Script 编码规范 以下文档大多来自: Google JavaScript 编码规范指南 Idiomatic 风格 参考规范 ECMAScript 5.1 注解版 EcmaScript ...
- pickle序列化
通过pickle来序列化: # -*- coding: utf-8 -*- import pickle #-------------------序列化--------------------- zoo ...
- nullcon HackIM 2016 -- Programming Question 5
Dont blink your Eyes, you might miss it. But the fatigue and exhaustion rules out any logic, any wil ...
- C++ Primer Plus读书笔记
第五章 循环和关系表达式 1. 2.类别别名: (1) #define FLOAT_POINTER float * FLOAT_POINTER pa, pb; 预处理器置换将该声明转换成 flo ...
- Deep Learning in a Nutshell: History and Training
Deep Learning in a Nutshell: History and Training This series of blog posts aims to provide an intui ...
- javascript 函数式编程
编程范式 编程范式是一个由思考问题以及实现问题愿景的工具组成的框架.很多现代语言都是聚范式(或者说多重范式): 他们支持很多不同的编程范式,比如面向对象,元程序设计,泛函,面向过程,等等. 函数式编程 ...
随机推荐
- params拦截器
1. params拦截器首先给action中的相关参数赋值,如id 2. prepare拦截器执行prepare方法,prepare方法中会根据参数,如id,去调用业务逻辑,设置model对象 ...
- 数据结构C++版-树
一.概念 树是节点的有限集合. 二叉树: 二.补充知识点 1.<二叉树编码实战二>课程笔记: 递归的基本概念:程序调用自身的编程技巧称为递归,是函数自己调用自己. 迭代:利用变量的原值推算 ...
- StringUtils里的isEmpty方法和isBlank方法的区别
原文地址:https://blog.csdn.net/a1102325298/article/details/80410740 isEmpty public static boolean isEmpt ...
- Cesium资料大全
前言 Cesium是一个用于显示三维地球和地图的开源js库.它可以用来显示海量三维模型数据.影像数据.地形高程数据.矢量数据等等.三维模型格式支持gltf.三维瓦片模型格式支持3d tiles.矢量数 ...
- 源码编译安装nginx详细步骤
1.下载nginx源码包并解压 可在http://nginx.org/en/download.html下载.tar.gz的源码包,如(nginx-1.4.7.tar.gz) 下载后通过tar -xvz ...
- win10 +Kinect V1 1414环境配置
win10 +Kinect V1 1414环境配置 想起老Lab的机器人头顶的Kinect 安装准备 demo展示 人脸识别 照片不能够检测到人脸 可以去除背景 检测骨架 想起老Lab的机器人头顶的K ...
- 牛客CSP-S提高组赛前集训营1
牛客CSP-S提高组赛前集训营1 比赛链接 官方题解 before:T1观察+结论题,T2树形Dp,可以换根或up&down,T3正解妙,转化为图上问题.题目质量不错,但数据太水了~. A-仓 ...
- 用于扩展目标跟踪的笛卡尔B-Spline车辆模型
(哥廷根大学) 摘要 文章提出了一种表示空间扩展物体轮廓的新方法,该方法适用于采用激光雷达跟踪未知尺寸和方向的车辆.我们在笛卡尔坐标系中使用二次均匀周期的B-Splines直接表示目标的星 - 凸形状 ...
- TCP三次握手形象理解
tcp三次握手就像是你用企业微信给人家发信息,首先你得确认别人在不在,你会发 在吗? 这个时候显示的是未读 对方看到之后未读会变成已读 然后他会回复你 在的 你看到这个消息后,他那边也 ...
- 一个切图仔的 CSS 笔记
1,flexbox~注意,设为 Flex 布局以后,子元素的float.clear和vertical-align属性将失效. 在ios8上要加上前缀 display: -webkit-box; dis ...