Solution -「AT 3913」XOR Tree
\(\mathcal{Description}\)
Link.
给定一棵树,边 \((u,v)\) 有边权 \(w(u,v)\)。每次操作可以使一条简单路径上的边权异或任意非负整数。求最少的操作次数使得所有边边权为 \(0\)。
\(n\le10^5\),\(w(u,v)<16\)。
\(\mathcal{Solution}\)
好妙的题 www。
定义一个点的点权 \(val_u\) 为其所有邻接边边权的异或和,即 \(val_u=\bigoplus_{(u,v)\in E}w(u,v)\)。一个至关重要的发现:所有边权为零等价于所有点权为零。
左推右是显然的;右推左,数归,考虑到叶子的边权等于点权,所以去掉所有叶子仍满足,得证。
再考虑一次操作,除路径两端的点,每个点有两条邻接边被异或了同一个数,所以这些点的点权不变!
非常 amazing 啊,这样一来问题就从树上剥离了——给一堆数,每次任选两个数异或同一个非负整数,求把这些数变成 \(0\) 的最小操作次数。
首先,若存在 \(u\not=v,val_u=val_v\),显然应该用一次操作处理掉它们。问题进一步转化——给一个值域在 \([0,16)\) 的集合(无重复元素),求把这些数变成 \(0\) 的最小操作次数。
鉴于 \(16=2^4\),考虑状压。设 \(f(S)\) 为处理集合 \(S\) 的最小操作次数。显然对于 \(S\) 内元素异或和不为 \(0\) 的 \(f(S)\),有 \(f(S)=+\infty\)。接下来想想对于 \(S\not=0\) 的转移:
\]
其中,前一项是暴力两两异或,后者即分别处理两个子集。
设 \(w(u,v)\) 的上限 \(W=2^k,~k\in\mathbb N\),复杂度 \(\mathcal O(3^k+n)\)。
\(\mathcal{Code}\)
#include <cstdio>
#include <cstring>
const int MAXN = 1e5, INF = 0x3f3f3f3f;
int n, val[MAXN + 5], cnt[16], f[1 << 16], xsum[1 << 16];
inline void chkmin ( int& a, const int b ) { if ( b < a ) a = b; }
int main () {
scanf ( "%d", &n );
for ( int i = 1, u, v, w; i < n; ++ i ) {
scanf ( "%d %d %d", &u, &v, &w );
val[u] ^= w, val[v] ^= w;
}
int ans = 0, S = 0;
for ( int i = 0; i < n; ++ i ) ++ cnt[val[i]];
for ( int i = 1; i < 16; ++ i ) {
S |= ( cnt[i] & 1 ) << i >> 1;
ans += cnt[i] >> 1;
}
for ( int i = 1; i < 1 << 15; ++ i ) {
for ( int j = 0; j < 15; ++ j ) {
if ( ( i >> j ) & 1 ) {
++ f[i], xsum[i] ^= j + 1;
}
}
-- f[i];
}
for ( int s = 0; s < 1 << 15; ++ s ) {
if ( xsum[s] ) continue;
for ( int t = s; ; t = ( t - 1 ) & s ) {
if ( ! xsum[t] && ! xsum[s ^ t] ) chkmin ( f[s], f[t] + f[s ^ t] );
if ( ! t ) break;
}
}
printf ( "%d\n", ans + f[S] );
return 0;
}
Solution -「AT 3913」XOR Tree的更多相关文章
- Solution -「CF 1060F」Shrinking Tree
\(\mathcal{Description}\) Link. 给定一棵 \(n\) 个点的树,反复随机选取一条边,合并其两端两点,新点编号在两端两点等概率选取.问每个点留到最后的概率. ...
- Solution -「ARC 104E」Random LIS
\(\mathcal{Description}\) Link. 给定整数序列 \(\{a_n\}\),对于整数序列 \(\{b_n\}\),\(b_i\) 在 \([1,a_i]\) 中等概率 ...
- Solution -「HDU 5498」Tree
\(\mathcal{Description}\) link. 给定一个 \(n\) 个结点 \(m\) 条边的无向图,\(q\) 次操作每次随机选出一条边.问 \(q\) 条边去重后构成生成 ...
- Solution -「Gym 102956F」Find the XOR
\(\mathcal{Description}\) Link. 给定 \(n\) 个点 \(m\) 条边的连通无向图 \(G\),边有边权.其中 \(u,v\) 的距离 \(d(u,v)\) ...
- Solution -「ARC 125F」Tree Degree Subset Sum
\(\mathcal{Description}\) Link. 给定含有 \(n\) 个结点的树,求非负整数对 \((x,y)\) 的数量,满足存在 \(\exist S\subseteq V ...
- Solution -「Gym 102798K」Tree Tweaking
\(\mathcal{Description}\) Link. 给定排列 \(\{p_n\}\),求任意重排 \(p_{l..r}\) 的元素后,将 \(\{p_n\}\) 依次插入二叉搜索树 ...
- Solution -「Gym 102759I」Query On A Tree 17
\(\mathcal{Description}\) Link. 给定一棵含 \(n\) 个结点的树,结点 \(1\) 为根,点 \(u\) 初始有点权 \(a_u=0\),维护 \(q\) 次 ...
- Solution -「国家集训队」「洛谷 P2619」Tree I
\(\mathcal{Description}\) Link. 给一个 \(n\) 个点 \(m\) 条边的带权无向图,边有权值和黑白颜色,求恰选出 \(K\) 条白边构成的最小生成树. ...
- Solution -「ARC 101E」「AT 4352」Ribbons on Tree
\(\mathcal{Description}\) Link. 给定一棵 \(n\) 个点的树,其中 \(2|n\),你需要把这些点两两配对,并把每对点间的路径染色.求使得所有边被染色的方案数 ...
随机推荐
- centos7 配置登录前和登录信息内容
登录之前提示信息: 登录之后提示信息: 上述中,只需修改对应的文件即可. 登录之前: vi /etc/issue 登录之后: vi /etc/motd 补充:将文件内容清空的方法,不是删除. 在前面文 ...
- 第10组 Beta冲刺 (5/5)
1.1基本情况 ·队名:今晚不睡觉 ·组长博客:https://www.cnblogs.com/cpandbb/p/14018671.html ·作业博客:https://edu.cnblogs.co ...
- Servlet初级学习加入数据库操作(三)
源代码地址(访问密码:7567):https://url56.ctfile.com/f/34653256-527822631-2e255a CRUD 增删改查 准备添加的操作 点击添加之后,出现新的页 ...
- FastDFS的应用
一.定义 FastDFS是由淘宝的余庆先生所开发的一个轻量级.高性能的开源分布式文件系统.用纯C语言开发,功能丰富: 文件存储 文件同步 文件访问(上传.下载) 存取负载均衡 在线扩容 适合有大容量存 ...
- 【Spring专场】「AOP容器」不看源码就带你认识核心流程以及运作原理
前提回顾 前一篇文章主要介绍了spring核心特性机制的IOC容器机制和核心运作原理,接下来我们去介绍另外一个较为核心的功能,那就是AOP容器机制,主要负责承接前一篇代理模式机制中动态代理:JDKPr ...
- 几张图解释明白 Kubernetes Ingress
来源:K8s技术圈 作者:阳明 Kubernetes Ingress 只是 Kubernetes 中的一个普通资源对象,需要一个对应的 Ingress 控制器来解析 Ingress 的规则,暴露服务到 ...
- C#进程调用FFmpeg操作音视频
项目背景 因为公司需要对音视频做一些操作,比如说对系统用户的发音和背景视频进行合成,以及对多个音视频之间进行合成,还有就是在指定的源背景音频中按照对应的规则在视频的多少秒钟内插入一段客户发音等一些复杂 ...
- 【Java】重载与重写
重载与重写 一.重载 定义 在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可.同一个类.相同方法名,参数列表不同:参数个数不同,参数类型不同. Java的重载是可以包括 ...
- HashMap的实现原理(看这篇就够了)
一线资深java工程师明确了需要精通集合容器,尤其是今天我谈到的HashMap. HashMap在Java集合的重要性不亚于Volatile在并发编程的重要性(可见性与有序性). 我会重点讲解以下9点 ...
- 学习Java第1天
今天所做的工作:1.了解Java语言的发展历史 2.安装了Eclipse软件 3.学习了Eclipse的基本使用方法 4.学习了Java基本输出语法 5.成功输出了helloworld 6.学习了Ja ...