luoguP3690 【模板】Link Cut Tree (动态树)[LCT]

题目背景

动态树

题目描述

给定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。

输入输出格式

输入格式:

第1行两个整数,分别为N和M,代表点数和操作数。

第2行到第N+1行,每行一个整数,整数在[1,10^9]内,代表每个点的权值。

第N+2行到第N+M+1行,每行三个整数,分别代表操作类型和操作所需的量。

输出格式:

对于每一个0号操作,你须输出X到Y的路径上点权的Xor和。

输入输出样例

输入样例#1:
3 3 
1
2
3
1 1 2
0 1 2 
0 1 1
输出样例#1:
3
1

说明

数据范围: 


 

因为只是模板题吧。。在这里直接放上代码。。

关于LCT可以看论文:QTREE解法的一些研究

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<iostream>
  4 using namespace std;
  5 
  6 int read(){
  7     char ch;
  8     int re=0;
  9     bool flag=0;
 10     while((ch=getchar())!='-'&&(ch<'0'||ch>'9'));
 11     ch=='-'?flag=1:re=ch-'0';
 12     while((ch=getchar())>='0'&&ch<='9')  re=re*10+ch-'0';
 13     return flag?-re:re;
 14 }
 15 
 16 struct Splay{
 17     int ch[2],xr,fa;
 18     bool rev;
 19 };
 20 
 21 const int maxn=300005;
 22 
 23 int n,m,top;
 24 int val[maxn],stk[maxn];
 25 Splay T[maxn];
 26 
 27 inline void push_up(int x){  T[x].xr=T[T[x].ch[0]].xr^T[T[x].ch[1]].xr^val[x];   }
 28 
 29 inline bool isroot(int x){
 30     return T[T[x].fa].ch[0]!=x&&T[T[x].fa].ch[1]!=x;
 31 }
 32 
 33 inline void push_down(int x){
 34     if(T[x].rev){
 35         T[T[x].ch[0]].rev^=1;
 36         T[T[x].ch[1]].rev^=1;
 37         swap(T[x].ch[0],T[x].ch[1]);
 38         T[x].rev=0;
 39     }
 40 }
 41 
 42 void rot(int x){
 43     int y=T[x].fa,z=T[y].fa,l,r;
 44     if(T[y].ch[0]==x)  l=0;
 45     else  l=1;
 46     r=l^1;
 47     T[x].fa=z;
 48     if(!isroot(y))  T[z].ch[T[z].ch[1]==y]=x;
 49     T[T[x].ch[r]].fa=y;
 50     T[y].ch[l]=T[x].ch[r];
 51     T[y].fa=x;
 52     T[x].ch[r]=y;
 53     push_up(y),push_up(x);
 54 }
 55 
 56 void splay(int x){
 57     top=1;  stk[top]=x;
 58     for(int i=x;!isroot(i);i=T[i].fa)  stk[++top]=T[i].fa;
 59     for(int i=top;i;i--)  push_down(stk[i]);
 60     while(!isroot(x)){
 61         int y=T[x].fa,z=T[y].fa;
 62         if(!isroot(y)){
 63             if((T[y].ch[0]==x)^(T[z].ch[0]==y))  rot(x);
 64             else  rot(y);
 65         }
 66         rot(x);
 67     }
 68 }
 69 
 70 void acc(int x){
 71     int t=0;
 72     while(x){
 73         splay(x);
 74         T[x].ch[1]=t;
 75         push_up(x);
 76         t=x;  x=T[x].fa;
 77     }
 78 }
 79 
 80 void make_root(int x){
 81     acc(x);
 82     splay(x);
 83     T[x].rev^=1;
 84 }
 85 
 86 int find(int x){
 87     acc(x);
 88     splay(x);
 89     while(T[x].ch[0])  x=T[x].ch[0];
 90     return x;
 91 }
 92 
 93 void split(int x,int y){
 94     make_root(x);
 95     acc(y);
 96     splay(y);
 97 }
 98 
 99 void cut(int x,int y){
100     split(x,y);
101     if(T[y].ch[0]==x)  T[y].ch[0]=0,T[x].fa=0;
102 }
103 
104 void link(int x,int y){
105     make_root(x);
106     T[x].fa=y;
107 }
108 
109 int main(){
110 //    freopen("temp.in","r",stdin);
111     n=read(),m=read();
112     for(int i=1;i<=n;i++){
113         val[i]=read();
114         T[i].xr=val[i];
115     }
116     int opt,x,y,xx,yy;
117     while(m--){
118         opt=read(),x=read(),y=read();
119         switch(opt){
120             case 0:{
121                 split(x,y);
122                 printf("%d\n",T[y].xr);
123                 break;
124             }
125             case 1:{
126                 xx=find(x),yy=find(y);
127                 if(xx!=yy)  link(x,y);
128                 break;
129             }
130             case 2:{
131                 xx=find(x),yy=find(y);
132                 if(xx==yy)  cut(x,y);
133                 break;
134             }
135             case 3:{
136                 acc(x);
137                 splay(x);
138                 val[x]=y;
139                 push_up(x);
140                 break;
141             }
142         }
143     }
144     return 0;
145 }

 

