【思维题 状压dp】APC001F - XOR Tree
可能算是道中规中矩的套路题吧……
Time limit : 2sec / Memory limit : 256MB
Problem Statement
You are given a tree with N vertices. The vertices are numbered 0 through N−1, and the edges are numbered 1 through N−1. Edge i connects Vertex xi and yi, and has a value ai. You can perform the following operation any number of times:
- Choose a simple path and a non-negative integer x, then for each edge e that belongs to the path, change ae by executing ae←ae⊕x (⊕ denotes XOR).
Your objective is to have ae=0 for all edges e. Find the minimum number of operations required to achieve it.
Constraints
- 2≤N≤105
- 0≤xi,yi≤N−1
- 0≤ai≤15
- The given graph is a tree.
- All input values are integers.
题目大意
给定一个 $n$ 个节点的树,节点的标号为 $0\sim n-1$,边的标号为 $1\sim n-1$。每条边 $i$ 连接节点 $x_i$ 和 $y_i$,并且有一个权值 $a_i$。你可以进行如下的操作若干次。
- 选择一条简单路径以及一个非负整数 $x$,然后对于每条属于这条路径的边,将它的权值异或上 $x$。
你的目标是让所有边的权值变成 $0$,同时,最小化操作的次数。
题目分析
我的初步想法是考虑对路径权值按位拆分。可能是受以前做过的一道序列一维问题的影响吧,就一直朝着这个思路想下去了……这个思路的关键在于没法处理不同位的路径的合并。
考虑设计一个守恒的部分量:将每个点记点权为相连所有路径边权的异或和。这么处理的好处在于对路径(u,v)进行一次操作之后,全图只有u,v的点权改变。对于点权相同的点对,最优操作当然是直接将它们消去;于是最后剩下的点权最多只有16种。注意到点权0是没有影响的,所以处理完点权之后,再对剩下的15种点权做一遍状压dp就可以了。
//CXR的快读板子怎么这么快
1 #include<bits/stdc++.h> 2 #define Tp template<typename Ty> 3 #define Ts template<typename Ty,typename... Ar> 4 #define Reg register 5 #define RI Reg int 6 #define Con const 7 #define CI Con int& 8 #define I inline 9 #define W while 10 #define N 100000 11 #define P 15 12 #define INF 1e9 13 #define Gmin(x,y) (x>(y)&&(x=(y))) 14 const int maxn = 100035; 15 const int maxs = 1<<17; 16 17 int n,cnt,a[maxn],f[maxs],sta,ans; 18 19 class Class_FIO 20 { 21 private: 22 #define FS 100000 23 #define tc() (A==B&&(B=(A=FI)+fread(FI,1,FS,stdin),A==B)?EOF:*A++) 24 #define pc(c) (putchar(c)) 25 #define tn(x) (x<<3)+(x<<1) 26 #define D isdigit(c=tc()) 27 int T;char c,*A,*B,FI[FS],S[FS]; 28 public: 29 I Class_FIO() {A=B=FI;} 30 Tp I void read(Ty& x) {x=0;W(!D);W(x=tn(x)+(c&15),D);} 31 Tp I void write(Ty x) {W(S[++T]=x%10+48,x/=10);W(T) pc(S[T--]);} 32 Ts I void read(Ty& x,Ar&... y) {read(x),read(y...);} 33 }F; 34 int dp(int x) 35 { 36 if (!x) return 0; 37 if (f[x]!=-1) return f[x]; 38 int ret = 1e9; 39 for (int i=1; i<16; i++) 40 if (x&(1<<i)) for (int j=1; j<16; j++) 41 if ((x&(1<<j))&&i!=j) 42 ret = std::min(ret, dp(x^(1<<i)^(1<<j)^(1<<(i^j)))+1+((x&(1<<(i^j)))?1:0)); 43 f[x] = ret; 44 return ret; 45 } 46 int main() 47 { 48 F.read(n); 49 memset(f, -1, sizeof f); 50 for (int i=1; i<n; i++) 51 { 52 int x,y,z; 53 F.read(x), ++x, F.read(y), ++y, F.read(z); 54 a[x] ^= z, a[y] ^= z; 55 } 56 for (int i=1; i<=n; i++) 57 if (a[i]&&((sta>>a[i])&1)) sta ^= 1<<a[i], ++ans; 58 else if (a[i]) sta ^= 1<<a[i]; 59 printf("%d\n",ans+dp(sta)); 60 return 0; 61 }
END
转载于:https://www.cnblogs.com/antiquality/p/10392368.html
【思维题 状压dp】APC001F - XOR Tree相关推荐
- [状压dp] 蒙德里安的梦想(模板题+状压dp)
文章目录 0. 前言 1. 状压dp 模板题 0. 前言 状压 dp 就是采用二进制数保存状态,方便进行位运算操作.例如 八皇后.八数码问题也都是采用了状态压缩的思想来使用一个二进制数唯一对应集合中的 ...
- [状压dp] 最短Hamilton路径(模板题+状压dp)
文章目录 0. 前言 1. 状压dp 模板题 0. 前言 状压 dp 就是采用二进制数保存状态,方便进行位运算操作.例如 八皇后.八数码问题也都是采用了状态压缩的思想来使用一个二进制数唯一对应集合中的 ...
- 湖南多校补题 状压dp
C - Greetings! 题目链接 题目大意 给n种信,每种信wi,hi,pi 分别代表长.宽.数量. 让选择k种信封来装这些信,每个信封里装一个. 如果把w,h的信装到了x,y的信封里,那么造成 ...
- [HNOI2012]集合选数(思维构造 + 状压dp)
problem 题目链接 solution 从最小一个数 xxx 开始,将其 2x,3x2x,3x2x,3x 放入,再将 2(2x),3(2x),2(3x),3(3x)2(2x),3(2x),2(3x ...
- “景驰科技杯”2018年华南理工大学程序设计竞赛 A. 欧洲爆破(思维+期望+状压DP)...
题目链接:https://www.nowcoder.com/acm/contest/94/A 题意:在一个二维平面上有 n 个炸弹,每个炸弹有一个坐标和爆炸半径,引爆它之后在其半径范围内的炸弹也会爆炸 ...
- 【牛客 - 301哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(高年级)】小乐乐搭积木(状压dp)
题干: 小乐乐想要给自己搭建一个积木城堡. 积木城堡我们假设为n*m的平面矩形. 小乐乐现在手里有1*2,2*1两种地砖. 小乐乐想知道自己有多少种组合方案. 输入描述: 第一行输入整数n,m.(1& ...
- [状压dp] 小国王(状压dp+下标映射技巧)
文章目录 0. 前言 1. 状压dp+棋盘式(基于连通性) 0. 前言 相关: [状压dp] 蒙德里安的梦想(模板题+状压dp) 1. 状压dp+棋盘式(基于连通性) 1064. 小国王 思路: 状压 ...
- agc012E Camel and Oases(状压dp+思路题)
这题神啊.状压dp你敢信?思维难度爆表还有一堆细节要注意???orz Visjiao 原题链接:http://agc012.contest.atcoder.jp/tasks/agc012_e 大神题解 ...
- 【每日DP】day2、P1879 [USACO06NOV]Corn Fields G玉米地(状压DP模板题)难度⭐⭐⭐★
昨天的每日DP我还在写01背包,今天就到状压DP了,真刺激. P1879 [USACO06NOV]Corn Fields G 题目链接 输入 2 3 1 1 1 0 1 0 输出 9 一道简单的状压D ...
最新文章
- 清华大学 唐杰 计算机学院 怎么样,我国首位原创虚拟学生,后期希望“她”能够像人一样进行创新...
- IPC进程间通信 D-Bus(Desktop Bus)快速入门(以libdbus-glib库为例)
- semester 2 deadline from the computer science and electronic engineering
- 《数据库原理与应用》(第三版) 第8章 关系数据库理论 基础 习题参考答案
- 计算质数通过分区(Partition)提高Spark的运行性能(转载+自己理解)
- 添加jQuery方法解析url查询部分
- Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转......
- mac ---- 安装ftp服务器
- 写作的积累 —— 台词
- 零基础自学python-零基础如何自学Python并且找到工作,其实也就这3点,4点
- android图片视频图片封装,详解android 视频图片混合轮播实现
- Win11画图工具没了怎么重新安装
- 串行进位加法器电路图(logisim实现)
- Xmanager中的Xbrowser怎么使用?
- Allegro PCB Design GXL (legacy) 16.6 - 使用泪滴之后,删除泪滴导致出现的异常
- flutter下载慢
- 触动精灵和按键精灵哪个好,如何用按键精灵ios触动精灵及脚本写自动答题脚本...
- 不限流量 全网CDN图床 图床API_聚合图床
- git撤销已经提交push到master或者已经合并到master的mr
- OJ 1085 搭数字Ⅱ