BZOJ 3282: Tree
3282: Tree
Time Limit: 30 Sec Memory Limit: 512 MB
Submit: 1714 Solved: 765
[Submit][Status][Discuss]
Description
给定N个点以及每个点的权值,要你处理接下来的M个操作。操作有4种。操作从0到3编号。点从1到N编号。
0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor和。保证x到y是联通的。
1:后接两个整数(x,y),代表连接x到y,若x到Y已经联通则无需连接。
2:后接两个整数(x,y),代表删除边(x,y),不保证边(x,y)存在。
3:后接两个整数(x,y),代表将点X上的权值变成Y。
Input
第1行两个整数,分别为N和M,代表点数和操作数。
第2行到第N+1行,每行一个整数,整数在[1,10^9]内,代表每个点的权值。
第N+2行到第N+M+1行,每行三个整数,分别代表操作类型和操作所需的量。
Output
对于每一个0号操作,你须输出X到Y的路径上点权的Xor和。
Sample Input
1
2
3
1 1 2
0 1 2
0 1 1
Sample Output
1
HINT
1<=N,M<=300000
Source
莫名其妙的红色,LCT模板题
- #include <bits/stdc++.h>
- inline int nextChar(void) {
- static const int siz = 1 << 20;
- static char buffer[siz];
- static char *head = buffer + siz;
- static char *tail = buffer + siz;
- if (head == tail)fread(head = buffer, 1, siz, stdin);
- return int(*head++);
- }
- inline int nextInt(void) {
- register int ret = 0;
- register int neg = false;
- register int bit = nextChar();
- for (; bit < 48; bit = nextChar())
- if (bit == '-')neg ^= true;
- for (; bit > 47; bit = nextChar())
- ret = ret * 10 + bit - '0';
- return neg ? -ret : ret;
- }
- const int mxn = 300005;
- int n, m, top;
- int stk[mxn];
- int val[mxn];
- int sum[mxn];
- int fat[mxn];
- int rev[mxn];
- int son[mxn][2];
- inline bool isroot(int t) {
- int f = fat[t];
- if (!f)return true;
- if (son[f][0] == t)return false;
- if (son[f][1] == t)return false;
- return true;
- }
- inline void update(int t) {
- sum[t] = val[t];
- if (son[t][0])sum[t] ^= sum[son[t][0]];
- if (son[t][1])sum[t] ^= sum[son[t][1]];
- }
- inline void push(int t) {
- rev[t] = 0;
- std::swap(son[t][0], son[t][1]);
- if (son[t][0])rev[son[t][0]] ^= 1;
- if (son[t][1])rev[son[t][1]] ^= 1;
- }
- inline void pushdown(int t) {
- for (stk[++top] = t; t; )
- stk[++top] = t = fat[t];
- for (; top; --top)
- if (rev[stk[top]])
- push(stk[top]);
- }
- inline void connect(int t, int f, int k) {
- if (t)fat[t] = f;
- if (f)son[f][k] = t;
- }
- inline void rotate(int t) {
- int f = fat[t];
- int g = fat[f];
- int s = son[f][1] == t;
- connect(son[t][!s], f, s);
- connect(f, t, !s);
- fat[t] = g;
- if (g && son[g][0] == f)son[g][0] = t;
- if (g && son[g][1] == f)son[g][1] = t;
- update(f);
- update(t);
- }
- inline void splay(int t) {
- pushdown(t);
- while (!isroot(t)) {
- int f = fat[t];
- int g = fat[f];
- if (isroot(f))
- rotate(t);
- else {
- int a = f && son[f][1] == t;
- int b = g && son[g][1] == f;
- if (a == b)
- rotate(f), rotate(t);
- else
- rotate(t), rotate(t);
- }
- }
- }
- inline void access(int t) {
- for (int p = 0; t; p = t, t = fat[t])
- splay(t), son[t][1] = p, update(t);
- }
- inline void makeroot(int t) {
- access(t), splay(t), rev[t] ^= 1;
- }
- inline void cut(int a, int b) {
- makeroot(a), access(b), splay(b);
- if (son[b][0] == a)son[b][0] = fat[a] = 0;
- }
- inline void link(int t, int f) {
- makeroot(t), fat[t] = f;
- }
- inline int find(int t) {
- access(t), splay(t);
- while (son[t][0])
- t = son[t][0];
- return t;
- }
- signed main(void) {
- n = nextInt();
- m = nextInt();
- for (int i = 1; i <= n; ++i)
- val[i] = sum[i] = nextInt();
- for (int i = 1; i <= m; ++i) {
- int k = nextInt();
- int x = nextInt();
- int y = nextInt();
- switch (k) {
- case 0 :
- makeroot(x);
- access(y);
- splay(y);
- printf("%d\n", sum[y]);
- break;
- case 1:
- if (find(x) != find(y))
- link(x, y);
- break;
- case 2:
- if (find(x) == find(y))
- cut(x, y);
- break;
- case 3:
- access(x);
- splay(x);
- val[x] = y;
- update(x);
- break;
- }
- }
- }
@Author: YouSiki
BZOJ 3282: Tree的更多相关文章
- [BZOJ 3282] Tree 【LCT】
题目链接:BZOJ - 3282 题目分析 这道题是裸的LCT,包含 Link , Cut 和询问两点之间的路径信息. 写代码时出现的错误:Access(x) 的循环中应该切断的是原来的 Son[x] ...
- BZOJ 3282: Tree( LCT )
LCT.. -------------------------------------------------------------------------------- #include<c ...
- bzoj 3282: Tree (Link Cut Tree)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3282 题面: 3282: Tree Time Limit: 30 Sec Memory L ...
- BZOJ 3282 Tree Link-Cut-Tree(LCT)
题目大意: 给定N个点以及每一个点的权值,要你处理接下来的M个操作.操作有4种.操作从0到3编号.点从1到N编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor和.保证x到y ...
- BZOJ 3282 Tree(动态树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3282 [题目大意] 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的x ...
- BZOJ 3282 Tree ——KD-Tree
[题目分析] 明显的LCT维护连通性的题目. access的操作是比较巧妙的,可以把结点到根变成偏爱路径,而且保证了该点是链上深度最深的点. 而且需边的思想也很巧妙,保证了复杂度. 但是只能用于修改路 ...
- BZOJ 3282 Tree ——Link-Cut Tree
[题目分析] 明显的LCT维护连通性的题目. access的操作是比较巧妙的,可以把结点到根变成偏爱路径,而且保证了该点是链上深度最深的点. 而且需边的思想也很巧妙,保证了复杂度. 但是只能用于修改路 ...
- 洛谷 P3690 【模板】Link Cut Tree (动态树) || bzoj 3282: Tree
https://blog.csdn.net/saramanda/article/details/55253627 https://blog.csdn.net/CHHNZ/article/details ...
- BZOJ 2002 && BZOJ 2409 LCT && BZOJ 3282 初步练习
#include <cstdio> ; inline void Get_Int(int & x) { ; ') ch=getchar(); +ch-'; ch=getchar(); ...
随机推荐
- Spring学习(5):DI的配置
一. 一些概念 应用程序中说的依赖一般指类之间的关系. 泛化:表示类与类之间的继承关系.接口与接口之间的继承关系: 实现:表示类对接口的实现: 依赖:当类与类之间有使用关系时就属于依赖关系,不同于关 ...
- OpenFastPath(2):原生态Linux Socket应用如何移植到OpenFastPath上?
版本信息: ODP(Open Data Plane): 1.19.0.2 OFP(Open Fast Path): 3.0.0 1.存在的问题 OpenFastPath作为一个开源的用户态TCP/IP ...
- Hadoop源码阅读环境搭建(IDEA)
拿到一份Hadoop源码之后,经常关注的两件事情就是 1.怎么阅读?涉及IDEA和Eclipse工程搭建.IDEA搭建,选择源码,逐步导入即可:Eclipse可以选择后台生成工程,也可以选择IDE导入 ...
- 如何掌握 Kubernetes ?系统学习 k8s 的大纲一份
深度剖析 Kubernetes 深度剖析 k8s 如何学习 Kubernetes ?如何入门 Kubernetes? 为了帮帮初学者,2018 年 InfoQ 旗下(就是你知道的那个 InfoQ 哇) ...
- 三羊献瑞:next_permutation()
三羊献瑞 观察下面的加法算式: 祥 瑞 生 辉 + 三 羊 献 瑞------------------- 三 羊 生 瑞 气 (如果有对齐问题,可以参看[图1.jpg]) 其中,相同的汉字代 ...
- ssm-maven 所需添加的所有映射
<dependencies> <!--Mybatis依赖--> <dependency> <groupId>org.mybatis</groupI ...
- python os.walk详解
os模块大全详情 os.walkos.walk方法,主要用来遍历一个目录内各个子目录和子文件. os.walk(top, topdown=True, onerror=None, followlinks ...
- Openresty(Lua+Nginx)实践
简介: OpenResty(也称为 ngx_openresty)是一个全功能的 Web 应用服务器.它打包了标准的 Nginx 核心,很多的常用的第三方模块,以及它们的大多数依赖项. OpenRest ...
- c# bitmap和new bitmap(bitmap)及在System.Drawing.Image.get_RawFormat()报错“参数无效”
问题情境: 给picturebox赋image属性,我用一下代码,出错: Bitmap theBitmap = convertCameraData.display(rawDataArray, heig ...
- 修复webpack自动刷新页面慢的问题
新建.babelrc文件,配置如下 { "presets": [ "es2015" ], "ignore":[ "react-ro ...