P4151 最大XOR和路径 线性基

题解见:https://www.luogu.org/problemnew/solution/P4151

其实就是找出所有环 把环上所有边异或起来得到的值扔到线性基里面

然后随便走一条从1~n的链 最后求最大异或和即可

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define LL long long
LL num[70];
bool insert(LL x) {
        for (int i = 63; i >= 0; i--)
                if ((x >> i) & 1) {
                        if (!num[i]) {
                                num[i] = x;
                                return true;
                        }
                        x ^= num[i];
                }
        return false;
}
LL query(LL x) {
        LL res = x;
        for (int i = 63; i >= 0; i--)
                if ((res ^ num[i]) > res)
                        res ^= num[i];
        return res;
}
struct edge {
        int to, next;
        LL w;
} e[200010];
int head[50010], ecnt;
inline void adde(int from, int to, LL w) {
        e[++ecnt] = (edge) {to, head[from], w}, head[from] = ecnt;
        e[++ecnt] = (edge) {from, head[to], w}, head[to] = ecnt;
}
int vis[50010];
LL del[50010];
void dfs(int u, LL res) {
        del[u] = res, vis[u] = 1;
        for (int i = head[u]; i; i = e[i].next)
                if (!vis[e[i].to])
                        dfs(e[i].to, res ^ e[i].w);
                else
                        insert(res ^ e[i].w ^ del[e[i].to]);
}
int main() {
        int n, m, a, b;
        LL c;
        scanf("%d%d", &n, &m);
        for (int i = 1; i <= m; i++)
                scanf("%d%d%lld", &a, &b, &c), adde(a, b, c);
        dfs(1, 0);
        printf("%lld\n", query(del[n]));
}

原文地址:https://www.cnblogs.com/Aragaki/p/11229205.html

时间: 2024-10-09 11:09:36

P4151 最大XOR和路径 线性基的相关文章

[WC2011]最大XOR和路径 线性基

题面 题面 题解 其实是一个很重要的套路啦. 首先我们从s到t的一个基础路径肯定是一条链,在此基础上,我们唯一可以带来一些增益的走法就是在走这条链的基础上走一些环,因为xor的特点,来回走的路都相当于没走,而只有环可以做到不往回走却能回到原点. 因此只有走环才会给原来的路线带来改变,否则走了都等于没走. 因此我们将图上所有简单环异或后的01串加入线性基. 那么对于一条指定的链,所以环可以带给它的最大增益可以用类似求最大异或和的方式来求. 所以我们还需要枚举每一条链? 其实不用. 因为所有链的起点

[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 说明 [样例说明] 根据异或的性质,将一个数异或两次便会消除影响 那么预处理所有环插入线性基中,之后随便(因为能够消除影响)找一条简单路径查询最大值即可 code: //By Menteur_Hxy #include<cstdio> #include<iostream> #include<cstring> #include

【2017西安邀请赛:A】XOR(线段树+线性基)

前言:虽然已经有很多题解了,但是还是想按自己的理解写一篇. 思路:首先分析题目 一.区间操作 —— 线段树 二.异或操作 —— 线性基 这个两个不难想,关键是下一步的技巧 “或”运算 就是两个数的二进制中,对应位 只要有1,那么就是该位结果就是 1,所以要想k“或”运算后的结果尽量大, 就需要异或出的数,各个位上的1尽量多. 线性基的操作,可以求出区间最大异或和,但是我们需要的结果是  “或”运算. 所以我们可以将 k 取反,然后把所有数在加入线性基之前,全部 “与”运算一遍,再加入线性基. 这

[HAOI2017]八纵八横 线性基

题面 题面 题解 观察到题目中的 "内陆经济环" 不好处理,因此我们把它拆成 "内陆经济链". 对于1号节点,我们创建一个它的复制节点n + 1号节点,这个节点继承1号节点的所有边,可以发现,一个1到1的内陆经济环,和一个1到n + 1的内陆经济链是等价的,因此我们只需要考虑如何在一个变化的图上维护一个点到另一个点的最大xor和即可. 观察到删边只会删去后来加入的边,所以就很好处理了,我们用线段树分治(时间分治)来维护. 具体求从1到n + 1的最大xor和的方法参

BZOJ 2115: [Wc2011] Xor 线性基

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2115 解法: 膜:http://www.cnblogs.com/ljh2000-jump/p/5869925.html 这道题要求从1到n的最大xor和路径,存在重边,允许经过重复点.重复边.那么在图上作图尝试之后就会发现,路径一定是由许多的环和一条从1到n的路径组成.容易发现,来回走是没有任何意义的,因为来回走意味着抵消.考虑这道题求得是路径xor和最大,所以必然我们要想办法处理环的情

线性基(一

1.线性基: 若干数的线性基是一组数a1,a2,...ana1,a2,...an,其中axax的最高位的11在第xx位. 通过线性基中元素xorxor出的数的值域与原来的数xorxor出数的值域相同. 2.线性基的构造法: 对每一个数pp从高位到低位扫,扫到第xx位为11时,若axax不存在,则ax=pax=p并结束此数的扫描,否则令p=pp=p   xorxor ax.ax. 3.查询: 用线性基求这组数xorxor出的最大值:从高往低扫axax,若异或上axax使答案变大,则异或. 4.判断

Xor HYSBZ - 2115 (线性基)

Xor HYSBZ - 2115 题意:给一个树,求1到n的最长路径.这里的路径定义为异或和. 线性基~~ 1 #include <bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 struct LiBase{ 5 ll a[63]; 6 //初始化 7 void init(){ 8 memset(a,0,sizeof(a)); 9 } 10 //插入 11 bool insert_(ll x){ 12 for(int

【BZOJ-2115】Xor 线性基 + DFS

2115: [Wc2011] Xor Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 2142  Solved: 893[Submit][Status][Discuss] Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 Di的无向边. 图中可能有重边或自环. Output 仅包含一个整数,表示最大

2115: [Wc2011] Xor (线性基+dfs)

2115: [Wc2011] Xor Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 5714  Solved: 2420 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2115 Description: Input: 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 Di