题目描述

某校开展了同学们喜闻乐见的阳光长跑活动。为了能“为祖国健康工作五十年”,同学们纷纷离开寝室,离开教室,离开实验室,到操场参加3000米长跑运动。一时间操场上熙熙攘攘,摩肩接踵,盛况空前。
  为了让同学们更好地监督自己,学校推行了刷卡机制。
  学校中有n个地点,用1到n的整数表示,每个地点设有若干个刷卡机。
  有以下三类事件:
  1、修建了一条连接A地点和B地点的跑道。
  2、A点的刷卡机台数变为了B。
  3、进行了一次长跑。问一个同学从A出发,最后到达B最多可以刷卡多少次。具体的要求如下:
  当同学到达一个地点时,他可以在这里的每一台刷卡机上都刷卡。但每台刷卡机只能刷卡一次,即使多次到达同一地点也不能多次刷卡。
  为了安全起见,每条跑道都需要设定一个方向,这条跑道只能按照这个方向单向通行。最多的刷卡次数即为在任意设定跑道方向,按照任意路径从A地点到B地点能刷卡的最多次数。

题解

我们可以想一下题目说的一条合法路径指的是什么,从一个点到另一个点,中间的路和环都可以走。

所以有一个想法,如果图是静态的,我们可以先边双缩点,然后倍增一下就好了。

但这个图是动态的。所以我们用一个LCT来维护这个过程。

如果我们有一条边连接的两个点原来就是联通的,我们可以把这条链缩成一个点,怎么缩呢,先把链拿出来,然后把这条链上的所有点都指向splay的顶端,然后把顶端的点和其他的点断开,然后这个LCT中只有某些点的father是不对的,所以在访问father的时候要find一下。

注意每次遍历时都要pushdown

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define ls tr[x][0]
#define rs tr[x][1]
#define father find(fa[x])
#define N 150009
using namespace std;
int bcj[N],f[N],tr[N][2],fa[N],size[N],val[N],n,m,v[N];
bool rev[N];
inline int rd(){int x=0;char c=getchar();bool f=0;while(!isdigit(c)){if(c=='-')f=1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}return f?-x:x;
}
int find(int x){return f[x]=f[x]==x?x:find(f[x]);}
int fd(int x){return bcj[x]=bcj[x]==x?x:fd(bcj[x]);}
inline bool ge(int x){return tr[father][1]==x;}
inline bool isroot(int x){return tr[father][1]!=x&&tr[father][0]!=x;}
inline void pushup(int x){size[x]=size[ls]+size[rs]+val[x];}
inline void pushdown(int x){if(rev[x]){rev[ls]^=1;rev[rs]^=1;rev[x]^=1;swap(ls,rs);}}
inline void _pushdown(int x){if(!isroot(x))_pushdown(father);pushdown(x);}
inline void rotate(int x){int y=father,o=ge(x);tr[y][o]=tr[x][o^1];fa[tr[y][o]]=y;if(!isroot(y))tr[find(fa[y])][ge(y)]=x;fa[x]=fa[y];//!!!!fa[y]=x;tr[x][o^1]=y;pushup(y);pushup(x);
}
inline void splay(int x){_pushdown(x);while(!isroot(x)){int y=father;if(isroot(y))rotate(x);else rotate(ge(y)==ge(x)?y:x),rotate(x);}
}
inline void access(int x){for(int y=0;x;y=x,x=father)splay(x),tr[x][1]=y,pushup(x);}
inline void makeroot(int x){access(x);splay(x);rev[x]^=1;}
inline void split(int x,int y){makeroot(x);access(y);splay(y);}
inline void link(int x,int y){makeroot(x);fa[x]=y;}
void dfs(int x,int rt){f[x]=rt;pushdown(x);////!!!!!!if(ls)dfs(ls,rt);if(rs)dfs(rs,rt);
}
int main(){n=rd();m=rd();int opt,x,y;for(int i=1;i<=n;++i)f[i]=i,v[i]=val[i]=rd(),bcj[i]=i;for(int i=1;i<=m;++i){opt=rd();x=rd();y=rd();if(opt==1){x=find(x);y=find(y);if(x==y)continue;int tx=fd(x),ty=fd(y);if(tx!=ty){bcj[tx]=ty;link(x,y);}else{split(x,y);dfs(y,y);val[y]+=size[tr[y][0]];tr[y][0]=0;pushup(y);}}else if(opt==2){int cha=y-v[x];v[x]=y;x=find(x);access(x);splay(x);val[x]+=cha;pushup(x);}else{x=find(x);y=find(y);if(fd(x)!=fd(y)){printf("-1\n");continue;}split(x,y);printf("%d\n",size[y]);}}return 0;
} 

