BZOJ2843 极地旅行社 LCT
欢迎访问~原文出处——博客园-zhouzhendong
去博客园看该题解
题目传送门 - BZOJ2843
题意概括
题解
本题仍然是LCT模版题。
bridge:先判断A和B是否联通,然后连边即可。
penguins:直接把A搞到付诸树根,然后修改就可以了。
excursion:先判断是否联通,然后如果不联通,那么我们走类似于cut的过程,让a成为b的左子节点且为最左子节点,那么答案就是size[a]+val[b]
代码
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cmath>
using namespace std;
const int N=30005;
int n,m;
int fa[N],son[N][2],size[N],rev[N],val[N];
bool isroot(int x){return son[fa[x]][0]!=x&&son[fa[x]][1]!=x;
}
void pushup(int x){size[x]=val[x]+size[son[x][0]]+size[son[x][1]];
}
void pushdown(int x){if (rev[x]){rev[x]=0;rev[son[x][0]]^=1;rev[son[x][1]]^=1;swap(son[x][0],son[x][1]);}
}
void pushadd(int x){if (!isroot(x))pushadd(fa[x]);pushdown(x);
}
int wson(int x){return son[fa[x]][1]==x;
}
void rotate(int x){if (isroot(x))return;int y=fa[x],z=fa[y],L=wson(x),R=L^1;if (!isroot(y))son[z][wson(y)]=x;fa[x]=z,fa[y]=x,fa[son[x][R]]=y;son[y][L]=son[x][R],son[x][R]=y;pushup(y);pushup(x);
}
void splay(int x){pushadd(x);for (int y=fa[x];!isroot(x);rotate(x),y=fa[x])if (!isroot(y))rotate(wson(x)==wson(y)?y:x);
}
void access(int x){int t=0;while (x){splay(x);son[x][1]=t;pushup(x);t=x;x=fa[x];}
}
void rever(int x){access(x);splay(x);rev[x]^=1;
}
void link(int x,int y){rever(x);fa[x]=y;
}
void cut(int x,int y){rever(x);access(y);splay(y);fa[x]=son[y][0]=0;
}
int find(int x){access(x);splay(x);while (1){pushdown(x);if (son[x][0])x=son[x][0];elsebreak;}return x;
}
int main(){scanf("%d",&n);for (int i=1;i<=n;i++){scanf("%d",&val[i]);size[i]=val[i],son[i][0]=son[i][1]=fa[i]=rev[i]=0;}scanf("%d",&m);while (m--){char op[10];int a,b;scanf("%s%d%d",op,&a,&b);if (op[0]=='b'){if (find(a)==find(b))puts("no");elseputs("yes"),link(a,b);}else if (op[0]=='p'){rever(a);val[a]=b;pushup(a);}else {if (find(a)==find(b)){rever(a);access(b);splay(b);printf("%d\n",size[son[b][0]]+val[b]);}elseputs("impossible");}}return 0;
}
转载于:https://www.cnblogs.com/zhouzhendong/p/BZOJ2843.html
BZOJ2843 极地旅行社 LCT相关推荐
- bzoj2843极地旅行社题解
bzoj2843极地旅行社题解 题目大意 有n座小岛,当中每一个岛都有若干帝企鹅. 一開始岛与岛之间互不相连.有m个操作.各自是在两个岛之间修一座双向桥,若两岛已连通则不修并输出no,若不连通就输出y ...
- bzoj2843极地旅行社
bzoj2843极地旅行社 题意: 一些点,每个点有一个权值.有三种操作:点与点连边,单点修改权值,求两点之间路径上点的权值和(需要判输入是否合法) 题解: 以前一直想不通为什么神犇们的模板中LCT在 ...
- BZOJ2843 - 极地旅行社
Portal Description 给出\(n(n\leq3\times10^4)\)个独立的带权顶点,对其进行\(m(m\leq10^5)\)次操作: 连接两个不连通的节点.如果它们已经联通,输出 ...
- BZOJ2843:极地旅行社
Description 不久之前,Mirko建立了一个旅行社,名叫"极地之梦".这家旅行社在北极附近购买了N座冰岛,并且提供观光服务. 当地最受欢迎的当然是帝企鹅了,这些小家伙经常 ...
- BZOJ2843: 极地旅行社
[传送门:BZOJ2843] 简要题意: 给出n个点以及它们的权值,有m个操作,4种操作: 1.询问从x到y的路径上的权值和,如果不连通则输出impossible 2.连接x和y,如果本来就联通则输出 ...
- 极地旅行社[LCT]
题目描述 不久之前,Mirko建立了一个旅行社,名叫"极地之梦".这家旅行社在北极附近购买了N座冰岛,并且提供观光服务. 当地最受欢迎的当然是帝企鹅了,这些小家伙经常成群结队的游走 ...
- bzoj2843 极地旅行社
bzoj2843 三个操作:1.连接x,y 2.把x的值改为y 3.查询x到y这条路径上的所以数的和 没有cut的lct- ps:真的想打自己(再见 各种笔误 #include <cstdio& ...
- 【BZOJ28431180】极地旅行社,LCT练习
传送门-P2843 (1180是权限题,所以就不放了) 写在前面:为什么BZOJ上LCT好多都是权限题(╯‵□′)╯︵┻━┻ 思路:判断联通用findroot函数(洞穴探测里已经说过了):修改x的操作 ...
- bzoj 2843: 极地旅行社
Time Limit: 10 Sec Memory Limit: 256 MB Submit: 1077 Solved: 645 [Submit][Status][Discuss] Descrip ...
最新文章
- 安卓定时启动软件app_便签app排行榜前十名安卓手机哪个高颜值便签软件好用?...
- python中使用tab键进行提示(python3有效)
- vscode怎么用命令行打开本地项目(code .)
- Objective-C 和 Swift 混编项目的小 Tips(一)
- Redis持久化的几种方式——RDB深入解析
- 从Google Maglev说起,如何造一个牛逼的负载均衡?
- linux系统中自动生成snap文件_在Linux操作系统下自动生成Makefile的方法
- Mysql的两种存储引擎以及区别
- 设计师交流社区|积累开拓眼界必备网站
- 死锁、活锁、性能问题
- java构建学生对象布尔类型,Java如何将原始布尔类型转换为布尔对象?
- PIC温控器c语言程序,PIC CCS C语言程序范例.doc
- oracle排序去重,Oracle中去重复+排序
- 【083】毛笔字在线生成器-在线生成几十种毛笔字
- 硬盘容量和计算机容量的换算,t和g的换算(硬盘容量G跟T的换算)
- 完美解决小爱同学蓝牙音箱(包括触屏版)连接电脑后找不到音频设备问题
- 无线网络WPA-PSK加密破解
- 如何拯救无法「深度学习」的制造业,2019工业智能灵魂10问
- 企业进行固定资产盘点的作用
- 外汇汇率接口 java_基于java的货币汇率接口调用代码实例
热门文章
- GridControl 设置自带选中复选框及设置该列列头名称
- shell脚本----for循环-转 Syntax error: Bad for loop variable
- OpenCV实现图像翻转
- L1-007. 念数字-PAT团体程序设计天梯赛GPLT
- 利用ambassador实现container跨主机连接
- 监控系统之weblogic,apache,tuxedo的监控项的整理
- SQL中Left Join 与Right Join 与 Inner Join 与 Full Join的区别
- 基于VUE+TS中引用ECharts的中国地图和世界地图密度表
- Rancher Kubernetes Engine(RKE)正式发布:闪电般的Kubernetes安装部署体验 1
- Linux的用户和组管理