【luogu3733】【HAOI2017】 八纵八横 (线段树分治+线性基)
Descroption
原题链接 给你一个\(n\)个点的图,有重边有自环保证连通,最开始有\(m\)条固定的边,要求你支持加边删边改边(均不涉及最初的\(m\)条边),每一次操作都求出图中经过\(1\)号点的环的抑或值的最大值,每个节点或边都可以经过多次(一条路经过多次则会被计算多次)。
Solution
\(~~~~\)好久都没发过博客了一定是我改题如蜗牛哎。对于每一次操作都要输出答案,考虑用线段树分治离线。先在图中随便弄出一颗以\(1\)为根的生成树,若之后再加了一条边\((u, ~v)~\)(这时一定成环便可以统计答案了),则在线性基插入一个\(~dis[v] ~xor ~dis[u] ~xor~ w_{u, v}\),对于三种操作,维护每条边作为该权值的起止时间,最后在线段树中统计答案就行了。这道题让我知道了我以前打的一直是假的线性基qwq %%%Rudy!!!
Code
#include <bits/stdc++.h>
#define For(i, j, k) for (register int i = j; i <= k; ++i)
#define Forr(i, j, k) for (register int i = j; i >= k; --i)
#define Travel(i, u) for (register int i = beg[u], v = to[i]; i; v = to[i = nex[i]])
using namespace std;
inline int read() {
int x = 0, p = 1; char c = getchar();
for (; !isdigit(c); c = getchar()) if (c == '-') p = -1;
for (; isdigit(c); c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
return x * p;
}
inline void File() {
freopen("luogu3733.in", "r", stdin);
freopen("luogu3733.out", "w", stdout);
}
const int N = 1e3 + 5; typedef bitset<N> BI;
int e = 1, beg[N], nex[N], to[N], n, m, q, fa[N];
BI w[N], dis[N];
inline BI get() {
static char s[N]; BI res; res.reset();
scanf("%s", s); int len = strlen(s);
For(i, 0, len - 1) res[i] = s[len - 1 - i] - '0';
return res;
}
inline void write(BI t) {
static int p;
Forr(i, N - 5, 0) if (t[i]) { p = i; break; }
Forr(i, p, 0) putchar(t[i] + '0'); puts("");
}
struct Linear_Bases {
BI p[N];
inline void insert(BI t) {
Forr(i, N - 5, 0) if (t[i]) {
if (!p[i].any()) { p[i] = t; return; }
t ^= p[i];
}
}
inline BI maxv() {
BI res; res.reset();
Forr(i, N - 5, 0) if (!res[i]) res ^= p[i];
return res;
}
} T;
struct node { int u, v, l, r; BI w; } P[N << 1]; int cnt = 0;
int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); }
inline void add(int x, int y, BI z) {
to[++ e] = y, nex[e] = beg[x], w[beg[x] = e] = z;
to[++ e] = x, nex[e] = beg[y], w[beg[y] = e] = z;
}
inline void dfs(int u, int f) {
Travel(i, u) if (v ^ f) dis[v] = dis[u] ^ w[i], dfs(v, u);
}
#define lc (rt << 1)
#define rc (rt << 1 | 1)
#define mid (l + r >> 1)
vector<int> ve[N << 2];
inline void update(int rt, int l, int r, int L, int R, int v) {
if (L <= l && r <= R) return (void) (ve[rt].push_back(v));
if (L <= mid) update(lc, l, mid, L, R, v);
if (R > mid) update(rc, mid + 1, r, L, R, v);
}
inline void query(int rt, int l, int r, Linear_Bases T) {
for (int v : ve[rt]) T.insert(dis[P[v].u] ^ dis[P[v].v] ^ P[v].w);
if (l == r) return (void) (write(T.maxv()));
query(lc, l, mid, T), query(rc, mid + 1, r, T);
}
int lst[N];
int main() {
File();
n = read(), m = read(), q = read();
For(i, 1, n) fa[i] = i;
For(i, 1, m) {
int fx, fy, u = read(), v = read(); BI z = get();
fx = find(u), fy = find(v);
if (fx ^ fy) add(u, v, z), fa[fy] = fx;
else P[++ cnt] = (node) {u, v, 0, q, z};
}
dfs(1, 0);
static char s[8]; // <--- SKT_T1_Faker's Dream Way!
for (register int i = 1, u, v, tt = 0; i <= q; ++ i) {
scanf("%s", s);
if (s[1] == 'd') {
u = read(), v = read(); BI z = get();
P[lst[++ tt] = ++ cnt] = (node) {u, v, i, q, z};
} else if (s[1] == 'h') {
v = lst[u = read()]; BI z = get(); P[v].r = i - 1;
P[lst[u] = ++ cnt] = (node) {P[v].u, P[v].v, i, q, z};
} else v = lst[u = read()], P[v].r = i - 1, lst[u] = -1;
}
For(i, 1, cnt) update(1, 0, q, P[i].l, P[i].r, i);
query(1, 0, q, T);
return 0;
}
【luogu3733】【HAOI2017】 八纵八横 (线段树分治+线性基)的更多相关文章
- LOJ 2312(洛谷 3733) 「HAOI2017」八纵八横——线段树分治+线性基+bitset
题目:https://loj.ac/problem/2312 https://www.luogu.org/problemnew/show/P3733 原本以为要线段树分治+LCT,查了查发现环上的值直 ...
- BZOJ.4184.shallot(线段树分治 线性基)
BZOJ 裸的线段树分治+线性基,就是跑的巨慢_(:з」∠)_ . 不知道他们都写的什么=-= //41652kb 11920ms #include <map> #include < ...
- $CF938G\ Shortest\ Path\ Queries$ 线段树分治+线性基
正解:线段树分治+线性基 解题报告: 传送门$QwQ$ 考虑如果只有操作3,就这题嘛$QwQ$ 欧克然后现在考虑加上了操作一操作二 于是就线段树分治鸭 首先线段树叶子节点是询问嘛这个不用说$QwQ$. ...
- 【线段树分治 线性基】luoguP3733 [HAOI2017]八纵八横
不知道为什么bzoj没有HAOI2017 题目描述 Anihc国有n个城市,这n个城市从1~n编号,1号城市为首都.城市间初始时有m条高速公路,每条高速公路都有一个非负整数的经济影响因子,每条高速公路 ...
- Codeforces 938G 线段树分治 线性基 可撤销并查集
Codeforces 938G Shortest Path Queries 一张连通图,三种操作 1.给x和y之间加上边权为d的边,保证不会产生重边 2.删除x和y之间的边,保证此边之前存在 3.询问 ...
- BZOJ4184:shallot(线段树分治,线性基)
Description 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且 让小葱 ...
- bzoj 4184 shallot——线段树分治+线性基
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4184 本来想了可持久化trie,不过空间是 nlogn (出一个节点的时候把 tot 复原就 ...
- bzoj 4184: shallot (线段树维护线性基)
题面 \(solution:\) 这一题绝对算的上是一道经典的例题,它向我们诠释了一种新的线段树维护方式(神犇可以跳过了).像这一类需要加入又需要维护删除的问题,我们曾经是遇到过的像莫对,线段树... ...
- 2017西安区域赛A / UVALive - 8512 线段树维护线性基合并
题意:给定\(a[1...n]\),\(Q\)次询问求\(A[L...R]\)的异或组合再或上\(K\)的最大值 本题是2017的西安区域赛A题,了解线性基之后你会发现这根本就是套路题.. 只要用线段 ...
随机推荐
- UnderWater+SDN论文之三
Software-Defined Underwater Acoustic Modems: Historical Review and the NILUS Approach Source: IEEE J ...
- WebPack牛刀小试
现在页面的功能和需求越来越复杂,繁复杂乱的JavaScript代码和一大堆的依赖包都需要包含在前端页面中.如果还用手动处理就有点像在现代战场上使用小米加步枪的味道了. 为了减小开发的复杂度,前端社区涌 ...
- 会议室预订系统(meeting room booking system)
一.mrbs mrbs:(meeting room booking system) 二.效果 三.models from django.db import models # Create your ...
- 软件工程(FZU2015) 赛季得分榜,第五回合
SE_FZU目录:1 2 3 4 5 6 7 8 9 10 11 12 13 积分规则 积分制: 作业为10分制,练习为3分制:alpha30分: 团队项目分=团队得分+个人贡献分 个人贡献分: 个人 ...
- (关于数据传输安全)SSH协议
这里说的不是java的SSH框架,是1995年,芬兰学者Tatu Ylonen设计的SSH协议. 有计算机网络基础的同学都知道,在网上传输的数据是可以被截取的.那么怎样才能获得安全? 一.春点行话 电 ...
- Linux 环境变量梳理
Linux中的环境变量有两种:全局变量和局部变量: 定义.访问.删除局部变量 查看全局变量 可以使用printenv或者env命令来打印所有的全局变量. 访问某一项全局变量,可以使用printenv ...
- 【kindle笔记】之 《解忧杂货店》-2018-3-13
[kindle笔记]读书记录-总 <解忧杂货店>-2018-3-13 东野的大ID加上此书的大ID,今天终于在回来天津的火车上一口气读完了. 此前在微信读书上看过这本书,只看了前一部分,感 ...
- windows中dir命令
最近想用dos命令打印指定目录下的所有文件夹的完整路径.最终发现可用dir命令来实现.在此学习下dir的各项命令. 32位win7系统上,打印帮助文档. D:\test>dir /? 显示目录中 ...
- vue二次实战
vue爬坑之路 npm uninstall 模块名(删除指定模块) https://www.cnblogs.com/wisewrong/p/6255817.html vue快速入门 https://s ...
- 《笔记》Python itertools的groupby分组数据处理
今天遇到这么一个需求,需要将这样的数据进行分组处理: [(, ), (, ), (, ), (, ), (, ), (, )] 处理之后我可能需要得到这样的结果: [(, (, , (, , (, ) ...