\(\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\) 的转移:

\[f(S)=\min_{T\subset S}\{\operatorname{count}(S)-1,f(T)+f(S-T)\}
\]

  其中,前一项是暴力两两异或,后者即分别处理两个子集。

  设 \(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的更多相关文章

  1. Solution -「CF 1060F」Shrinking Tree

    \(\mathcal{Description}\)   Link.   给定一棵 \(n\) 个点的树,反复随机选取一条边,合并其两端两点,新点编号在两端两点等概率选取.问每个点留到最后的概率.    ...

  2. Solution -「ARC 104E」Random LIS

    \(\mathcal{Description}\)   Link.   给定整数序列 \(\{a_n\}\),对于整数序列 \(\{b_n\}\),\(b_i\) 在 \([1,a_i]\) 中等概率 ...

  3. Solution -「HDU 5498」Tree

    \(\mathcal{Description}\)   link.   给定一个 \(n\) 个结点 \(m\) 条边的无向图,\(q\) 次操作每次随机选出一条边.问 \(q\) 条边去重后构成生成 ...

  4. Solution -「Gym 102956F」Find the XOR

    \(\mathcal{Description}\)   Link.   给定 \(n\) 个点 \(m\) 条边的连通无向图 \(G\),边有边权.其中 \(u,v\) 的距离 \(d(u,v)\) ...

  5. Solution -「ARC 125F」Tree Degree Subset Sum

    \(\mathcal{Description}\)   Link.   给定含有 \(n\) 个结点的树,求非负整数对 \((x,y)\) 的数量,满足存在 \(\exist S\subseteq V ...

  6. Solution -「Gym 102798K」Tree Tweaking

    \(\mathcal{Description}\)   Link.   给定排列 \(\{p_n\}\),求任意重排 \(p_{l..r}\) 的元素后,将 \(\{p_n\}\) 依次插入二叉搜索树 ...

  7. Solution -「Gym 102759I」Query On A Tree 17

    \(\mathcal{Description}\)   Link.   给定一棵含 \(n\) 个结点的树,结点 \(1\) 为根,点 \(u\) 初始有点权 \(a_u=0\),维护 \(q\) 次 ...

  8. Solution -「国家集训队」「洛谷 P2619」Tree I

    \(\mathcal{Description}\)   Link.   给一个 \(n\) 个点 \(m\) 条边的带权无向图,边有权值和黑白颜色,求恰选出 \(K\) 条白边构成的最小生成树.    ...

  9. Solution -「ARC 101E」「AT 4352」Ribbons on Tree

    \(\mathcal{Description}\)   Link.   给定一棵 \(n\) 个点的树,其中 \(2|n\),你需要把这些点两两配对,并把每对点间的路径染色.求使得所有边被染色的方案数 ...

随机推荐

  1. yii2安装配置完成后,网页打开报错yii\web\Request::cookieValidationKey must be configured with a secret key

    下载了Yii2.0的basic版,配置好nginx之后,浏览器访问,出现如下错误: Invalid Configuration – yii\base\InvalidConfigException yi ...

  2. 自动化集成:Pipeline整合Docker+K8S

    前言:该系列文章,围绕持续集成:Jenkins+Docker+K8S相关组件,实现自动化管理源码编译.打包.镜像构建.部署等操作:本篇文章主要描述流水线集成K8S用法. 一.背景描述 分布式服务的部署 ...

  3. MATLAB中拟合算法刚入门

    %%%1.拟合问题:(做预测,主要使用的范围是样本比较小,拟合效果会好,样本比较多,拟合的效果就不是很好) 1.应用预测的场景:已经知道10年的样本,预测第11年以内的数据 2.用拟合的到关系式:样本 ...

  4. python极简教程08:对象的方法

    测试奇谭,BUG不见. 讲解之前,我先说说我的教程和网上其他教程的区别: 1 我分享的是我在工作中高频使用的场景,是精华内容: 2 我分享的是学习方法,亦或说,是指明你该学哪些.该重点掌握哪些内容: ...

  5. 刚进公司,不懂GIt工作流的我瑟瑟发抖

    前言 不懂git工作流,被辞退了! 之前在看到这句话的时候,我刚实习入职不久,瑟瑟发抖.好巧不巧,今天又看到了类似的文章讲git重要性的. 眼下,学校导师安排给我的课题组了一个新的工程项目,使用git ...

  6. 【刷题-LeetCode】147 Insertion Sort List

    Insertion Sort List Sort a linked list using insertion sort. A graphical example of insertion sort. ...

  7. Windows系统安装和office版本兼容

    MSDN, I tell you 下载windows10系统各种纯净镜像.但是还是推荐使用官网修改参数显示出下载链接,下载windows10最新版. 在最近几次重做系统中,PE工具似乎无法识别从MSD ...

  8. Spring系列4:依赖注入的2种方式

    本文内容 基于构造器的依赖注入 基于setter的依赖注入 基于构造器的依赖注入 案例 定义2个简单的bean类,BeanOne 和 BeanTwo,前者依赖后者. package com.crab. ...

  9. Cesium中级教程5 - Terrain 地形

    Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ CesiumJS支持对与水流相关的海洋.湖泊和河流以及全球高分辨 ...

  10. nodejs express异常捕获

    参考链接: http://blog.coinidea.com/web开发/nodejs-1131.html 由于nodejs是非阻塞单进程单线程的,一旦nodejs抛出异常,整个服务就会停掉.服务将会 ...