链接

题解

如果不加边,两个点之间的长度是唯一的(只能走最短路径),因为如果重复走,就异或掉了。

因此,先DFS预处理一下每个点到根的距离 \(d[x]\) ,那么 \(x,y\) 之间的距离为 $d[x] \oplus d[y] $

对于每条新建的边 \((u,v,w)\) ,它实际上增加了一个环,如果没有范围限制,那就变成了[WC2011]最大XOR和路径(BZOJ2115)。

按照它的思路,我们对每个环(权值为 \(W[i]=d[u[i]]\oplus d[v[i]]\oplus w[i]\))构造线性基,考虑如何保证满足范围限制

将询问离线,并根据右端点排序(挂链表),然后按顺序扫描边数组 \(W[i]\) ,对于二进制基底 \(p[i]\) ,定义 \(q[i]\) 为它的位置,显然为了满足范围限制, \(q[i]\) 越大越好。因此从大到小枚举 \(i\) ,每遇到一个 \(q[i]\) 比当前位置小的,我们将其与之交换,然后多出来的 \(p[i]\) 再往下插入线性基。

处理答案时,从高位向低位贪心,如果 \(q[i]\) 在范围内就可以加入。

  1. #include<bits/stdc++.h>
  2. #define REP(i,a,b) for(int i(a);i<=(b);++i)
  3. #define dbg(...) fprintf(stderr,__VA_ARGS__)
  4. using namespace std;
  5. typedef long long ll;
  6. typedef unsigned int uint;
  7. typedef unsigned long long ull;
  8. typedef pair<int,int>pii;
  9. template<typename T,typename U>inline char smin(T&x,const U&y){return x>y?x=y,1:0;}
  10. template<typename T,typename U>inline char smax(T&x,const U&y){return x<y?x=y,1:0;}
  11. namespace IOManager{
  12. const unsigned int iSize(131072),oSize(65536);
  13. char buf[iSize],wbuf[oSize+128],*iT=buf+iSize,*iS=iT-1,*oS=wbuf-1,*oT=wbuf+oSize;
  14. struct FastIO{
  15. inline char gc(){
  16. if(++iS==iT)fread(iS=buf,1,iSize,stdin);return *iS;
  17. }
  18. template<typename T>
  19. inline void read(T&w){register char c,p=0;
  20. while(isspace(c=gc()));if(c=='-')p=1,c=gc();w=c^48u;
  21. while(isdigit(c=gc()))w=w*10+(c^48u);if(p)w=-w;
  22. }
  23. inline int read(){register int x;return read(x),x;}
  24. inline void flush(){fwrite(wbuf,1,oS-wbuf+1,stdout);oS=wbuf-1;}
  25. ~FastIO(){flush();}
  26. inline FastIO&operator<<(const char&c){if(oS>oT)flush();*++oS=c;}
  27. inline void putstr(const string&s){
  28. const int l=s.length();
  29. if(oS>oT)flush();
  30. for(int i=0;i<l;++i)*++oS=s[i];
  31. }
  32. template<typename T>
  33. inline FastIO&operator<<(T x){
  34. static char stk[30];int top=0;
  35. if(oS>oT)flush();
  36. if(x==0)return *++oS='0',*this;
  37. if(x<0)x=-x,*++oS='-';
  38. for(;x;x/=10)stk[++top]=x%10^48;
  39. while(top)*++oS=stk[top--];
  40. return*this;
  41. }
  42. };
  43. }IOManager::FastIO io;
  44. #define read io.read
  45. const int n=read(),m=read(),Q=read(),N=3e5+5;
  46. vector<int>g[N];
  47. int head[N],tot,d[N],w[N],r[N],l[N],p[33],q[33],ans[N];
  48. struct node{int v,w,nxt;}e[N<<1];
  49. inline void add(int x,int y,int z){e[++tot]=(node){y,z,head[x]};head[x]=tot;}
  50. inline void dfs(int x,int fa){for(int i=head[x];i;i=e[i].nxt)if(e[i].v!=fa)d[e[i].v]=d[x]^e[i].w,dfs(e[i].v,x);}
  51. int main(){
  52. REP(i,2,n){
  53. int x=read(),y=read(),z=read();
  54. add(x,y,z),add(y,x,z);
  55. }
  56. dfs(1,0);
  57. REP(i,1,m)w[i]=d[read()]^d[read()]^read();
  58. REP(i,1,Q){
  59. ans[i]=d[read()]^d[read()];l[i]=read();g[read()].push_back(i);
  60. }
  61. REP(t,1,m){
  62. int x=w[t],r=t;
  63. for(int i=30;~i;--i)if(x>>i&1){
  64. if(!p[i]){p[i]=x,q[i]=r;break;}
  65. if(q[i]<r)swap(p[i],x),swap(q[i],r);
  66. x^=p[i];
  67. }
  68. for(int k:g[t])for(int i=30;~i;--i)if(q[i]>=l[k])smin(ans[k],ans[k]^p[i]);
  69. }
  70. REP(i,1,Q)io<<ans[i]<<'\n';
  71. return 0;
  72. }

