3282: Tree(LCT)

3282: Tree

Time Limit: 30 Sec  Memory Limit: 512 MB
Submit: 2249  Solved: 1042
[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

3 3
1
2
3
1 1 2
0 1 2
0 1 1

Sample Output

3
1

HINT

1<=N,M<=300000

code

  1 #include<cstdio>
  2 #include<algorithm>
  3
  4 using namespace std;
  5
  6 const int N = 300100;
  7
  8 int val[N],fa[N],ch[N][2],rev[N],sum[N],st[N],top;
  9
 10 inline char nc() {
 11     static char buf[100000],*p1 = buf,*p2 = buf;
 12     return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2) ? EOF :*p1++;
 13 }
 14 inline int read() {
 15     int x = 0,f = 1;char ch=nc();
 16     for (; ch<‘0‘||ch>‘9‘; ch = nc()) if (ch == ‘-‘) f = -1;
 17     for (; ch>=‘0‘&&ch<=‘9‘; ch = nc()) x = x*10+ch-‘0‘;
 18     return x * f;
 19 }
 20 void pushup(int x) {
 21     sum[x] = sum[ch[x][1]] ^ sum[ch[x][0]] ^ val[x];
 22 }
 23 void pushdown(int x) {
 24     int l = ch[x][0],r = ch[x][1];
 25     if (rev[x]) {
 26         rev[l] ^= 1;rev[r] ^= 1;
 27         swap(ch[x][0],ch[x][1]);
 28         rev[x] ^= 1;
 29     }
 30 }
 31 bool isroot(int x) {
 32     return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;
 33 }
 34 int son(int x) {
 35     return ch[fa[x]][1]==x;
 36 }
 37 void rotate(int x) {
 38     int y = fa[x],z = fa[y],b = son(x),c = son(y),a = ch[x][!b];
 39     if (!isroot(y)) ch[z][c] = x;fa[x] = z;
 40     ch[x][!b] = y;fa[y] = x;
 41     ch[y][b] = a;if (a) fa[a] = y;
 42     pushup(y);pushup(x);
 43 }
 44 void splay(int x) {
 45     top = 0;st[++top] = x;
 46     for (int i=x; !isroot(i); i=fa[i]) st[++top] = fa[i];
 47     while (top) pushdown(st[top--]);
 48     while (!isroot(x)) {
 49         int y = fa[x];
 50         if (!isroot(y)) {
 51             if (son(x)==son(y)) rotate(y);
 52             else rotate(x);
 53         }
 54         rotate(x);
 55     }
 56 }
 57 void access(int x) {
 58     for (int t=0; x; t=x,x=fa[x]) {
 59         splay(x);ch[x][1] = t;pushup(x);
 60     }
 61 }
 62 void makeroot(int x) {
 63     access(x);
 64     splay(x);
 65     rev[x] ^= 1;
 66 }
 67 void link(int x,int y) {
 68     makeroot(x);
 69     fa[x] = y;
 70 }
 71 void cut(int x,int y) {
 72     makeroot(x);access(y);splay(y);
 73     ch[y][0] = fa[ch[y][0]] = 0;
 74 }
 75 void update(int x,int y) {
 76     makeroot(x);val[x] = y;pushup(x);
 77 }
 78 int query(int x,int y) {
 79     makeroot(x);access(y);splay(y);
 80     return sum[y];
 81 }
 82 int find(int x) {
 83     access(x);splay(x);
 84     while (ch[x][0]) x = ch[x][0];
 85     return x;
 86 }
 87 int main() {
 88     int n = read(),m = read(),opt,x,y;
 89     for (int i=1; i<=n; ++i) sum[i] = val[i] = read();
 90     while (m--) {
 91         opt = read(),x = read(),y = read();
 92         if (opt==0) printf("%d\n",query(x,y));
 93         else if (opt==1) {
 94             if (find(x)!=find(y)) link(x,y);
 95         }
 96         else if (opt==2) {
 97             if (find(x)==find(y)) cut(x,y);
 98         }
 99         else update(x,y);
100     }
101     return 0;
102 }