转载于:https://www.cnblogs.com/ZYBGMZL/p/7376234.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354986.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java api操作hbase_通过JavaAPI使用HBase

1.准备工作(1) 启动zookeeper服务&#xff0c;我的是在本地启动zookeeper/usr/local/zookeeper/bin$ sudo zkServer.sh start(2) 启动HBase和HBase shell启动HBase:/usr/local/hbase/bin下启动start-hbase.sh启动HBase shell/usr/local/hbase/bin下终端输入hbase shell(3) 工程…

duilib入门简明教程 -- 部分bug (11) (转)

原文转自&#xff1a;http://www.cnblogs.com/Alberl/p/3344886.html 一、WindowImplBase的bug在第8个教程【2013 duilib入门简明教程 -- 完整的自绘标题栏(8)】中&#xff0c;可以发现窗口最大化之后有两个问题&#xff0c;1、最大化按钮的样式还是没变&#xff0c;正确的样式…

在考生文件夹存有JAVA3_注意:下面出现的“考生文件夹”均为%USER%在考生文件夹下存有文件名为J_网考网(Netkao.com)...

【分析解答题】注意&#xff1a;下面出现的“考生文件夹”均为%USER%在考生文件夹下存有文件名为Java_2.java文件&#xff0c;本题功能是完成点定义&#xff0c;并输出点坐标。请完善Java_2.java文件&#xff0e;并进行调试&#xff0c;使程序结果如下&#xff1a;x5 y5点的坐标…

jasperreports_JasperReports JSF插件用例系列

jasperreports这是文章系列的切入点&#xff0c;在该系列文章中&#xff0c;我将尝试介绍JasperReport JSF插件的一些用例&#xff0c;该工具的创建是为了轻松地将为JasperReports设计的业务报告集成到JSF应用程序中。 该系列中描述的所有示例都可以从JasperReports JSF插件网站…

RN 47 中的 JS 线程及 RunLoop

RCBridge 初始化时声明了一个 CADisplayLink _jsDisplayLink [CADisplayLink displayLinkWithTarget:self selector:selector(_jsThreadUpdate:)];在 _jsThreadUpdate 函数中&#xff0c;处理界面更新。这个 CADisplayLink 随后被加到 JS 线程对应的 RunLoop 中。 - (void)ad…

java nginx https_docker nginx 配置ssl,实现https

docker nginx 配置ssl&#xff0c;实现https2019-09-05 16:06:35.0nginx配置https总览在nginx配置ssl实现https&#xff0c;简单来说分为三个步骤&#xff1a;1 上传ssl证书等文件将 1_www.domain.com_bundle.crt 和 2_www.domain.com.key 上传到nginx配置文件的目录旁边。这两…

JavaScript入门几个概念

JavaScript入门几个概念 刚刚入门JavaScript的时候&#xff0c;搞懂DOM、BOM以及它们的对象document和window很有必要。 DOM是为了操作文档出现的API&#xff0c;document是它的一个对象。BOM是为了操作浏览器出现的API&#xff0c;window是它的一个对象。DOM When a web page …

微服务有麻烦吗? Lagom在这里为您提供帮助。 尝试一下!

蛋糕支持。 我们很自豪地宣布&#xff0c;新的Apache许可的微服务框架Lagom可在GitHub上使用 &#xff01; 当其他框架专注于打包和实例启动时&#xff0c;Lagom重新定义了Java开发人员构建基于微服务的应用程序的方式。 服务是异步的。 服务内通信由您管理。 流是开箱即用的。…

海思芯片硬件java加速_海思芯片直播延迟测试结果(小于100毫秒)

背景最近接触了许多客户&#xff0c;许多是做安全方面产品的客户&#xff0c;有些还涉及到jun队后勤的等等&#xff0c;他们普遍对采集延迟&#xff0c;编码延迟&#xff0c;传输延迟等都有很大关注。例如有个客户是做反狙击探测的&#xff0c;那可是与生命相关的&#xff0c;容…

