[多校联考2019(Round 5 T1)] [ATCoder3912]Xor Tree(状压dp)
[多校联考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)的更多相关文章
- [多校联考2019(Round 5 T3)]青青草原的表彰大会(dp+组合数学)
[多校联考2019(Round 5)]青青草原的表彰大会(dp+组合数学) 题面 青青草原上有n 只羊,他们聚集在包包大人的家里,举办一年一度的表彰大会,在这次的表彰大会中,包包大人让羊们按自己的贡献 ...
- [多校联考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] ...
- [多校联考2019(Round 5 T2)]蓝精灵的请求(二分图染色+背包)
[多校联考2019(Round 5)]蓝精灵的请求(二分图染色+背包) 题面 在山的那边海的那边住着 n 个蓝精灵,这 n 个蓝精灵之间有 m 对好友关系,现在蓝精灵们想要玩一个团队竞技游戏,需要分为 ...
- [多校联考2019(Round 4 T2)][51nod 1288]汽油补给(ST表+单调栈)
[51nod 1288]汽油补给(ST表+单调栈) 题面 有(N+1)个城市,0是起点N是终点,开车从0 -> 1 - > 2...... -> N,车每走1个单位距离消耗1个单位的 ...
- Luogu4363 [九省联考2018]一双木棋chess 【状压DP】【进制转换】
题目分析: 首先跑个暴力,求一下有多少种状态,发现只有18xxxx种,然后每个状态有10的转移,所以复杂度大约是200w,然后利用进制转换的技巧求一下每个状态的十进制码就行了. 代码: #includ ...
- noi省选 [九省联考2018]一双木棋题解(状压dp)
比浙江简单多了........ 题目转送:https://www.luogu.org/problemnew/show/P4363 分析: 我们注意到n和m都很小,考虑一下状压dp. 显然,棋子摆成的形 ...
- 洛谷P4363 [九省联考2018]一双木棋chess 【状压dp】
题目 菲菲和牛牛在一块n 行m 列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结束. 落子的规则是:一个格子可以落子当且仅当这个 ...
- 【四校联考】【比赛题解】FJ NOIP 四校联考 2017 Round 7
此次比赛为厦门一中出题.都是聚劳,不敢恭维. 莫名爆了个0,究其原因,竟然是快读炸了……很狗,很难受. 话不多说,来看看题: [T1] 题意: 样例: PS:1<=h[i]<=100000 ...
- 2019.02.09 bzoj2560: 串珠子(状压dp+简单容斥)
传送门 题意简述:nnn个点的带边权无向图,定义一个图的权值是所有边的积,问所有nnn个点都连通的子图的权值之和. 思路: fif_ifi表示保证集合iii中所有点都连通其余点随意的方案数. gig ...
随机推荐
- JavaWeb面试篇(6)
51.说一说Servlet的生命周期? Servlet有良好的生存期的定义,包括加载和实例化.初始化.处理请求以及服务结束.这个生存期由javax.servlet.Servlet接口的init(),s ...
- ubuntu1604-Python35-cuda9-cudnn7-gpu-dockerfile
一,在某目录下有如下文件: -rw-r--r-- 1 root root 1643293725 9月 2 11:46 cuda_9.0.176_384.81_linux.run -rw-r--r-- ...
- Futures工具类使用
Futures是guava提供的工具类,全类名是com.google.common.util.concurrent.Futures.配合MoreExecutors使用,效果极佳. 主要方法如下: 1. ...
- mysql LAST()函数 语法
mysql LAST()函数 语法 作用:返回指定的字段中最后一个记录的值. 语法:SELECT LAST(column_name) FROM table_name 注释:可使用 ORDER BY 语 ...
- mysql 创建用户和授权
https://www.cnblogs.com/sos-blue/p/6852945.html
- linux下简易端口扫描器
#include<iostream> #include<string.h> #include<sys/types.h> #include<sys/socket ...
- Shell 变量/echo命令
Shell 教程 Shell 是一个用C语言编写的程序,它是用户使用Linux的桥梁.Shell既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这个应用程序提供了一个界面,用户 ...
- BZOJ 2281 Luogu P2490 [SDOI2011]黑白棋 (博弈论、DP计数)
怎么SDOI2011和SDOI2019的两道题这么像啊..(虽然并不完全一样) 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?i ...
- Spring Cloud Config教程(四)快速开始
Spring Cloud Config为分布式系统中的外部配置提供服务器和客户端支持.使用Config Server,您可以在所有环境中管理应用程序的外部属性.客户端和服务器上的概念映射与Spring ...
- HDU1575--Tr A(矩阵快速幂)
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...