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\). 思路 线性基交板子题,但是一直没看懂咋求,先偷一份咖啡鸡板子写篇博客吧~ 线性基交学习博客:传 ...
随机推荐
- Next.js Conf 2020
Next.js Conf 2020 Next.js Conf Ticket https://nextjs.org/conf Conf Schedule https://confs.tech/javas ...
- js debounce & throttle All In One
js debounce & throttle All In One debounce & throttle js 节流 防抖 debounce 防抖 防抖,是指一个事件触发后在单位时间 ...
- js 大数计算
js 大数计算 原理 JavaScript 安全整数 是 -253-1 ~ 253-1 ,即: -9007199254740991 ~ 9007199254740991; 换句话说,整数超过这个范围就 ...
- Electron in Action
Electron in Action $ yarn add -D electron@latest # OR $ npm i -D electron@latest https://www.electro ...
- auto scroll bottom in js
auto scroll bottom in js autoScrollToBottom() { let box = document.querySelector(`[data-dom="ch ...
- 超强嘉宾阵容——NGK Global启动大会圆满举办
近日,由星盟全球投资公司.灵石团队联合主办的NGK Global全球生态启动大会圆满开幕.大会汇集区块链领域.金融领域.密码学领域.智能算法领域等众多大咖,和NGK Global全球价值共识者共聚一堂 ...
- 工具类:每次随机生成有销售库存有实际库存的1个店铺商品和对应的2个店铺商品sku
# coding:utf-8 # @fileName :2.每次随机生成有销售库存有实际库存的1个店铺商品和对应的2个店铺商品sku.py # @createTime :2020/4/4 10:33 ...
- .net core 和 WPF 开发升讯威在线客服系统:怎样实现拔网线也不丢消息的高可靠通信(附视频)
本系列文章详细介绍使用 .net core 和 WPF 开发 升讯威在线客服与营销系统 的过程.本产品已经成熟稳定并投入商用. 在线演示环境:https://kf.shengxunwei.com 注意 ...
- MapReduce原理及简单实现
MapReduce是Google在2004年发表的论文<MapReduce: Simplified Data Processing on Large Clusters>中提出的一个用于分布 ...
- 用OkHttpGo和FastJson获取OneNET云平台数据(解析嵌套数组)
JSON数据格式有两种,一种是 { } 大括号表示的JSON对象,一种是 [ ] 中括号表示的JSON数组.从OneNET获取到的数组是这样的,并用Json解析网址查看https://jsonform ...