java jsp登录的验证码_Java Web实现登录验证码(Servlet+jsp)

1.生成验证码图片(Servlet)importjava.awt.Color;importjava.awt.Font;importjava.awt.Graphics2D;importjava.awt.image.BufferedImage;importjava.io.IOException;importjava.util.Random;importjavax.imageio.ImageIO;importjavax.servlet.ServletException;importjavax.ser…

shrinkwrap_Java EE 6测试第二部分– Arquillian和ShrinkWrap简介

shrinkwrap在Java EE 6测试的第一部分中&#xff0c;我简要介绍了使用Glassfish嵌入式容器的EJB 3.1 Embeddable API&#xff0c;以演示如何启动该容器&#xff0c;如何在项目类路径中查找bean以及运行非常简单的集成测试。 这篇文章重点介绍Arquillian和ShrinkWrap以及为什么它…

java中三个基本框架_对于Java基础者应该如何理解Java中的三大框架!

三大框架&#xff1a;StrutsHibernateSpringJava三大框架主要用来做WEN应用。Struts主要负责表示层的显示Spring利用它的IOC和AOP来处理控制业务(负责对数据库的操作)Hibernate主要是数据持久化到数据库再用jsp的servlet做网页开发的时候有个 web.xml的映射文件&#xff0c;里面…

Apache Camel的性能调整思路

时不时地&#xff0c;我会以Camel速度较慢的说法来询问有关优化Camel应用程序的问题。 骆驼只是连接不同系统的粘合剂&#xff0c;路由引擎全都在内存中&#xff0c;并且不需要任何持久状态。 因此&#xff0c;在99&#xff05;的情况下&#xff0c;性能问题是由于其他系统的瓶…

java虚拟机源码怎么看_java虚拟机JVM第4讲:从源代码到机器码,发生了什么?

在上篇文章我们聊到&#xff0c;无论什么语言写的代码&#xff0c;其到最后都是通过机器码运行的&#xff0c;无一例外。那么对于 Java 语言来说&#xff0c;其从源代码到机器码&#xff0c;这中间到底发生了什么呢&#xff1f;这就是今天我们要聊的。如下图所示&#xff0c;编…

java构建内存池队列_池化技术(线程池、连接池、内存池等)

一、池化技术 -简单点来说&#xff0c;就是提前保存大量的资源&#xff0c;以备不时之需。对于线程&#xff0c;内存&#xff0c;oracle的连接对象等等&#xff0c;这些都是资源&#xff0c;程序中当你创建一个线程或者在堆上申请一块内存时&#xff0c;都涉及到很多系统调用&a…

java 堆大小_适当的Java堆大小的5个技巧

java 堆大小确定生产系统合适的Java堆大小不是一件容易的事。 在我的Java EE企业经验中&#xff0c;由于Java堆容量和调整不足&#xff0c;我遇到了多个性能问题案例。 本文将为您提供5个技巧&#xff0c;这些技巧可以帮助您确定当前或新生产环境的最佳Java堆大小。 这些技巧中…

jcmd:一个可以全部统治的JDK命令行工具

我在过去的几篇文章中都引用了方便的JDK工具jcmd &#xff0c;但是像我以前对jps所做的那样&#xff0c;仅专注于其实用性 。 jcmd工具是随Oracle Java 7引入的&#xff0c;在通过使用Java标识Java进程的ID &#xff08;与jps相似&#xff09;&#xff0c;获取堆转储 &#xff…

ansible-playbook实操之一键搭建lnmp+wordpress

目录 1、架构和准备&#xff1a; 2、配置nginx角色&#xff1a; 3、配置mariadb角色&#xff1a; 4、配置php角色&#xff1a; 5、配置完之后&#xff0c;写脚本调用roles 6、配置完之后浏览器搭建wordpress&#xff1a; 1、架构和准备&#xff1a; 操控节点&#xff1a;…

pivot 与 unpivot 函数是SQL05新提供的2个函数

pivot 与 unpivot 函数是SQL05新提供的2个函数 ------------------------------------------------------------------------------ pivot函数&#xff1a; create table test(id int,name varchar(20),quarter int,profile int)insert into test values(1,a,1,1000)insert i…

python SimpleHTTPServer 快速共享文件

简单介绍 通过一个python命令快速共享文件给他人。 操作步骤 1、打开cmd命令行&#xff0c;切换到需要共享文件的目录&#xff0c;执行命令 python -m SimpleHTTPServer 。 2、打开浏览器&#xff0c;在地址栏中输入http://10.10.11.164:8000或者http://localhost:8000/可以看到…