[多校联考2019(Round 5)] [ATCoder3912]Xor Tree(状压dp)

题面

给出一棵n个点的树,每条边有边权v,每次操作选中两个点,将这两个点之间的路径上的边权全部异或某个值,求使得最终所有边权为0的最小操作次数。

\(v \leq 15,n \leq 10^5\)

分析

首先把边权转化为点权。记一个点的点权为与它相连的所有边的边权和。当我们给一条路径上的边异或上某个值时,路径端点的点权被异或了1次,而路径上不是端点的点有两条边被异或了,相当于异或了2次,权值不变。因此,我们发现,路径上的边权修改相当于对路径端点的点权修改

因此问题变成了,树上有n个点,每个点有一个点权。每次操作可以选2个点,将它们同时异或上某值,求使得最终所有点权为0的最小操作次数。

首先,我们将值相等的点两两异或上它们的值。最后还剩下值互不相同的一些点,这些点最多有15个(值为0的点不管)。

于是可以状压dp.状态为当前权值的出现情况。

转移的时候枚举当前状态里的两个值\(i,j\),考虑操作1次其中一个异或成0,那另一个的权值就变为\(p=i \ \mathrm{XOR} \ j\)。那么dp[s]=min(dp[s],dp[(s^(1<<i)^(1<<j)^(1<<p)]+1)

但是有一种特殊情况,如果原来的状态里就存在\(i\ \mathrm{XOR} \ j\),那么还可以再操作1次,把两个\(i\ \mathrm{XOR} \ j\)消掉

dp[s]=min(dp[s],dp[s^(1<<i)^(1<<j)^(1<<p)]+2)

dp用记忆化搜索实现更方便

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 100000
#define maxv 15
#define maxb (1<<16)
#define INF 0x3f3f3f3f
using namespace std;
int n;
int a[maxn+5];
int cnt[maxv+5]; int sta;
int dp[maxb+5];
int get_dp(int s) {
if(dp[s]!=INF) return dp[s];
for(int i=0; i<=15; i++) {
if(!(s&(1<<i))) continue;
for(int j=0; j<=15; j++) {
if(!(s&(1<<j))||i==j) continue;
int p=i^j;
int rest=s^(1<<i)^(1<<j)^(1<<p);
if(!(rest&(1<<p))) dp[s]=min(dp[s],get_dp(rest)+2); //i,j异或之后出现i^j,和原来的i^j一起被消掉
else dp[s]=min(dp[s],get_dp(rest)+1);
}
}
return dp[s];
}
int main() {
//#ifdef LOCAL
// freopen("1.in","r",stdin);
//#endif
int u,v,w;
scanf("%d",&n);
for(int i=1; i<n; i++) {
scanf("%d %d %d",&u,&v,&w);
u++;
v++;
a[u]^=w;
a[v]^=w;
}
for(int i=1; i<=n; i++) {
cnt[a[i]]++;
}
int ans=0;
for(int i=1; i<=15; i++) {
ans+=cnt[i]/2;
if(cnt[i]%2==1) sta|=(1<<i);
}
memset(dp,0x3f,sizeof(dp));
dp[0]=0;
ans+=get_dp(sta);
printf("%d\n",ans);
}

[多校联考2019(Round 5 T1)] [ATCoder3912]Xor Tree(状压dp)的更多相关文章

  1. [多校联考2019(Round 5 T3)]青青草原的表彰大会(dp+组合数学)

    [多校联考2019(Round 5)]青青草原的表彰大会(dp+组合数学) 题面 青青草原上有n 只羊,他们聚集在包包大人的家里,举办一年一度的表彰大会,在这次的表彰大会中,包包大人让羊们按自己的贡献 ...

  2. [多校联考2019(Round 4 T1)][51nod 1295]Xor key(可持久化trie)

    [51nod 1295]Xor key(可持久化trie) 题面 给出一个长度为n的正整数数组A,再给出Q个查询,每个查询包括3个数,L, R, X (L <= R).求A[L] 至 A[R] ...

  3. [多校联考2019(Round 5 T2)]蓝精灵的请求(二分图染色+背包)

    [多校联考2019(Round 5)]蓝精灵的请求(二分图染色+背包) 题面 在山的那边海的那边住着 n 个蓝精灵,这 n 个蓝精灵之间有 m 对好友关系,现在蓝精灵们想要玩一个团队竞技游戏,需要分为 ...

  4. [多校联考2019(Round 4 T2)][51nod 1288]汽油补给(ST表+单调栈)

    [51nod 1288]汽油补给(ST表+单调栈) 题面 有(N+1)个城市,0是起点N是终点,开车从0 -> 1 - > 2...... -> N,车每走1个单位距离消耗1个单位的 ...

  5. Luogu4363 [九省联考2018]一双木棋chess 【状压DP】【进制转换】

    题目分析: 首先跑个暴力,求一下有多少种状态,发现只有18xxxx种,然后每个状态有10的转移,所以复杂度大约是200w,然后利用进制转换的技巧求一下每个状态的十进制码就行了. 代码: #includ ...

  6. noi省选 [九省联考2018]一双木棋题解(状压dp)

    比浙江简单多了........ 题目转送:https://www.luogu.org/problemnew/show/P4363 分析: 我们注意到n和m都很小,考虑一下状压dp. 显然,棋子摆成的形 ...

  7. 洛谷P4363 [九省联考2018]一双木棋chess 【状压dp】

    题目 菲菲和牛牛在一块n 行m 列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结束. 落子的规则是:一个格子可以落子当且仅当这个 ...

  8. 【四校联考】【比赛题解】FJ NOIP 四校联考 2017 Round 7

    此次比赛为厦门一中出题.都是聚劳,不敢恭维. 莫名爆了个0,究其原因,竟然是快读炸了……很狗,很难受. 话不多说,来看看题: [T1] 题意: 样例: PS:1<=h[i]<=100000 ...

  9. 2019.02.09 bzoj2560: 串珠子(状压dp+简单容斥)

    传送门 题意简述:nnn个点的带边权无向图,定义一个图的权值是所有边的积,问所有nnn个点都连通的子图的权值之和. 思路: fif_ifi​表示保证集合iii中所有点都连通其余点随意的方案数. gig ...

随机推荐

  1. 正则获取a标签和a标签中的href地址

    /(<\/?a.*?>)/ a标签 /<a\b.*?</a>/ 表式以"<a "(有空格) 开始 以"</a>" ...

  2. Python 函数Ⅱ

    以上代码中,[1,2,3] 是 List 类型,"Runoob" 是 String 类型,而变量 a 是没有类型,她仅仅是一个对象的引用(一个指针),可以是 List 类型对象,也 ...

  3. 从1G到5G发展史(3GPP是个什么组织 为啥5G标准离不开它)

    1.“3GPP”组织建立的来龙去脉 3GPP一直以来在人们心中是一个神秘的组织,很多用户对于它的理解和认知,说不清,道不明.最近关于5G网络的诸多报道,都陈述了“5G网络”的标准是由“3GPP”来规定 ...

  4. AJAX - 服务器 响应

    AJAX - 服务器 响应 服务器响应 如需获得来自服务器的响应,请使用 XMLHttpRequest 对象的 responseText 或 responseXML 属性.大理石构件来图加工 属性 描 ...

  5. PHP大文件分片上传断点续传实例源码

    1.使用PHP的创始人 Rasmus Lerdorf 写的APC扩展模块来实现(http://pecl.php.net/package/apc) APC实现方法: 安装APC,参照官方文档安装,可以使 ...

  6. Python爬虫黑科技(经验)

    "作为一名爬虫工程师,你最需要关注的,是数据的来源" 原文:https://www.jb51.net/article/90114.htm 霍夫曼编码压缩算法 1.最基本的抓站   ...

  7. JMS学习十一(ActiveMQ Consumer高级特性之独有消费者(Exclusive Consumer))

    一.简介 Queue中的消息是按照顺序被分发到consumers的.然而,当你有多个consumers同时从相同的queue中提取消息时, 你将失去这个保证.因为这些消息是被多个线程并发的处理.有的时 ...

  8. python相关遗漏知识点补充

    python中的相关帮助命令 假设s是一个字符串, 那么dir(s)可以列出字符串对象的所有属性(方法也是函数属性),其中有下划线的部分与类重 载有关,用来表示python实现细节,没有下划线的属性是 ...

  9. layui 获取select option value 获取text

    $.trim($("#processState").val()): //获取val $("#processState option:selected").tex ...

  10. learning webrtc 使用node.js

    第二章 有使用node.js创建静态服务器的步骤 不过不够详细 下面以Windows为例 1.到官方网站下载安装包 然后安装 2.用管理员权限启动命令行 3.命令行窗口执行npm config set ...