NOIAC41 最短路(线性基)
/*
暴力可以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 最短路(线性基)的更多相关文章
- [NOI.AC#41]最短路 线性基
链接 题解 如果不加边,两个点之间的长度是唯一的(只能走最短路径),因为如果重复走,就异或掉了. 因此,先DFS预处理一下每个点到根的距离 \(d[x]\) ,那么 \(x,y\) 之间的距离为 $d ...
- Codeforces 938G Shortest Path Queries [分治,线性基,并查集]
洛谷 Codeforces 分治的题目,或者说分治的思想,是非常灵活多变的. 所以对我这种智商低的选手特别不友好 脑子不好使怎么办?多做题吧-- 前置知识 线性基是你必须会的,不然这题不可做. 推荐再 ...
- 图论&线性基(?)(8.12)
边没有负权,最短路最多只有n条边 很暴力的思想: 先跑一遍最短路,找出最短路上的边,枚举每条边,翻倍,放进原图再跑一遍.取最大值 好熟悉啊 分层建图,建k层 每层内部是原图 若原图中u到v有连边,则由 ...
- BZOJ 2844 albus就是要第一个出场 ——高斯消元 线性基
[题目分析] 高斯消元求线性基. 题目本身不难,但是两种维护线性基的方法引起了我的思考. void gauss(){ k=n; F(i,1,n){ F(j,i+1,n) if (a[j]>a[i ...
- BZOJ 2115 [Wc2011] Xor ——线性基
[题目分析] 显然,一个路径走过两边是不需要计算的,所以我么找到一条1-n的路径,然后向该异或值不断异或简单环即可. 但是找出所有简单环是相当复杂的,我们只需要dfs一遍,找出所有的环路即可,因为所有 ...
- BZOJ 3105 [CQOI2013]新Nim游戏 ——线性基
[题目分析] 神奇的题目,两人都可以第一次取走足够多堆的石子. nim游戏的规则是,如果异或和为0,那么就先手必输,否则先手有必胜策略. 所以只需要剩下一群异或和为0就可以了. 先排序,线性基扫一遍即 ...
- BZOJ 2460 [BeiJing2011]元素 ——线性基
[题目分析] 线性基,由于最多有63个,只需要排序之后,动态的去维护线性基即可. [代码] #include <cstdio> #include <cstring> #incl ...
- Xor && 线性基练习
#include <cstdio> #include <cstring> ; ; int cnt,Ans,b,x,n; inline int Max(int x,int y) ...
- 【BZOJ-4568】幸运数字 树链剖分 + 线性基合并
4568: [Scoi2016]幸运数字 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 238 Solved: 113[Submit][Status ...
随机推荐
- Mabatis面试题
Mybatis面试题 1请写出Mybatis核心配置文件MyBatis-config.xml的内容? <?xml version="1.0" encoding="U ...
- 【转】Cookie/Session机制详解
Cookie/Session机制详解 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息 ...
- load data local to table
步骤: 1.使用show语句查找服务器上当前存在的数据库: 2.如果数据库存在,尝试访问它,之后创建表(我这里是之前创建的,所以就直接show tables) 3.将本地文件加载到表中,创建一个文本文 ...
- 2018-2019-2 20165313 《网络对抗技术》 Exp6 信息搜集与漏洞扫描
一.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 二.实践内容. (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.OS及服务版本探测. ...
- 基于Linux-3.9.4内核的GDB跟踪系统调用实验
382 + 原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/ 一.实验环境 win10 -> VMware -> Ubuntu1 ...
- P2930 [USACO09HOL]假期绘画Holiday Painting
线段树水题,考虑到只有15列,所以我们对于每一列,我们都去维护一个线段树. 现在来考虑一下修改操作,因为每次修改的时候,我们都是将黑的改成白的,白的改成黑的,所以我们对线段树的每个节点维护当前这段区间 ...
- java删除文件支持通配符
原文:https://blog.csdn.net/wdzayyt/article/details/7209530 感谢原作者 package com.covics.zfh; import java.i ...
- sql注入-推断是否存在SQL注入-加法和减法
这里我们需要区分一下数字型和字符串型: 数字型:不需要使用单引号来表示 其他类型:使用单引号来表示 综合上述,我们可以发现我们的例子是数字型的,这样我们就可以使用加法和减法来判断了. 加法,我们在参数 ...
- c# 获取 bios 序列号
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.M ...
- xmind 8 便携版:关联文件后,双击打开文件,在当前文件夹产生configuration子文件的问题解决办法
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\.xmind] @="XMind.Workbook.3" " ...