w

题目背景

\(\frac 14\)遇到了一道水题,双完全不会做,于是去请教小\(\text{D}\)。小\(\text{D}\)看了\(0.607^2\)眼就切掉了这题,嘲讽了\(\frac 14\)一番就离开了。

于是,\(\frac 14\)只好来问你,这道题是这样的:

题目描述

有一棵\(n\)个节点的树,每条边长度为\(1\),颜色为黑或白。

可以执行若干次如下操作:选择一条简单路径,反转路径上所有边的颜色。

对于某些边,要求在操作结束时为某一种颜色。

给定每条边的初始颜色,求最小操作数,以及满足操作数最小时,最小的操作路径长度和。

输入输出格式

输入格式

第一行,一个正整数\(n\)。

接下来\(n-1\)行,每行四个整数\(a,b,c,d\):

  • 树中有一条边连接\(a\)和\(b\)。

  • \(c=0,1\)表示初始颜色为白色、黑色。

  • \(d=0,1,2\)表示最终要求为白色、要求为黑色、没有要求。

输出格式

输出一行,两个整数,表示最小操作数、操作数最小时的最小路径长度和。

数据范围

\(n\in [1,10^5]\),\(a,b\in [1,n]\),\(c\in \{0,1\}\),\(d\in \{0,1,2\}\)

\(\text{Subtask}\) 分值 \(n\le\) 其他限制
\(1\) \(18\) \(20\) 无
\(2\) \(25\) \(10^3\) 最多\(10\)条边使得\(d=2\)
\(3\) \(23\) \(10^5\) 保证\(a+1=b\)
\(4\) \(1\) \(10^5\) 保证\(d=2\)
\(5\) \(13\) \(10^5\) 保证\(d\not=2\)
\(6\) \(20\) \(10^5\) 无

又是一道神题,先形式化的说一说做法吧。


有一个容易发现的小性质:每条边最多只需要翻转一次。

然后我们考虑翻转了边集\(E\),边集\(E\)的操作数为边集中连接的点的奇数度数点的个数除2,路径长度为边数。我们需要在最小化前者的基础上最小化后者。

可以把代价直接压进去做树形\(DP\),考虑每个子树的最小化代价。

子树划分为两个状态,代表头顶上的点是否翻转。

具体的说\(dp_{i,0/1}\)代表以\(i\)为根的子树具有最优代价(\(c_1,c_2\))时是否(0/1)翻转头顶的边,\(c_1\)为奇数点个数,\(c_2\)为翻转路径长度。

这里边,点的代价均下放。


考虑儿子集合\(\{v\}\)如何被转移。

