题意

筱玛是个快乐的男孩子。
寒假终于到了,筱玛决定请他的朋友们一起来玩迷阵探险。
迷阵可以看做一个的矩阵A,每个格子上有一个有一个数Ai,j。
入口在左上角的(1,1)处,出口在右下角的(n,n)处。每一步都只能向下或向右移动一格。最后能获得的经验值为初始经验e与路径上经过的所有数的权值异或和。
求筱玛最大可能获得的经验值。

思路

由于n<=20;可以考虑双向搜索。但是这是异或,所以要利用字典树,把第一次搜索的结果保存在字典树中,第二次搜索贪心的来即可。

  1. //#pragma GCC optimize(3)
  2. //#pragma comment(linker, "/STACK:102400000,102400000") //c++
  3. // #pragma GCC diagnostic error "-std=c++11"
  4. // #pragma comment(linker, "/stack:200000000")
  5. // #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
  6.  
  7. #include <algorithm>
  8. #include <iterator>
  9. #include <iostream>
  10. #include <cstring>
  11. #include <cstdlib>
  12. #include <iomanip>
  13. #include <bitset>
  14. #include <cctype>
  15. #include <cstdio>
  16. #include <string>
  17. #include <vector>
  18. #include <stack>
  19. #include <cmath>
  20. #include <queue>
  21. #include <list>
  22. #include <map>
  23. #include <set>
  24. #include <cassert>
  25.  
  26. using namespace std;
  27. #define lson (l , mid , rt << 1)
  28. #define rson (mid + 1 , r , rt << 1 | 1)
  29. #define debug(x) cerr << #x << " = " << x << "\n";
  30. #define pb push_back
  31. #define pq priority_queue
  32.  
  33. typedef long long ll;
  34. typedef unsigned long long ull;
  35. //typedef __int128 bll;
  36. typedef pair<ll ,ll > pll;
  37. typedef pair<int ,int > pii;
  38. typedef pair<int,pii> p3;
  39.  
  40. //priority_queue<int> q;//这是一个大根堆q
  41. //priority_queue<int,vector<int>,greater<int> >q;//这是一个小根堆q
  42. #define fi first
  43. #define se second
  44. //#define endl '\n'
  45.  
  46. #define OKC ios::sync_with_stdio(false);cin.tie(0)
  47. #define FT(A,B,C) for(int A=B;A <= C;++A) //用来压行
  48. #define REP(i , j , k) for(int i = j ; i < k ; ++i)
  49. #define max3(a,b,c) max(max(a,b), c);
  50. #define min3(a,b,c) min(min(a,b), c);
  51. //priority_queue<int ,vector<int>, greater<int> >que;
  52.  
  53. const ll mos = 0x7FFFFFFF; //
  54. const ll nmos = 0x80000000; //-2147483648
  55. const int inf = 0x3f3f3f3f;
  56. const ll inff = 0x3f3f3f3f3f3f3f3f; //
  57. const int mod = ;
  58. const double esp = 1e-;
  59. const double PI=acos(-1.0);
  60. const double PHI=0.61803399; //黄金分割点
  61. const double tPHI=0.38196601;
  62.  
  63. template<typename T>
  64. inline T read(T&x){
  65. x=;int f=;char ch=getchar();
  66. while (ch<''||ch>'') f|=(ch=='-'),ch=getchar();
  67. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  68. return x=f?-x:x;
  69. }
  70. /*-----------------------showtime----------------------*/
  71. const int maxn = 5e6+;
  72. int mp[][];
  73. ll ans = ;
  74. int tot = ;
  75. int n,e;
  76. int T[][maxn][];
  77.  
  78. void add(int id,int x){
  79. int rt = ;
  80. for(int i=; i>=; i--){
  81. int p = (x>>i)&;
  82. if(T[id][rt][p]==) T[id][rt][p] = ++tot;
  83. rt = T[id][rt][p];
  84. }
  85. }
  86.  
  87. void query(int id,int x){
  88. int rt = ;
  89. ll val = ;
  90. for(int i=; i>=; i--){
  91. int p = (x>>i)&;
  92. if(T[id][rt][p^]){
  93. val += (1ll<<i);
  94. rt = T[id][rt][p^];
  95. }
  96. else rt = T[id][rt][p];
  97. }
  98. ans = max(ans, val);
  99. }
  100.  
  101. void dfs1(int x,int y, ll val){
  102. if(x+y==n+){
  103. add(x,val^mp[x][y]);
  104. return ;
  105. }
  106. dfs1(x+,y,val^mp[x][y]);
  107. dfs1(x,y+,val^mp[x][y]);
  108. }
  109.  
  110. void dfs2(int x,int y, ll val){
  111. if(x+y==n+){
  112. query(x,val);
  113. return;
  114. }
  115. dfs2(x-,y,val^mp[x][y]);
  116. dfs2(x,y-,val^mp[x][y]);
  117. }
  118. int main(){
  119. scanf("%d%d", &n, &e);
  120. for(int i=; i<=n; i++){
  121. for(int j=; j<=n; j++){
  122. scanf("%d", &mp[i][j]);
  123. }
  124. }
  125.  
  126. dfs1(,,e);
  127. dfs2(n,n,);
  128. printf("%lld\n", ans);
  129. return ;
  130. }