原文地址:https://www.cnblogs.com/mjtcn/p/8150445.html

时间: 2024-10-10 14:14:59

3282: Tree(LCT)的相关文章

BZOJ 3282 Tree(LCT)

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3282 [题目大意] 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. [题解] LCT练习题 [代码] #include <cstdi

【BZOJ2631】tree (LCT)

链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2631 终于学了LCT惹qwq (看的板是黄学长的orzzz T了很久发现窝开了个ch[MaxN][0] ,这都能编译过? 1 #include <cstdio> 2 #include <cstdlib> 3 #include <iostream> 4 #include <algorithm> 5 #define mod 51061 6 #define M

LuoguP3690 【模板】Link Cut Tree (LCT)

勉强算是结了个大坑吧或者才开始 #include <cstdio> #include <iostream> #include <cstring> #include <algorithm> #include <cmath> #define R(a,b,c) for(register int a = (b); (a) <= (c); ++(a)) #define nR(a,b,c) for(register int a = (b); (a) &

从ZOJ2114(Transportation Network)到Link-cut-tree(LCT)

[首先声明:LCT≠动态树,前者是一种数据结构,而后者是一类问题,即:LCT—解决—>动态树] Link-cut-tree(下文统称LCT)是一种强大的数据结构,不仅可以像树链剖分一样对树上的两点进行询问(权值和.权值的最值……),还可以维护森林的连通性. 学习LCT首推杨哲神犇的<QTREE解法的一些研究>,很详细地解释了LCT的概念及实现 本文则以ZOJ2114一题为例,分析LCT实现过程中的一些事项,并且力求读者对LCT有一个“不次于‘感性’的认识” 叙述过程中会直接引用论文中的术

【BZOJ】2002: [Hnoi2010]Bounce 弹飞绵羊(lct)

(BZOJ挂了,还没在BZOJ测,先是在wikioi测过了,,) 囧.在军训时立志要学lct!!!这是一道lct的裸题,只有access操作(10行都没有啊亲...缩行大法的话,我就不说了..)(link操作相当于水过),其实lct很简单..想想都有点小激动...... lct用splay维护的话,一下就写好了..但是我在写lct的时候,发现了一些我原来splay的老问题,我原来也知道了的,就是将null的ch给赋值了,因为在rot操作里没有特判,所以导致了null的孩子被赋值了,导致我的lct

2014 Multi-University Training Contest 6 Apple Tree(数学题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4925 Apple Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 176    Accepted Submission(s): 120 Problem Description I've bought an orchard an

【机器学习算法-python实现】决策树-Decision tree(1) 信息熵划分数据集

(转载请注明出处:http://blog.csdn.net/buptgshengod) 1.背景 决策书算法是一种逼近离散数值的分类算法,思路比較简单,并且准确率较高.国际权威的学术组织,数据挖掘国际会议ICDM (the IEEE International Conference on Data Mining)在2006年12月评选出了数据挖掘领域的十大经典算法中,C4.5算法排名第一.C4.5算法是机器学习算法中的一种分类决策树算法,其核心算法是ID3算法. 算法的主要思想就是将数据集依照特

Device Tree(三):代码分析【转】

转自:http://www.wowotech.net/linux_kenrel/dt-code-analysis.html Device Tree(三):代码分析 作者:linuxer 发布于:2014-6-6 16:03 分类:统一设备模型 一.前言 Device Tree总共有三篇,分别是: 1.为何要引入Device Tree,这个机制是用来解决什么问题的?(请参考引入Device Tree的原因) 2.Device Tree的基础概念(请参考DT基础概念) 3.ARM linux中和De

[LeetCode] Convert Sorted List to Binary Search Tree(分治)

Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. 方法:为了使BST高度平衡,要找链表中的中值作为当前根节点. /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) :