题目传送门

  这是个通往vjudge的虫洞

  这是个通往bzoj的虫洞

题目大意

  问点$1$到点$n$的最大异或路径。

  因为重复走一条边后,它的贡献会被消去。所以这条路径中有贡献的边可以看成是一条$1$到$n$的简单路径加上若干个环。

  因此可以找任意一条路径,然后找出所有环扔进线性基跑出最大异或和。

  但是找出所有环可能会T掉,但是仔细画图发现,并不需要找出所有环,例如:

  在上图中,你并不需找出所有的环,只用找出1 - 3 - 4 - 2和3 - 5 - 6 - 4这两个环,它们异或后就能得到环1 - 3 - 5 - 6 - 4 - 2。

  至于找这个环,可以用dfs生成树来找。当出现返祖边的时候就意味着找到了一个环。

  然后可以记一个异或的前缀和,这样就可以$O(1)$算出环上的边权的异或和。

  对于任意一条路径得到的异或和如果为$s$,那么我们只需要考虑线性基的每一位上,如果异或上它,能够使答案变大,就异或上它。

  因为线性基不能保证最大的异或和由之前扔进去的所有数得到,所以必须这么贪一下心。

  这样的正确性显然。

Code

  1. /**
  2. * bzoj
  3. * Problem#2115
  4. * Accepted
  5. * Time: 740ms
  6. * Memory: 7040k
  7. */
  8. #include <bits/stdc++.h>
  9. #ifndef WIN32
  10. #define Auto "%lld"
  11. #else
  12. #define Auto "%I64d"
  13. #endif
  14.  
  15. using namespace std;
  16. typedef bool boolean;
  17.  
  18. #define ll long long
  19.  
  20. typedef class LinearBasis {
  21. public:
  22. ll b[];
  23.  
  24. LinearBasis() { }
  25.  
  26. void insert(ll x) {
  27. for (int i = ; ~i; i--) {
  28. if (x & (1ll << i)) x ^= b[i];
  29. if (x & (1ll << i)) {
  30. b[i] = x;
  31. for (int j = i - ; ~j; j--)
  32. if (b[i] & (1ll << j))
  33. b[i] ^= b[j];
  34. for (int j = i + ; j <= ; j++)
  35. if (b[j] & (1ll << i))
  36. b[j] ^= b[i];
  37. break;
  38. }
  39. }
  40. }
  41.  
  42. ll getAns(ll ans) {
  43. for (int i = ; i <= ; i++)
  44. if ((ans ^ b[i]) > ans)
  45. ans ^= b[i];
  46. return ans;
  47. }
  48. }LinearBasis;
  49.  
  50. typedef class Edge {
  51. public:
  52. int end, next;
  53. ll w;
  54.  
  55. Edge(int end = , int next = , ll w = ):end(end), next(next), w(w){ }
  56. }Edge;
  57.  
  58. typedef class MapManager {
  59. public:
  60. int ce;
  61. int *h;
  62. Edge* es;
  63.  
  64. MapManager() { }
  65. MapManager(int n, int m):ce() {
  66. h = new int[(n + )];
  67. es = new Edge[(m + )];
  68. memset(h, , sizeof(int) * (n + ));
  69. }
  70.  
  71. void addEdge(int u, int v, ll w) {
  72. es[++ce] = Edge(v, h[u], w);
  73. h[u] = ce;
  74. }
  75.  
  76. Edge& operator [] (int p) {
  77. return es[p];
  78. }
  79. }MapManager;
  80.  
  81. int n, m;
  82. ll *xs;
  83. MapManager g;
  84. LinearBasis lb;
  85. boolean *vis;
  86.  
  87. inline void init() {
  88. scanf("%d%d", &n, &m);
  89. xs = new ll[(n + )];
  90. g = MapManager(n, m << );
  91. vis = new boolean[(n + )];
  92. ll w;
  93. for (int i = , u, v; i <= m; i++) {
  94. scanf("%d%d"Auto, &u, &v, &w);
  95. g.addEdge(u, v, w);
  96. g.addEdge(v, u, w);
  97. }
  98. }
  99.  
  100. void dfs(int p) {
  101. vis[p] = true;
  102. for (int i = g.h[p]; i; i = g[i].next) {
  103. int e = g[i].end;
  104. if (vis[e])
  105. lb.insert(xs[e] ^ xs[p] ^ g[i].w);
  106. else {
  107. xs[e] = xs[p] ^ g[i].w;
  108. dfs(e);
  109. }
  110. }
  111. }
  112.  
  113. inline void solve() {
  114. memset(vis, false, sizeof(boolean) * (n + ));
  115. xs[] = ;
  116. dfs();
  117. printf(Auto"\n", lb.getAns(xs[n]));
  118. }
  119.  
  120. int main() {
  121. init();
  122. solve();
  123. return ;
  124. }

