题解 \(by\;zj\varphi\)

树形 \(dp\) 题目

有一个结论:对于一个图,有多少奇度数的点,处以二就是答案,奇度数指的是和它相连的边中被反转的是奇数

证明很好证

那么设 \(dp_{i,0}\) 表示当没翻转 \(i->fa_i\) 的边时在 \(i\) 的子树中有多少奇度数点, \(dp_{i,1}\) 表示翻转了

那么分情况转移,设 \(w1\) 表示和 \(i\) 相连的且在它子树中的边被翻转奇数条时子树中除去 \(i\) 的答案,此时,若不算和父亲相连的边,这个点就是一个奇度数点

\[dp_{i,0}=w1+1\\
dp_{i,1}=w1
\]

那么 \(w2\) 就代表偶数

\[dp_{i,0}=w2\\
dp_{i,1}=w2+1
\]

每次需要判断 \(i->fa\) 的类型,然后必须转移的就不能更新 \(dp_{i,0}\),不能转移的同理

Code
#include<bits/stdc++.h>
#define ri register signed
#define p(i) ++i
using namespace std;
namespace IO{
char buf[1<<21],*p1=buf,*p2=buf;
#define gc() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++
template<typename T>inline void read(T &x) {
ri f=1;x=0;register char ch=gc();
while(ch<'0'||ch>'9') {if (ch=='-') f=0;ch=gc();}
while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=gc();}
x=f?x:-x;
}
}
using IO::read;
namespace nanfeng{
#define node(x,y) (node){x,y}
#define FI FILE *IN
#define FO FILE *OUT
template<typename T>inline T cmax(T x,T y) {return x>y?x:y;}
template<typename T>inline T cmin(T x,T y) {return x>y?y:x;}
static const int N=1e5+7,INF=1e9+7;
int first[N],t=1,n;
struct edge{int v,nxt,w;}e[N<<1];
inline void add(int u,int v,int w) {e[t].v=v,e[t].w=w,e[t].nxt=first[u],first[u]=t++;}
struct node{int w1,w2;}dp[N][2];
inline int operator>(const node &n1,const node &n2) {return n1.w1==n2.w1?n1.w2>n2.w2:n1.w1>n2.w1;}
inline node operator+(const node &n1,const node &n2) {return node(n1.w1+n2.w1,n1.w2+n2.w2);}
void dfs(int x,int fa,int w) {
node tmp1=node(INF,INF);
node tmp2=node(0,0);
for (ri i(first[x]),v;i;i=e[i].nxt) {
if ((v=e[i].v)!=fa) {
dfs(v,x,e[i].w);
node fg1=cmin(tmp1+dp[v][0],tmp2+dp[v][1]);
node fg2=cmin(tmp2+dp[v][0],tmp1+dp[v][1]);
tmp1=fg1,tmp2=fg2;
}
if (w==1) dp[x][0]=node(INF,INF);
else dp[x][0]=cmin(node(tmp1.w1+1,tmp1.w2),tmp2);
if (!w) dp[x][1]=node(INF,INF);
else dp[x][1]=cmin(node(tmp1.w1,tmp1.w2+1),node(tmp2.w1+1,tmp2.w2+1));
}
}
inline int main() {
// FI=freopen("nanfeng.in","r",stdin);
// FO=freopen("nanfeng.out","w",stdout);
read(n);
for (ri i(1),u,v,c,w;i<n;p(i)) {
read(u),read(v),read(c),read(w);
if (w==2) add(u,v,w),add(v,u,w);
else add(u,v,c!=w),add(v,u,c!=w);
}
dfs(1,0,2);
printf("%d %d\n",dp[1][0].w1>>1,dp[1][0].w2);
return 0;
}
}
int main() {return nanfeng::main();}

