UOJ207 共价大爷游长沙

考虑到路径是有向的,不是很好维护。
如果路径无向的话,可以直接转化为链加和查询操作。
既然有向的话,不妨考虑一波hash。
对于一组询问x,y,可以把树划分为两颗子树。
合法显然需要满足
x子树的起点的hash=y子树的终点的hash
x子树的终点的hash=y子树的起点的hash
直接用LCT维护一个异或hash即可。

#include<iostream>
#include<cctype>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<ctime>
#include<cstdlib>
#include<algorithm>
#define N 330000
#define L 300000
#define eps 1e-7
#define inf 1e9+7
#define db double
#define ll long long
#define ldb long double
using namespace std;
inline int read()
{char ch=0;int x=0,flag=1;while(!isdigit(ch)){ch=getchar();if(ch=='-')flag=-1;}while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*flag;
}
#define lson son[x][0]
#define rson son[x][1] 
struct lnk{int x,y,z;}p[N];
int va[N],vb[N],sa[N],sb[N],sa_[N],sb_[N],f[N],st[N],flag[N],son[N][2];
bool get(int x){return son[f[x]][1]==x;}
bool isroot(int x){return (son[f[x]][0]!=x)&&(son[f[x]][1]!=x);}
void pushup(int x)
{sa[x]=sa[lson]^sa[rson]^sa_[x]^va[x];sb[x]=sb[lson]^sb[rson]^sb_[x]^vb[x];
}
void update(int x){flag[x]^=1;swap(lson,rson);}
void pushdown(int x){if(!flag[x])return;if(lson)update(lson);if(rson)update(rson);flag[x]=0;}
void rotate(int x)
{int y=f[x],z=f[y],tx=get(x),ty=get(y),p=son[x][!tx];if(!isroot(y))son[z][ty]=x;son[x][!tx]=y;son[y][tx]=p;if(p)f[p]=y;f[y]=x;f[x]=z;pushup(y);pushup(x);
}
void splay(int x)
{int cnt=0,tmp=x;st[++cnt]=x;while(!isroot(x))st[++cnt]=f[x],x=f[x];for(int i=cnt;i>=1;i--)pushdown(st[i]);x=tmp;while(!isroot(x)){int y=f[x];if(!isroot(y))rotate(get(x)==get(y)?y:x);rotate(x);}pushup(x);
}
void access(int x)
{for(int y=0;x;y=x,x=f[x]){splay(x);sa_[x]^=sa[rson];sb_[x]^=sb[rson];rson=y;sa_[x]^=sa[rson];sb_[x]^=sb[rson];pushup(x);}
}
void makeroot(int x){access(x);splay(x);update(x);}
void link(int x,int y)
{makeroot(x);access(y);splay(y);f[x]=y;sa_[y]^=sa[x];sb_[y]^=sb[x];pushup(y);
}
void cut(int x,int y)
{makeroot(x);access(y);splay(y);f[x]=son[y][0]=0;pushup(y);
}
void add1(int x,int k){makeroot(x);va[x]^=k;pushup(x);}
void add2(int x,int k){makeroot(x);vb[x]^=k;pushup(x);}
int rng(){int x=0;for(int i=0;i<=30;i++)x^=(rand()%2)<<i;return x;}
int main()
{srand(time(0));read();int n=read(),m=read(),cnt=0,s=0;for(int i=1;i<n;i++){int x=read(),y=read();link(x,y);}for(int i=1;i<=m;i++){int flag=read();if(flag==1){int x,y;x=read();y=read();cut(x,y);x=read();y=read();link(x,y);}if(flag==2){cnt++;p[cnt].x=read();p[cnt].y=read();p[cnt].z=rng();add1(p[cnt].x,p[cnt].z);add2(p[cnt].y,p[cnt].z);s^=p[cnt].z;}if(flag==3){int k=read();add1(p[k].x,p[k].z);add2(p[k].y,p[k].z);s^=p[k].z;}if(flag==4){int x=read(),y=read();makeroot(x);access(y);int a=sa_[y]^va[y],b=sb_[y]^vb[y]; if((a^b)==s)printf("YES\n");else printf("NO\n");}}return 0;
}