bzoj 2115 Xor - 线性基 - 贪心的更多相关文章

  1. BZOJ 2115 Xor(线性基)

    题意:给定一个n<=50000个点m<=100000条边的无向联通图,每条边上有一个权值wi<=1e18.请你求一条从1到n的路径,使得路径上的边的异或和最大. 任意一条1到n的路径 ...

  2. BZOJ 4269: 再见Xor 线性基+贪心

    Description 给定N个数,你可以在这些数中任意选一些数出来,每个数可以选任意多次,试求出你能选出的数的异或和的最大值和严格次大值. Input 第一行一个正整数N. 接下来一行N个非负整数. ...

  3. BZOJ 2460 & 洛谷 P4570 [BJWC2011]元素 (线性基 贪心)

    题目链接: 洛谷 BZOJ 题意 给定 \(n\) 个矿石,每个矿石有编号和魔力值两种属性,选择一些矿石,使得魔力值最大且编号的异或和不为 0. 思路 线性基 贪心 根据矿石的魔力值从大到小排序. 线 ...

  4. [BZOJ 2115] Xor

    Link:https://www.lydsy.com/JudgeOnline/problem.php?id=2115 Algorithm: 此题一看到是求异或和最大问题的,立即想到使用线性基解题 最终 ...

  5. BZOJ 2115 [Wc2011] Xor ——线性基

    [题目分析] 显然,一个路径走过两边是不需要计算的,所以我么找到一条1-n的路径,然后向该异或值不断异或简单环即可. 但是找出所有简单环是相当复杂的,我们只需要dfs一遍,找出所有的环路即可,因为所有 ...

  6. BZOJ.2115.[WC2011]Xor(线性基)

    题目链接 \(Description\) 给定一张无向带边权图(存在自环和重边).求一条1->n的路径,使得路径经过边的权值的Xor和最大.可重复经过点/边,且边权和计算多次. \(Soluti ...

  7. BZOJ 2115: [Wc2011] Xor 线性基 dfs

    https://www.lydsy.com/JudgeOnline/problem.php?id=2115 每一条从1到n的道路都可以表示为一条从1到n的道路异或若干个环的异或值. 那么把全部的环丢到 ...

  8. BZOJ.2460.[BeiJing2011]元素(线性基 贪心)

    题目链接 线性基:https://blog.csdn.net/qq_36056315/article/details/79819714. \(Description\) 求一组矿石,满足其下标异或和不 ...

  9. BZOJ 3105: [cqoi2013]新Nim游戏 [高斯消元XOR 线性基]

    以后我也要用传送门! 题意:一些数,选择一个权值最大的异或和不为0的集合 终于有点明白线性基是什么了...等会再整理 求一个权值最大的线性无关子集 线性无关子集满足拟阵的性质,贪心选择权值最大的,用高 ...

随机推荐

  1. React对比Vue(一些小细节的差异)

    @1===>发现一个神奇的地方在对数组进行增加删除的时候 react中一个输入框点击enter键,然后数组push,然后渲染 <input ref='valInput' onKeyUp={ ...

  2. vue中实现浏览器的复制功能

    点击复制,就可以实现copy <p class="inline-block"> <span >{{fenxiao.appSecret}}</span& ...

  3. @AfterThrowing

    @AfterThrowing(throwing="ex", pointcut="within(com.xms.controller.*)") public vo ...

  4. webpack使用五

    一切皆模块 Webpack有一个不可不说的优点,它把所有的文件都都当做模块处理,JavaScript代码,CSS和fonts以及图片等等通过合适的loader都可以被处理. CSS webpack提供 ...

  5. LeetCode67.二进制求和

    给定两个二进制字符串,返回他们的和(用二进制表示). 输入为非空字符串且只包含数字 1 和 0. 示例 1: 输入: a = "11", b = "1" 输出: ...

  6. lumisoft.net 邮件管理系列文章 - 如何判断附件为内嵌式还是附加式

    如果要区分邮件里面的附件是内嵌图片附件还是真正的附件,那么可以通过下面代码进行判断,如果是MIME_DispositionTypes.Attachment的就是普通附件,MIME_Dispositio ...

  7. DataBase(28)

    1.数据库管理系统(DataBase Management System,DBMS):指一种操作和管理数据库的大型软件,用于建立.使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完 ...

  8. elsearch

    1. ElasticSearch是性能优化的分布式全文搜索引擎,存储数据的载体是文档(Document),它的优势在于搜索速度快和支持聚合操作,在更新文档时,基本上能够达到实时搜索.ElasticSe ...

  9. EasyUi通过POI 实现导出xls表格功能

    Spring +EasyUi+Spring Jpa(持久层) EasyUi通过POI 实现导出xls表格功能 EasyUi界面: 点击导出按钮实现数据导入到xls表格中 第一步:修改按钮事件: @Co ...

  10. python requests接口测试

    Python 标准库中的 urllib2 模块提供了你所需要的大多数 HTTP 功能,但是它的 API 太渣了.它是为另一个时代.另一个互联网所创建的.它需要巨量的工作,甚至包括各种方法覆盖,来完成最 ...