BZOJ_2115 [Wc2011] Xor 【图上线性基】
一、题目
二、分析
比较有意思的一题,这里也学到一个结论:$1$到$N$的任意一条路径异或和,可以是一个任意一条$1$到$N$的异或和与图中一些环的异或和组合得到。因为一个数异或自己等于$0$。
对于这题,需要把所有的简单环先全部求出来,可以用$DFS$,然后用任意一条$1$到$N$的路径和的值与所有简单环的异或的值一起构造线性基(如果有不在路径上的环也没关系,可以走到这个环的位置再回来,相当于到这个环起点的这条路径走了两次,异或一下就抵消了),然后就是求最大值了。
三、AC代码
1 #include <bits/stdc++.h>
2
3 using namespace std;
4 #define ll long long
5 #define Min(a,b) ((a)>(b)?(b):(a))
6 #define Max(a,b) ((a)>(b)?(a):(b))
7 const int maxn = 5e4 + 13;
8 const int MAXL = 60;
9
10 struct edge
11 {
12 int to, rev;
13 ll cost;
14 edge(){}
15 edge(int to, ll cost, int rev){
16 this->to = to;
17 this->cost = cost;
18 this->rev = rev;
19 }
20 };
21 vector<edge> G[maxn];
22 ll sum[maxn], ans[maxn<<3], base[MAXL + 2];
23 int cnt;
24 bool flag[maxn];
25
26 void dfs(int s, int rev)
27 {
28 flag[s] = 1;
29 for(int i = 0; i < G[s].size(); i++) {
30 edge e = G[s][i];
31 if(rev != i) {
32 if(!flag[e.to]) {
33 sum[e.to] = sum[s]^e.cost;
34 dfs(e.to, e.rev);
35 }
36 else {
37 //记录环的异或值
38 ans[cnt++] = sum[e.to]^sum[s]^e.cost;
39 }
40 }
41 }
42 }
43
44 void getbase()
45 {
46 memset(base, 0, sizeof(base));
47 for(int i = 0; i < cnt; i++) {
48 for(int j = MAXL; j >= 0; j--) {
49 if( (ans[i]>>j) & 1) {
50 if(base[j]) {
51 ans[i] = ans[i]^base[j];
52 }
53 else {
54 base[j] = ans[i];
55 for(int k = j - 1; k >= 0; k--)
56 if( (base[j]>>k) & 1)
57 base[j] ^= base[k];
58 for(int k = j + 1; k <= MAXL; k++)
59 if( (base[k]<<j) & 1)
60 base[k] ^= base[j];
61 break;
62 }
63 }
64 }
65 }
66 }
67
68 int main()
69 {
70 freopen("input.txt", "r", stdin);
71 int n, m, from, to;
72 ll D;
73 edge e;
74 scanf("%d%d", &n, &m);
75 for(int i = 0; i < m; i++) {
76 scanf("%d%d%lld", &from, &to, &D);
77 G[from].push_back(edge(to, D, G[to].size() ));
78 G[to].push_back(edge(from, D, G[from].size() - 1));
79 }
80 memset(sum, 0, sizeof(sum));
81 memset(flag, 0, sizeof(flag));
82 cnt = 0;
83 dfs(1, -1);
84 getbase();
85 ll Ans = sum[n];
86 for(int i = MAXL; i >= 0; i--) {
87 if(Ans < (Ans^base[i]) )
88 Ans ^= base[i];
89 }
90 printf("%lld\n", Ans);
91 return 0;
92 }
BZOJ_2115 [Wc2011] Xor 【图上线性基】的更多相关文章
- [WC2011]最大XOR和路径 线性基
[WC2011]最大XOR和路径 LG传送门 需要充分发掘经过路径的性质:首先注意不一定是简单路径,但由于统计的是异或值,重复走是不会被统计到的,考虑对于任意一条从\(1\)到\(n\)的路径的有效部 ...
- 洛谷P4151 [WC2011] 最大XOR和路径 [线性基,DFS]
题目传送门 最大XOR和路径 格式难调,题面就不放了. 分析: 一道需要深刻理解线性基的题目. 好久没打过线性基的题了,一开始看到这题还是有点蒙逼的,想了几种方法全被否定了.还是看了大佬的题解才会做的 ...
- [luogu4151 WC2011] 最大XOR和路径 (线性基)
传送门 输入输出样例 输入样例#1: 5 7 1 2 2 1 3 2 2 4 1 2 5 1 4 5 3 5 3 4 4 3 2 输出样例#1: 6 说明 [样例说明] 根据异或的性质,将一个数异或两 ...
- CF1101G (Zero XOR Subset)-less 线性基
传送门 既然每一次选择出来的都是一个子段,不难想到前缀和计算(然而我没有想到--) 设异或前缀和为\(x_i\),假设我们选出来的子段为\([1,i_1],(i_1,i_2],...,(i_{k-1} ...
- CodeForces - 1101G :(Zero XOR Subset)-less(线性基)
You are given an array a1,a2,…,an of integer numbers. Your task is to divide the array into the maxi ...
- P4151 最大XOR和路径 线性基
题解见:https://www.luogu.org/problemnew/solution/P4151 其实就是找出所有环 把环上所有边异或起来得到的值扔到线性基里面 然后随便走一条从1~n的链 最后 ...
- 牛客练习赛26 D xor序列 (线性基)
链接:https://ac.nowcoder.com/acm/contest/180/D 来源:牛客网 xor序列 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他 ...
- 【2017西安邀请赛:A】XOR(线段树+线性基)
前言:虽然已经有很多题解了,但是还是想按自己的理解写一篇. 思路:首先分析题目 一.区间操作 —— 线段树 二.异或操作 —— 线性基 这个两个不难想,关键是下一步的技巧 “或”运算 就是两个数的二进 ...
- 2019年牛客多校第四场 B题xor(线段树+线性基交)
题目链接 传送门 题意 给你\(n\)个基底,求\([l,r]\)内的每个基底是否都能异或出\(x\). 思路 线性基交板子题,但是一直没看懂咋求,先偷一份咖啡鸡板子写篇博客吧~ 线性基交学习博客:传 ...
随机推荐
- select(),fd_set(),fd_isset()
1. select函数 1. 用途 在编程的过程中,经常会遇到许多阻塞的函数,好像read和网络编程时使用的recv, recvfrom函数都是阻塞的函数,当函数不能成功执行的时候,程序就会一直阻塞在 ...
- PAT l2-010 排座位 【并查集】
L2-010. 排座位 时间限制 150 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位. ...
- codeforces 911D
D. Inversion Counting time limit per test 2 seconds memory limit per test 256 megabytes input standa ...
- codeforce 855B
B. Marvolo Gaunt's Ring time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- Python 相关
循环使用迭代器 Python中使用for循环时,内置容器的默认循环都是有迭代器的.使用迭代器每次只会读出一小部分到内存,不断往后next. 通常建议在没有必要的情况下不使用for key,value ...
- 51nod 1073约瑟夫环 递归公式法
约瑟夫环问题的原来描述为,设有编号为1,2,--,n的n(n>0)个人围成一个圈,从第1个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,- ...
- 问题记录 java.lang.NoClassDefFoundError: org/dom4j/DocumentException
客户端调webservice服务产生以下错误 AxisFault faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.genera ...
- LeetCode 数组分割
LeetCode 数组分割 LeetCode 数组怎么分割可以得到左右最大值的差值的最大 https://www.nowcoder.com/study/live/489/1/1 左右最值最大差 htt ...
- MongoDB Up and Going
# MongoDB Up and Going https://ide.c9.io/xgqfrms/mongodb # MongoDB 教程 https://www.runoob.com/mongodb ...
- Go 去找个对象吧
前言 我的读者中应该大部分都是 Java 从业者,不知道写 Java 这些年是否真的有找到对象? 没找到也没关系,总不能在一棵树上吊死,我们也可以来 Go 这边看看,说不定会有新发现. 开个玩笑,本文 ...