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,一经查实,立即删除!

相关文章

python爬虫多进程_Python爬虫技术--基础篇--多进程

要让Python程序实现多进程(multiprocessing)&#xff0c;我们先了解操作系统的相关知识。Unix/Linux操作系统提供了一个fork()系统调用&#xff0c;它非常特殊。普通的函数调用&#xff0c;调用一次&#xff0c;返回一次&#xff0c;但是fork()调用一次&#xff0c;返回两次&am…

java 电力系统_算法java实现--动态规划--电路布线问题

/** dianlubuxian.java* Version 1.0.0* Created on 2017年11月30日* Copyright ReYo.Cn*/package reyo.sdk.utils.test.dy;/*** 创 建 人&#xff1a;AdministratorReyoAut * 创建时间&#xff1a;2017年11月30日 下午4:58:56** author ReYo* version 1.0*//*** 电路布线问题(…

百度图片网址

http://qcloud.dpfile.com/pc/jPAgaVMWC7zueHYEzky7IUJs0w6QIgvTQ0p08wxCK1OUDUk6-KqvLg70OVUXtjEHTYGVDmosZWTLal1WbWRW3A.jpg转载于:https://www.cnblogs.com/leshen/p/7387677.html

antlr idea 入门_ANTLR:入门

antlr idea 入门这篇文章使您了解ANTLR的基础知识。 以前&#xff0c;我们已经了解了如何将ANTLR设置为外部工具。 在这里&#xff1a; ANTLR外部工具 :) 所以&#xff0c;我们开始…。 什么是ANTLR&#xff1f; •另一个语言识别工具&#xff0c;是一种语言工具&#xff0c;它…

typescript主键自增长

常见的不重复id创建方式有两种&#xff0c;一个是搞一个自增长数列&#xff0c;另一个是采用随机生成一组不可能重复的字符序列&#xff0c;常见的就是UUID了。我们来引入一个uuid的包&#xff1a;npm i --save angular2-uuid&#xff0c;由于这个包中已经含有了用于typescript…

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) 工程…

SPOJ QTREE5 lct

题目链接 对于每一个节点&#xff0c;记录这个节点所在链的信息&#xff1a; ls:&#xff08;链的上端点&#xff09;距离链内部近期的白点距离 rs:&#xff08;链的下端点&#xff09;距离链内部近期的白点距离 注意以上都是实边 虚边的信息用一个set维护。 set维护的是…

Java EE 8 MVC:使用路径参数

在上一篇文章中&#xff0c;我们看到了如何在Java EE MVC中使用查询参数 。 这篇文章继续与一个非常相似的主题&#xff1a;路径参数。 路径参数是请求路径的动态部分&#xff0c;可以使用Path注释指定。 例如&#xff1a; Controller Path("path-params") public…

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配置文件的目录旁边。这两…

Java EE 8 MVC:使用表单参数

在前两篇文章中&#xff0c;我们了解了如何在即将到来的Java EE MVC框架中使用查询和路径参数 。 这篇文章重点介绍表单参数。 当您使用发布请求提交Web表单时&#xff0c;表单值将作为请求正文的一部分发送。 媒体类型&#xff08;或内容类型&#xff09;定义了用于在请求正文…

Elasticsearch索引自动删除

简介 脚本分2部分&#xff0c;1部分查找符合条件的索引名&#xff0c;2脚本调用1脚本&#xff0c;进行删除操作 脚本 查找符合条件的&#xff0c;默认大于30天 # coding:utf-8__author__ Jipu FANGfrom elasticsearch import Elasticsearch import re import time import dat…

JavaScript入门几个概念

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

idea中使用osgi_OSGi环境中的Servlet基本身份验证

idea中使用osgi您首先需要获得对OSGI HTTP Service的引用。 您可以通过声明性服务来做到这一点。 这篇文章将集中在获得对HTTP服务的引用之后的步骤。 注意&#xff1a;此职位的完整课程位于此处 通过OSGI HTTP Service注册Servlet时&#xff0c;它为您提供了提供HTTPContext实…

java spring aop 注解包_Spring AOP 注解配置实例

Spring AOP注解例子一&#xff1a;导入相关jar包。首先导入Spring的相关包(这里就不多说了&#xff0c;我这里是3.2.4版本的)然后导入AOP注解的相关包(不是spring的包)aspectjrt-1.6.7.jar和aspectjweaver-1.6.8.jar和aopalliance.jar(注意这里最好是1.6.7以上的版本&#xff0…

email

163邮件发送 private void SendEmail(string content){SmtpClient mSmtpClient new SmtpClient();mSmtpClient.Host "smtp.163.com";mSmtpClient.Port 25;mSmtpClient.UseDefaultCredentials true;mSmtpClient.EnableSsl false;var mSenderUsername "abc&q…

java web 有哪些标签库_java web中jsp常用标签

在jsp页面开发过程中&#xff0c;经常需要使用JSTL(Java Server Pages Standard Tag Library)标签开开发页面&#xff0c;是看起来更加的规整舒服。JSTL主要提供了5大类标签库:1. 核心标签库: 为日常任务提供通用支持,如显示和设置变量,重复使用一组项目,测试条件以及其他操作(…