转载于:https://www.cnblogs.com/Creed-qwq/p/10354399.html

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

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

相关文章

mysql select null 0,查询值中为NULL,在MySQL中产生0.00

我有一个动态编写的查询(通过Joomla的OO PHP)将一些值插入MySQL数据库.用户填写的表单上有一个字段用于金额,如果它们留空,我希望进入系统的值为NULL.我已经将错误日志中的查询写出来了;这是查询的样子&#xff1a;INSERT INTO arrc_Voucher(VoucherNbr,securityCode,sequentia…

oracle adf_Oracle ADF移动世界! 你好!

oracle adf您好&#xff0c;ADF Mobile&#xff0c;世界&#xff01; 您可能已经知道... ADF Mobile在这里&#xff01; 以下是一些链接&#xff0c;这些链接会让您有宾至如归的感觉。 ADF Mobile主页&#xff1a; http://www.oracle.com/technetwork/developer-tools/adf/o…

线段树||BZOJ1593: [Usaco2008 Feb]Hotel 旅馆||Luogu P2894 [USACO08FEB]酒店Hotel

题面&#xff1a;P2894 [USACO08FEB]酒店Hotel 题解&#xff1a;和基础的线段树操作差别不是很大&#xff0c;就是在传统的线段树基础上多维护一段区间最长的合法前驱&#xff08;h_&#xff09;&#xff0c;最长合法后驱&#xff08;t_&#xff09;&#xff0c;一段中最长的合…

Linux内存管理详解

前一段时间看了《深入理解Linux内核》对其中的内存管理部分花了不少时间&#xff0c;但是还是有很多问题不是很清楚&#xff0c;最近又花了一些时间复习了一下&#xff0c;在这里记录下自己的理解和对Linux中内存管理的一些看法和认识。 我比较喜欢搞清楚一个技术本身的发展历程…

JavaOne 2016 Essentials:7个您不容错过的事件和会话

参加JavaOne吗&#xff1f; 确保您不会错过这些活动 又到了每年的这个时候。 旧金山一年一度的Java假期即将来临&#xff0c;全市发生了超过400场会议和活动。 由于所有这些内容和新体验都一次发生&#xff0c;因此很容易就无法跟踪正在发生的事情。 在这篇文章中&#xff0c…

任务18:控制反转

控制反转 实现你的依赖&#xff0c;采用什么依赖&#xff0c;不由你自己决定&#xff0c;这个控制交给IOC容器。 这里所有的实现都不由你自己决定&#xff0c;我们只需要传给你就可以了。谁来传呢&#xff1f;容器来传给他 内存的Repository&#xff0c;这里实现的比较简单。 这…

程序的重定位问题(程序装入)

在多道程序环境下&#xff0c;要使程序运行&#xff0c;必须先为程序创建进程。而创建进程的第一件事就是&#xff1a;将程序和数据装入内存。如何将一个用户源程序变成可在内存中执行的程序&#xff0c;通常都要进过几个步骤&#xff1a;1.编译&#xff1a;由compiler将源程序…

matlab频响优化,MATLAB中关于频响图函数最优化的程序问题

我是一名大四的学生,现在正在做毕业设计,因MATLAB从未学过,也是边学边做,我需要求出IGv函数的频率响应图,因IGv的表达式很复杂,这里我没列出,在下面的程序中有的,以下是我的程序,请高手帮我看看程序有什么问题哈,万分感谢!%%igmax is global maximumIgmin1000000000;%%exmperim…

杂项-事务:OLTP(联机事务处理过程)

ylbtech-杂项-事务&#xff1a;OLTP&#xff08;联机事务处理过程&#xff09;On-Line Transaction Processing联机事务处理过程(OLTP)也称为面向交易的处理过程&#xff0c;其基本特征是前台接收的用户数据可以立即传送到计算中心进行处理&#xff0c;并在很短的时间内给出处理…

dvd管理器java,简单DVD管理-java练习题

