/*
暴力可以st表维护线性基, 从而复杂度两个log
实际上我们可以离线来做, 并且记录可行最右值, 就是一个log的了 */ #include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<iostream>
#define ll long long
#define mmp make_pair
#define M 300010
using namespace std;
int read() {
int nm = 0, f = 1;
char c = getchar();
for(; !isdigit(c); c = getchar()) if(c == '-') f = -1;
for(; isdigit(c); c = getchar()) nm = nm * 10 + c - '0';
return nm * f;
}
int n, m, Q, p[33], q[33], ans[M], w[M], l[M], d[M];
vector<int> note[M];
vector<pair<int, int> > to[M];
void dfs(int now, int f) {
for(int i = 0; i < to[now].size(); i++) {
int vj = to[now][i].first;
if(vj == f) continue;
d[vj] = d[now] ^ to[now][i].second;
dfs(vj, now);
}
} int main() {
n = read(), m = read(), Q = read();
for(int i = 1; i < n; i++) {
int vi = read(), vj = read(), v = read();
to[vi].push_back(mmp(vj, v));
to[vj].push_back(mmp(vi, v));
}
dfs(1, 0);
for(int i = 1; i <= m; i++) w[i] = d[read()] ^ d[read()] ^ read();
for(int i = 1; i <= Q; i++) {
ans[i] = d[read()] ^ d[read()];
l[i] = read();
note[read()].push_back(i);
}
for(int t = 1; t <= m; t++) {
int x = w[t], r = t;
for(int i = 30; i >= 0; i--) {
if((x >> i) & 1) {
if(!p[i]) {
p[i] = x, q[i] = r;
break;
}
if(q[i] < r) swap(p[i], x), swap(q[i], r);
x ^= p[i];
}
}
for(int k = 0; k < note[t].size(); k++) {
int v = note[t][k];
for(int i = 30; i >= 0; i--) if(q[i] >= l[v]) ans[v] = min(ans[v], ans[v] ^ p[i]);
}
}
for(int i = 1; i <= Q; i++) {
cout << ans[i] << "\n";
}
return 0;
}

NOIAC41 最短路(线性基)的更多相关文章

  1. [NOI.AC#41]最短路 线性基

    链接 题解 如果不加边,两个点之间的长度是唯一的(只能走最短路径),因为如果重复走,就异或掉了. 因此,先DFS预处理一下每个点到根的距离 \(d[x]\) ,那么 \(x,y\) 之间的距离为 $d ...

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

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

  3. 图论&线性基(?)(8.12)

    边没有负权,最短路最多只有n条边 很暴力的思想: 先跑一遍最短路,找出最短路上的边,枚举每条边,翻倍,放进原图再跑一遍.取最大值 好熟悉啊 分层建图,建k层 每层内部是原图 若原图中u到v有连边,则由 ...

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

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

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

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

  6. BZOJ 3105 [CQOI2013]新Nim游戏 ——线性基

    [题目分析] 神奇的题目,两人都可以第一次取走足够多堆的石子. nim游戏的规则是,如果异或和为0,那么就先手必输,否则先手有必胜策略. 所以只需要剩下一群异或和为0就可以了. 先排序,线性基扫一遍即 ...

  7. BZOJ 2460 [BeiJing2011]元素 ——线性基

    [题目分析] 线性基,由于最多有63个,只需要排序之后,动态的去维护线性基即可. [代码] #include <cstdio> #include <cstring> #incl ...

  8. Xor && 线性基练习

    #include <cstdio> #include <cstring> ; ; int cnt,Ans,b,x,n; inline int Max(int x,int y) ...

  9. 【BZOJ-4568】幸运数字 树链剖分 + 线性基合并

    4568: [Scoi2016]幸运数字 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 238  Solved: 113[Submit][Status ...

随机推荐

  1. flutter 添加插件

    打開pubspec.yaml ---> cupertino_icons 下添加插件

  2. 51单片机---点亮一个LED灯

    1 程序源码 #include <REGX52.H> `包含51单片机的头文件` sbit led = P0^0; int main(void) { while(1) { led = 1; ...

  3. es6里面的arr方法

    es6里面,关于arr的遍历以及查找,新增了很多的方法,对于不同的应用场景,运用合适的方法,可以达到事半功倍的效果: 一, arr.find():用于查找到符合条件的第一个成员,如果没有查找到的话,则 ...

  4. spring查看生成的cglib代理类源码详解

    1.让程序阻塞(抛出异常会导致程序结束,所以在抛出异常之前阻塞) 2. windows控制台 cd到jdk目录下的lib目录,找到sa-jdi.jar 执行: java -classpath sa-j ...

  5. windows云服务器发布项目

    1.tomcat安装版安装,把server.xml中”localhost“改为自己的域名.启动tomcat的时候就通过外网访问到云服务器的tomcat主页. 2.上述实现的前提是已经对域名进行解析:域 ...

  6. CentOS 7安全加固

    本次实验使用的centos 7 版本 一.查找系统中是否存在空密码账户 1.使用命令: awk -F: '($2==""){print $1}' /etc/shadow 直接查看. ...

  7. robot framework关键词记录单(更新中)

    1.select Radio Button groupname  value 选择单选按钮 A)适用于input的html单选框,属性中包含name以及value如:Select Radio Butt ...

  8. 新手入门HTML5有什么推荐的书籍?

    很多想迈入HTML5开发行列的人,都会问一个问题:要成为一个更好的开发人员,我应该读哪些书?有哪些HTML5开发的书籍推荐吗? 有人说开卷有益,读万卷书行万里路;有人说,书不在多,精益求精;有人说,书 ...

  9. python之计算机硬件基本认知_数据单位_进制间转换_数的原码反码补码

    一:计算机硬件基本认知 cpu:   中央处理器.   相当于人的大脑.运算中心,控制中心. 内存:  临时存储数据. 优点:读取速度快,缺点:容量小,造价高,断电即消失. 硬盘:  长期存储数据. ...

  10. C# System.Collections

    System.collection类: 动态数组ArrayList 代表了可被单独索引的对象的有序集合.也就是说他是一个动态的数组,你可以通过索引来进行增删改等操作,数组会自动调整数组的大小.允许在列 ...