转载于:https://www.cnblogs.com/ZH-comld/p/10206802.html

bzoj3959(LCT)相关推荐

  1. 2019.03.01 bzoj2555: SubString(sam+lct)

    传送门 题意简述: 要求在线支持两个操作 (1):在当前字符串的后面插入一个字符串 (2):询问字符串s在当前字符串中出现了几次?(作为连续子串) 思路: 考虑用lctlctlct来动态维护samsa ...

  2. 洛谷.4234.最小差值生成树(LCT)

    题目链接 先将边排序,这样就可以按从小到大的顺序维护生成树,枚举到一条未连通的边就连上,已连通则(用当前更大的)替换掉路径上最小的边,这样一定不会更差. 每次构成树时更新答案.答案就是当前边减去生成树 ...

  3. bzoj 4025 二分图——线段树分治+LCT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4025 线段树分治,用 LCT 维护链的长度即可.不过很慢. 正常(更快)的方法应该是线段树分 ...

  4. BZOJ2631tree——LCT

    题目描述 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2:将树中原有的 ...

  5. BZOJ 4817: [Sdoi2017]树点涂色(LCT+树剖+线段树)

    题目描述 Bob有一棵 nn 个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同. 定义一条路径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. Bob ...

  6. 【BZOJ4817】【SDOI2017】树点涂色 [LCT][线段树]

    树点涂色 Time Limit: 10 Sec  Memory Limit: 128 MB [Submit][Status][Discuss] Description Bob有一棵n个点的有根树,其中 ...

  7. UOJ #274. 【清华集训2016】温暖会指引我们前行 [lct]

    #274. [清华集训2016]温暖会指引我们前行 题意比较巧妙 裸lct维护最大生成树 #include <iostream> #include <cstdio> #incl ...

  8. 【bzoj5020】[THUWC 2017]在美妙的数学王国中畅游 泰勒展开+LCT

    题目描述 学渣小R被大学的数学课程虐得生活不能自理,微积分的成绩曾是他在教室里上的课的最低分.然而他的某位陈姓室友却能轻松地在数学考试中得到满分.为了提升自己的数学课成绩,有一天晚上(在他睡觉的时候) ...

  9. bzoj3514(LCT+主席树)

    题目描述 N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. 题解 对于一个截止时间来说,越晚的变越好. 所以我们可以维护一颗以边的序号为关键字的最大生成树,然后用主席树维 ...

最新文章

  1. 学习这么多算法到底在解决哪些问题?深度学习之外,我们要选择谁?
  2. 客户端脚本验证码总结一
  3. layui select 修改_layui修改select的值的方法
  4. 【python数据挖掘课程】二十九.数据预处理之字符型转换数值型、标准化、归一化处理
  5. np.sum() | 不同维度的数组在不同轴方向上相加
  6. 判断访问页面的设备并打开对应的网站
  7. Eclipse“ctrl+左键”链到实现类
  8. 百度定位---适配8.0限制后台定位
  9. Leetcode之路径总和II
  10. opencv:image-imageData+image-widthStep*i)[j]表达式含义
  11. winform安装包签名
  12. 电脑被流氓软件入侵?教你彻底清除
  13. 我去!微信竟然可以查出行轨迹了,预计又一波情侣要分手?
  14. 八千里路云和月,蚂蚁金服面出血,offer已拿,仰天长啸,壮怀激烈!
  15. 程序员的真实工资是多少?
  16. 浮点数二分模板---yxc
  17. (详细)CentOS 7+环境下PHP使用Imagick+ghostscript将PDF文件转为图片
  18. NLP with Python-Chapter1 language Processiong and Python--1.1 compute with Language :texts and words
  19. 提供一个免费的CSDN下载账号
  20. python3简明教程第二版答案_python入门简明教程?求最新的python简明教程,最好是python3的...

热门文章

  1. Fiddler的常用功能(Web断点调试)
  2. python牛顿法求立方根_【华为机试】求解立方根(牛顿迭代法)
  3. python函数调用的三种方式_判断python对象是否可调用的三种方式及其区别
  4. Octave(open source版的matlab)介绍Octave online的使用
  5. Python的zip
  6. 【项目实战课】AI零基础,人人免费可学!基于Pytorch的SimpleNet人脸表情识别实战...
  7. 【赠书】深入浅出Python量化交易实战
  8. 【知识星球】做作业还能赢奖金,传统图像/机器学习/深度学习尽在不言中
  9. 全球及中国数字出版产业投资产值与运营模式咨询报告2022版
  10. php smarty 源码,Smarty php源码 v3.1.39