问题描述为某音像店开发一个迷你DVD管理器&#xff0c;最多可存6张DVD,实现碟片的管理。管理器具备的功能主要有&#xff1a;1、查看DVD信息。菜单选择查看功能&#xff0c;展示DVD的信息。2、新增DVD信息选择新增功能&#xff0c;根据提示输入新增的DVD名称&#xff0c;添加到…

从hello world 说程序运行机制

开篇 学习任何一门编程语言&#xff0c;都会从hello world 开始。对于一门从未接触过的语言&#xff0c;在短时间内我们都能用这种语言写出它的hello world。 然而&#xff0c;对于hello world 这个简单程序的内部运行机制&#xff0c;我相信还有很多人都不是很清楚。hello wor…

webapp支持什么数据库_数据库和Webapp安全

webapp支持什么数据库威胁模型 这是根据我网站上的快速参考页松散地讨论数据库和webapp安全的问题。 该页面变得笨拙&#xff0c;并且使读者无法轻松地与我或其他人进行交互。 威胁模型 所有安全分析必须从检查威胁模型开始。 威胁模型要求您回答四个问题&#xff1a; 我要…

开发进度3

对于将软件变为小程序上&#xff0c;还是无法成功&#xff0c;需要继续寻找相关资源学习 转载于:https://www.cnblogs.com/NCLONG/p/10419840.html

matlab排序函数 下标,MATLAB排序函数 - 小众知识

>> Amagic(3)A 8 1 63 5 74 9 2>> sort(A)ans 3 1 24 5 68 9 7>> sort(A,1)ans 3 1 24 5 68 9 7>> sort(A,2)ans 1 6 83 5 72 4 9Matlab中给一维向量排序是使用sort函数&#xff1a;sort(A)&#xff0c;排序是按升序进行的&#xff0c;其中A为待排序的…

可执行程序加载到内存的过程

在linux中&#xff0c;程序的加载&#xff0c;涉及到两个工具&#xff0c;linker 和loader。Linker主要涉及动态链接库的使用&#xff0c;loader主要涉及软件的加载。 1、 exec执行一个程序 2、 elf为现在非常流行的可执行文件的格式&#xff0c;它为程序运行划分了两个段&…

使用Apache Storm和Apache Ignite进行复杂的事件处理(CEP)

在本文中&#xff0c; “使用Apache Ignite进行高性能内存计算”一书的作者将讨论使用Apache Strom和Apache Ignite进行复杂的事件处理。 本文的一部分摘自 书 。 术语“复杂事件处理”或CEP没有广泛或高度接受的定义。 Wikipedia的以下引用可以简要描述什么是复杂事件处理&a…

【BZOJ5213】[ZJOI2018]迷宫(神仙题)

【BZOJ5213】[ZJOI2018]迷宫&#xff08;神仙题&#xff09; 题面 BZOJ洛谷 题解 首先可以很容易的得到一个\(K\)个点的答案。 构建\(K\)个点分别表示\(mod\ K\)的余数。那么点\(i\)的出边\(j\)指向\(i*mj\ mod\ K\)。容易证明这样子一定是可行的。 但是我们显然还有一部分点是…

php 合并两个数组并去重,合并两个数组 以KEY 作为键

$a array(array(ID> 2));$b array(array(ID> 5656));print_r($r);//合并两个数组 以ID值 作为键function mergeById(&$arr1,&$arr2, $keyID){$arr array();foreach($arr1 as $v) {$arr[$v[$key]] $v;}foreach($arr2 as $v){$arr[$v[$key]] isset($arr[$v[$key…

进程的创建与可执行程序的加载

一、进程试探 编程实现一个简单的shell程序 点击(此处)折叠或打开 #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<string.h> #include<sys/types.h> #define NUM 1024 int mystrtok(char *argv[], char* string) {/…

chrome面板介绍

Chrome开发者工具详解(1)&#xff1a;Elements、Console、Sources面板 Chrome 开发者工具详解(2)&#xff1a;Network 面板 Chrome开发者工具详解(3)&#xff1a;Timeline面板 Chrome 开发者工具详解(4)&#xff1a;Profiles 面板 Chrome开发者工具详解 (5)&#xff1a;Applica…