[NOI.AC#41]最短路 线性基的更多相关文章

  1. NOIAC41 最短路(线性基)

    /* 暴力可以st表维护线性基, 从而复杂度两个log 实际上我们可以离线来做, 并且记录可行最右值, 就是一个log的了 */ #include<cstdio> #include< ...

  2. BZOJ_2844 albus就是要第一个出场 【线性基】

    一.题目 albus就是要第一个出场 二.分析 非常有助于理解线性基的一题. 构造线性基$B$后,如果$|A| > |B|$,那么就意味着有些数可以由$B$中的数异或出来,而多的数可以取或者不取 ...

  3. BZOJ_2115 [Wc2011] Xor 【图上线性基】

    一.题目 [Wc2011] Xor 二.分析 比较有意思的一题,这里也学到一个结论:$1$到$N$的任意一条路径异或和,可以是一个任意一条$1$到$N$的异或和与图中一些环的异或和组合得到.因为一个数 ...

  4. HDU_3949 XOR 【线性基】

    一.题目 XOR 二.分析 给定$N$个数,问它的任意子集异或产生的数进行排列,求第K小的数. 构造出线性基$B$后,如果$|B| < N$,那么代表N个数中有一个数是可以由线性基中的其他数异或 ...

  5. BZOJ 2844 albus就是要第一个出场 ——高斯消元 线性基

    [题目分析] 高斯消元求线性基. 题目本身不难,但是两种维护线性基的方法引起了我的思考. void gauss(){ k=n; F(i,1,n){ F(j,i+1,n) if (a[j]>a[i ...

  6. SCOI2016幸运数字(树剖/倍增/点分治+线性基)

    题目链接 loj luogu 题意 求树上路径最大点权异或和 自然想到(维护树上路径)+ (维护最大异或和) 那么有三种方法可以选择 1.树剖+线性基 2.倍增+线性基 3.点分治+线性基 至于线性基 ...

  7. ACM-ICPC 2017 Asia Xi'an A XOR (线性基+线段树思想)

    题目链接 题意;给个数组,每次询问一个区间你可以挑任意个数的数字异或和 然后在或上k的最大值 题解:线性基不知道的先看这个,一个线性基可以log的求最大值把对应去区间的线性基求出来然后用线段树维护线性 ...

  8. Codeforces 938G Shortest Path Queries [分治,线性基,并查集]

    洛谷 Codeforces 分治的题目,或者说分治的思想,是非常灵活多变的. 所以对我这种智商低的选手特别不友好 脑子不好使怎么办?多做题吧-- 前置知识 线性基是你必须会的,不然这题不可做. 推荐再 ...

  9. 51Nod1577 异或凑数 线性基 构造

    国际惯例的题面:异或凑出一个数,显然是线性基了.显然我们能把区间[l,r]的数全都扔进一个线性基,然后试着插入w,如果能插入,则说明w不能被这些数线性表出,那么就要输出"NO"了. ...

随机推荐

  1. Nutch1.6学习笔记

    回 到 目 录 暑假每天傍晚或晚上更新 伪恋赛高 这里提供nutch1.6的src下载: apache-nutch-1.6-src.zip 115网盘礼包码:5lbcymlo6u76http://11 ...

  2. SQL Server数据全同步及价值分析[终结版]

    SQL Server数据全同步[终结版] 版权全部.转载请注明出处.谢谢! 经过两天的同步编写和測试.出了第一个Release版本号: 1. 本函数仅支持单向同步.即从一个主数据库想多个从数据库同步 ...

  3. Ubuntu 16.04/18.04 LTS改变时区和语言

    Ubuntu 16.04/18.04 LTS改变Timezone时区设定原文 https://www.phpini.com/linux/ubuntu-16-04-change-timezone-set ...

  4. 弯道超车,换一个思路,避免addEventListener为同一个元素重复赋予事件

    addEventListener可以给同一个元素赋予多次同一个事件. 执行一次,就多一次事件效果.这不是我想要的. window.onload = function(){ var box = docu ...

  5. eclipse C开发添加自己的头文件搜索路径

    eclipse编译C程序时提示: ..\src\main.c:8:21: fatal error: my_type.h: No such file or directory 如图: 需要添加自己的头文 ...

  6. TYVJ 1935 拆点网络流

    思路: 就是一个多重匹配 把每个防御塔拆成 拆成第j次 发射的导弹 跑个网络流 //By SiriusRen #include <cmath> #include <queue> ...

  7. XML结构,写到TreeView树上

    http://blog.csdn.net/ztzi321/article/details/44077563

  8. 用json2.js 代替 json.js防止与jQuery的js冲突

    用json2.js 代替 json.js防止与jQuery的js冲突 1 s.toJSONString json.js:259 2 Object.toJSONString json.js:158 3 ...

  9. OpenCV中Mat数据的访问报错

    最近再写一段程序的时候,要访问Mat中的元素.在定义Mat型数据的时候,用 Mat ObjectPoints(48,3,CV_32FC1,0) 对其进行初始化后,用at进行访问时报内存错误. Mat ...

  10. Tensorlfow学习笔记----collection

    本文来源:http://blog.csdn.net/u012436149/article/details/53894354 tensorflow  之  collection tensorflow的c ...