NOIP 模拟 $19\; \rm w$的更多相关文章

  1. NOIP 模拟 $19\; \rm v$

    题解 一道概率与期望的状压题目 这种最优性的题目,我们一般都是倒着转移,因为它的选择是随机的所以我们无法判断从左还是从右更有,所以我们都搜一遍 时间一定会爆,采用记忆化搜索,一种状态的答案一定是固定的 ...

  2. NOIP 模拟 $19\; \rm u$

    题解 \(by\;zj\varphi\) 二维差分的题目 维护两个标记,一个向下传,一个向右下传: 对于每次更新,我们可以直接更新 \((r,c)+s,(r+l,c)-s\) ; \((r,c+1)- ...

  3. 7.19 NOIP模拟6

    这次考试又一次让mikufun认识到了常数的重要性 T1.那一天我们许下约定 这题一看到D<=1e12,想都没想,矩阵快速幂!然后飞快的码了一个,复杂度n^3logD,让后我观察了一下这个转移矩 ...

  4. NOIP模拟 1

    NOIP模拟1,到现在时间已经比较长了.. 那天是6.14,今天7.18了 //然鹅我看着最前边缺失的模拟1,还是终于忍不住把它补上,为了保持顺序2345重新发布了一遍.. #   用  户  名   ...

  5. 2021.5.22 noip模拟1

    这场考试考得很烂 连暴力都没打好 只拿了25分,,,,,,,,好好总结 T1序列 A. 序列 题目描述 HZ每周一都要举行升旗仪式,国旗班会站成一整列整齐的向前行进. 郭神作为摄像师想要选取其中一段照 ...

  6. NOIP 模拟 $36\; \rm Cicada 拿衣服$

    题解 \(by\;zj\varphi\) 发现右端点固定时,左端点的 \(min-max\) 单调递减,且对于 \(or\) 和 \(and\) 相减,最多有 \(\rm2logn\)个不同的值,且相 ...

  7. NOIP 模拟 $22\; \rm e$

    题解 对于这个 \(abs\) 就是求大于 \(r\) 的最小值,小于 \(r\) 的最大值,建权值线段树或平衡树. 因为是 \(k\) 个点的联通块,就是求它们的 \(lca\) 到它们的链,可持久 ...

  8. NOIP 模拟 $16\; \rm Lost My Music$

    题解 \(by\;zj\varphi\) 一道凸包的题 设 \(\rm dep_u\) 表示节点 \(u\) 的深度,那么原式就可化为 \(-\frac{c_v-c_u}{dep_v-dep_u}\) ...

  9. NOIP模拟

    1.要选一个{1,2,...n}的子集使得假如a和b在所选集合里且(a+b)/2∈{1,2,...n}那么(a+b)/2也在所选集合里 f[i]=2*f[i-1]-f[i-2]+g[i] g[n]:选 ...

随机推荐

  1. 第二届 BJD wp(reverse和crypto)

    re 1.第一题拖入ida,flag就是直接明文摆着 2.第二题是8086的程序,拖入ida,发现有个jmp无限跳转,可能是段寄存器被修改了,ida无法将后面的汇编识别出来,所以后面才有很多无效数据, ...

  2. C# 8.0和.NET Core 3.0高级编程 分享笔记二:编程基础第二部分

    这一篇是接上一篇笔记的第二部分. 2.5深入研究控制台应用程序 前面创建并使用了基本的控制台应用程序,下面更深入地研究它们. 控制台应用程序是基于文本的,在命令上运行的.它们通常执行需要编写脚本的简单 ...

  3. Java | 集合(Collection)和迭代器(Iterator)

    集合(Collection) 集合就是Java中提供的一种 空器,可以用来存储多个数据. 集合和数组都是一个容器,它们有什么区别呢? 数组的长度是固定的,集合的长度是可变的. 数组中存储的是同一类型的 ...

  4. 腾讯云短信详细教程(C#,WinForm)

    1.申请一个微信公众号(申请公众号是准备工作的第一步,必须先完成)(那为什么要用公众号呢?是因为这个条件对于学生党来说比较简单实现,不需要本人有上市的APP或是网站等) 2.百度搜索"腾讯云 ...

  5. Codeforces Round#704 Div2 题解(A,B,C,D,E)

    FST ROUND !!1 A Three swimmers: 直接整除一下向上取整就好了: #include <bits/stdc++.h> using namespace std; t ...

  6. C语言:printf*("%x")

    #include <stdio.h> int main(){ int a = 100; char str[20] = "hello world!"; char *zza ...

  7. C语言:特殊点

    编译器给变量分配内存在函数外部定义的变量叫做全局变量(Global Variable),在函数内部定义的变量叫做局部变量(Local Variable)一个变量,即使不给它赋值,它也会有一个默认的值, ...

  8. Grafana、Prometheus-监控平台

    一:Grafana 简介与部署 安利一个生产环境正在使用的监控和告警平台:grafana,它是一个开源的可对指标和日志进行查询.可视化和告警的平台. docker 安装官方文档:https://gra ...

  9. 大疆M3508、M2006必备CAN总线知识与配置方法

    使用大疆M3508.M2006的CAN总线知识与配置方法 目录 使用大疆M3508.M2006的CAN总线知识与配置方法 前言: 0x00 需要额外的CAN收发器!!! 0x01 硬件层面分析 为什么 ...

  10. python -- 正则表达式&re模块(转载)

    1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分.正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十 ...