\(w_1\)代表已经转移的集合\(\{v'\}\)有一条向\(i\)伸出的翻转边的最小代价,\(w_2\)代表没有伸出翻转边

\(w_1=min(w_1+dp_{v,0},w_2+dp_{v,1})\)

\(w_2=min(w_1+dp_{v,1},w_2+dp_{v,0})\)

也就是拿子树做了一个递推。

初始化:\(w_1=(inf,inf),w_2=(0,0)\)


考虑如何用\(w_1,w_2\)更新\(i\)的答案。

如果\(i\)的头顶一定需要翻转

\(dp_{i,0}=(inf,inf)\)

\(dp_{i,1}=min((w_1.c_1,w_1.c_2+1),(w_2.c_1+1,w_2.c_2+1))\)

分别代表 翻转向上延伸,奇数点不变,路径长度+1 和 独立翻转出去,奇数点与路径长均+1

如果\(i\)的头顶一定不需要翻转

\(dp_{i,0}=min((w_1.c_1+1,w_1.c2),w_2)\)

分别代表\(i\)成为奇数点,路径不变 和 直接没操作

\(dp_{i,1}=(inf,inf)\)

如果可以翻转可以不翻转,就做两个有决策的

然后就没了


考虑可以从这个题目得到什么收获。

  1. 可以把最优状态下的最优压在一起拿二元组做
  2. 首先要认真研究性质,作为划分状态的依据
  3. 与路径有关的状态划分基于是否从头顶伸出一条边

Code:

#include <cstdio>
const int N=1e5+10;
const int inf=0x3f3f3f3f;
int head[N],to[N<<1],Next[N<<1],edge[N<<1],cnt,n;
void add(int u,int v,int w)
{
to[++cnt]=v,edge[cnt]=w,Next[cnt]=head[u],head[u]=cnt;
}
struct node
{
int c1,c2;
node(){}
node(int c1,int c2){this->c1=c1,this->c2=c2;}
node friend operator +(node n1,node n2)
{
node n3(n1.c1+n2.c1,n1.c2+n2.c2);
return n3;
}
bool friend operator <(node n1,node n2)
{
return n1.c1==n2.c1?n1.c2<n2.c2:n1.c1<n2.c1;
}
}dp[N][2];
node min(node n1,node n2){return n1<n2?n1:n2;}
void dfs(int now,int fa,int typ)
{
node w1(inf,inf),w2(0,0),nx1,nx2;
for(int i=head[now];i;i=Next[i])
{
int v=to[i];
if(v==fa) continue;
dfs(v,now,edge[i]);
nx1=min(w1+dp[v][0],w2+dp[v][1]);
nx2=min(w1+dp[v][1],w2+dp[v][0]);
w1=nx1,w2=nx2;
}
if(typ==1||typ==2)
dp[now][1]=min(node(w1.c1,w1.c2+1),node(w2.c1+1,w2.c2+1));
else
dp[now][1]=node(inf,inf);
if(typ==0||typ==2)
dp[now][0]=min(node(w1.c1+1,w1.c2),w2);
else
dp[now][0]=node(inf,inf);
}
int main()
{
scanf("%d",&n);
for(int a,b,c,d,i=1;i<n;i++)
{
scanf("%d%d%d%d",&a,&b,&c,&d);
c=d==2?d:c!=d;//0不翻转,1翻转,2随便
add(a,b,c),add(b,a,c);
}
dfs(1,0,2);
printf("%d %d\n",dp[1][0].c1>>1,dp[1][0].c2);
return 0;
}

2018.10.12

雅礼集训 Day3 T3 w 解题报告的更多相关文章

  1. 雅礼集训 Day1 T3 画作 解题报告

    画作 题目描述 小\(\mathrm{G}\)的喜欢作画,尤其喜欢仅使用黑白两色作画. 画作可以抽象成一个\(r\times c\)大小的\(01\)矩阵.现在小\(\mathrm{G}\)构思好了他 ...

  2. 雅礼集训 Day3 T2 v 解题报告

    v 题目背景 \(\frac 14\)遇到了一道水题,又完全不会做,于是去请教小\(\text{D}\).小\(\text{D}\)看了\(0.607\)眼就切掉了这题,嘲讽了\(\frac 14\) ...

  3. 雅礼集训 Day5 T3 题 解题报告

    题 题目背景 由于出题人赶时间所以没办法编故事来作为背景. 题目描述 一开始有\(n\)个苹果,\(m\)个人依次来吃苹果,第\(i\)个人会尝试吃\(u_i\)或\(v_i\)号苹果,具体来说分三种 ...

  4. 雅礼集训 Day3 T2 u 解题报告

    u 题目背景 \(\frac 14\) 遇到了一道水题,完全不会做,于是去请教小\(\text{D}\).小\(\text{D}\)看了一眼就切掉了这题,嘲讽了\(\frac 14\)一番就离开了. ...

  5. 雅礼集训 Day2 T3 联盟 解题报告

    联盟 题目描述 \(\text{G}\) 国周边的 \(n\) 个小国家构成一个联盟以抵御 \(\text{G}\) 国入侵, 为互相支援,他们建立了\(n−1\) 条双向通路, 使得任意两个国家可以 ...

  6. 「雅礼集训 2017 Day2」解题报告

    「雅礼集训 2017 Day2」水箱 我怎么知道这种题目都能构造树形结构. 根据高度构造一棵树,在树上倍增找到最大的小于约束条件高度的隔板,开一个 \(vector\) 记录一下,然后对于每个 \(v ...

  7. 「雅礼集训 2017 Day1」 解题报告

    「雅礼集训 2017 Day1」市场 挺神仙的一题.涉及区间加.区间除.区间最小值和区间和.虽然标算就是暴力,但是复杂度是有保证的. 我们知道如果线段树上的一个结点,\(max=min\) 或者 \( ...

  8. 雅礼集训 Day6 T2 Equation 解题报告

    Equation 题目描述 有一棵\(n\)个点的以\(1\)为根的树,以及\(n\)个整数变量\(x_i\).树上\(i\)的父亲是\(f_i\),每条边\((i,f_i)\)有一个权值\(w_i\ ...

  9. 雅礼集训 Day7 T1 Equation 解题报告

    Reverse 题目背景 小\(\text{G}\)有一个长度为\(n\)的\(01\)串\(T\),其中只有\(T_S=1\),其余位置都是\(0\).现在小\(\text{G}\)可以进行若干次以 ...

随机推荐

  1. Java : 实体类不能序列化异常

    当修改实体类之后调用接口出现不能序列化的异常时,一定要检查实体之间的关系是否都是正确的. could not serialize; nested exception is org.hibernate. ...

  2. Drupal 网站漏洞修复以及网站安全防护加固方法

    drupal是目前网站系统使用较多一个开源PHP管理系统,架构使用的是php环境+mysql数据库的环境配置,drupal的代码开发较为严谨,安全性较高,但是再安全的网站系统,也会出现网站漏洞,dru ...

  3. asp.net core mvc简介

    MVC 通常而言,我们使用.NET Core MVC 构建网页应用与 API,MVC是使用模型-视图-控制器(Model-View-Controller)设计模式. 创建项目 使用如下命令创建一个名称 ...

  4. 38-JWT 设计解析及定制

    可去官网下载Security项目查看源码 只需修改 AddJwtBearer中的行为即可 public void ConfigureServices(IServiceCollection servic ...

  5. JS 实现AJAX封装(只限于异步)

    1.AJAX 分为异步 和 同步 请求 比如你去买一个食品,但是商店暂时没有这个食品 异步:等到商品有了再来买,这个期间我可以去做别的事: 同步:一直在这里等,什么时候商品来了,买到手了,再去做别的事 ...

  6. 20145202 《Java程序设计》实验五实验报告

    一.实验内容 1.用书上的TCP代码,实现服务器与客户端. 2.客户端与服务器连接 3.客户端中输入明文,利用DES算法加密,DES的秘钥用RSA公钥密码中服务器的公钥加密,计算明文的Hash函数值, ...

  7. Linux用户态程序计时方式详解[转]

    转自: http://www.cnblogs.com/clover-toeic/p/3845210.html 前言 良好的计时器可帮助程序开发人员确定程序的性能瓶颈,或对不同算法进行性能比较.但要精确 ...

  8. Objective-C反射机制

    oc反射机制有三个用途: 1.获得Class Class LoginViewController = NSClassFromString(@"LoginViewController" ...

  9. 【BZOJ 1269】文本编辑器

    题目 这些日子,可可不和卡卡一起玩了,原来可可正废寝忘食的想做一个简单而高效的文本编辑器.你能帮助他吗?为了明确任务目标,可可对"文本编辑器"做了一个抽象的定义: Move k:将 ...

  10. Ubuntu-C++环境设置

    在学习C++,顺便想熟悉一下Linux下开发 所以就开始搭建Linux环境 第一步就是下载虚拟机和Ubuntu 虚拟机 vm 12.1 Ubuntu 16 VM安装省略 Ubuntu安装省略 下面是我 ...