牛客练习赛37C 筱玛的迷阵探险 双向搜索+字典树的更多相关文章

  1. 牛客2018国庆集训 DAY1 D Love Live!(01字典树+启发式合并)

    牛客2018国庆集训 DAY1 D Love Live!(01字典树+启发式合并) 题意:给你一颗树,要求找出简单路径上最大权值为1~n每个边权对应的最大异或和 题解: 根据异或的性质我们可以得到 \ ...

  2. newcoder 筱玛的迷阵探险(搜索 + 01字典树)题解

    题目描述 筱玛是个快乐的男孩子. 寒假终于到了,筱玛决定请他的朋友们一起来玩迷阵探险. 迷阵可以看做一个n×nn×n的矩阵A,每个格子上有一个有一个数Ai,j. 入口在左上角的(1,1)处,出口在右下 ...

  3. 牛客练习赛53 E-老瞎眼pk小鲜肉(思维+线段树+离线)

    前言 听说是线段树离线查询?? 做题做着做着慢慢对离线操作有点感觉了,不过也还没参透,等再做些题目再来讨论离线.在线操作. 这题赛后看代码发现有人用的树状数组,$tql$.当然能用树状数组写的线段树也 ...

  4. 牛客练习赛40 C 小A与欧拉路(树的直径)

    链接:https://ac.nowcoder.com/acm/contest/369/C 题目描述 小A给你了一棵树,对于这棵树上的每一条边,你都可以将它复制任意(可以为0)次(即在这条边连接的两个点 ...

  5. 牛客练习赛7 E 珂朵莉的数列(树状数组+爆long long解决方法)

    https://www.nowcoder.com/acm/contest/38/E 题意: 思路: 树状数组维护.从大佬那里学习了如何处理爆long long的方法. #include<iost ...

  6. 牛客练习赛22-E.简单数据结构1(扩展欧拉定理降幂 +树状数组)

    链接:E.简单数据结构1 题意: 给一个长为n的序列,m次操作,每次操作: 1.区间加 2.对于区间,查询 ,一直到- 请注意每次的模数不同.   题解:扩展欧拉定理降幂 对一个数p取log(p)次的 ...

  7. 牛客15334 Easygoing Single Tune Circulation(后缀自动机+字典树)

    传送门:Easygoing Single Tune Circulation 题意 给定n个字符串 s[i],再给出m个查询的字符串 t[i],问 t[i] 是否为某个 s[i] 循环无限次的子串. 题 ...

  8. 【并查集缩点+tarjan无向图求桥】Where are you @牛客练习赛32 D

    目录 [并查集缩点+tarjan无向图求桥]Where are you @牛客练习赛32 D PROBLEM SOLUTION CODE [并查集缩点+tarjan无向图求桥]Where are yo ...

  9. 牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 逻辑,博弈 B

    牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 https://ac.nowcoder.com/acm/contest/218/B 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 2621 ...

随机推荐

  1. tp3 的前端内置标签

    Volist 标签 volist标签通常用于查询数据集(select 方法),对于查询出来的结果数组进行遍历输出. 首先赋值: $User = M("User"); $list = ...

  2. 大型系列课程之-七夕告白之旅vbs篇

    也许,世间所有的美好的东西,都是需要仪式感的,遇到了一年一度的七夕节,怎么过这个节日,成了很多心中有爱的人关注的事情,七夕不浪漫,人间不值得,七夕,发源于中国,这个美好的节日,来自动人的神话故事传说牛 ...

  3. 【POJ - 1862】Stripies (贪心)

    Stripies 直接上中文了 Descriptions 我们的化学生物学家发明了一种新的叫stripies非常神奇的生命.该stripies是透明的无定形变形虫似的生物,生活在果冻状的营养培养基平板 ...

  4. javascript 异步请求封装成同步请求

    此方法是异步请求封装成同步请求,加上token验证,环境试用微信小程序,可以修改文件中的ajax,进行封装自己的,比如用axios等 成功码采用标准的 200 到 300 和304 ,需要可以自行修改 ...

  5. MySQL多表(理论知识总结)

    1. 多表关系    外键    foreign key    添加外键语法:    alter table 表名1 add foreign key(外键名称) references 表名2(主键名称 ...

  6. SoapSerialization——手机号码归属地

    public class MainActivity extends AppCompatActivity { private EditText etNumber; private TextView tv ...

  7. 页面元素定位-CSS元素基本定位

    基本定位 """属性定位 一 """ # #通过id # driver.find_element_by_css_selector(" ...

  8. git:将代码提交到远程仓库(码云)

    初始化 进入一个任意的文件夹(如D:\aqin_test1\) git init # 初始化,让git将这个文件夹管理起来 git add . # 收集此文件夹下的所有文件 git config -- ...

  9. 从60分到85分——SD-WAN进阶教程(下)

    本文为<从60分到85分——SD-WAN进阶教程>的下篇,上篇请跳转https://www.sdnlab.com/20683.html. (续上文)Enterprise Oriented ...

  10. 《深入理解Java虚拟机》- JVM如何进行异常处理

    一.Java异常 在程序中,错误可能产生于程序员没有预料到的各种情况,或者超出程序员可控范围的环境,例如用户的坏数据.试图打开一个不存在的文件等.为了能够及时有效地处理程序中的运行错误,Java 专门 ...