欢迎访问~原文出处——博客园-zhouzhendong

去博客园看该题解


题目传送门 - BZOJ2843


题意概括

  有n座岛
  每座岛上的企鹅数量虽然会有所改变,但是始终在[0, 1000]之间。你的程序需要处理以下三种命令:
  1."bridge A B"——在A与B之间建立一座大桥(A与B是不同的岛屿)。由于经费限制,这项命令被接受,当且仅当A与B不联通。若这项命令被接受,你的程序需要输出"yes",之后会建造这座大桥。否则,你的程序需要输"no"。
  2."penguins A X"——根据可靠消息,岛屿A此时的帝企鹅数量变为X。这项命令只是用来提供信息的,你的程序不需要回应。
  3."excursion A B"——一个旅行团希望从A出发到B。若A与B连通,你的程序需要输出这个旅行团一路上所能看到的帝企鹅数量(包括起点A与终点B),若不联通,你的程序需要输出"impossible"。

题解

  本题仍然是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相关推荐

  1. bzoj2843极地旅行社题解

    bzoj2843极地旅行社题解 题目大意 有n座小岛,当中每一个岛都有若干帝企鹅. 一開始岛与岛之间互不相连.有m个操作.各自是在两个岛之间修一座双向桥,若两岛已连通则不修并输出no,若不连通就输出y ...

  2. bzoj2843极地旅行社

    bzoj2843极地旅行社 题意: 一些点,每个点有一个权值.有三种操作:点与点连边,单点修改权值,求两点之间路径上点的权值和(需要判输入是否合法) 题解: 以前一直想不通为什么神犇们的模板中LCT在 ...

  3. BZOJ2843 - 极地旅行社

    Portal Description 给出\(n(n\leq3\times10^4)\)个独立的带权顶点,对其进行\(m(m\leq10^5)\)次操作: 连接两个不连通的节点.如果它们已经联通,输出 ...

  4. BZOJ2843:极地旅行社

    Description 不久之前,Mirko建立了一个旅行社,名叫"极地之梦".这家旅行社在北极附近购买了N座冰岛,并且提供观光服务. 当地最受欢迎的当然是帝企鹅了,这些小家伙经常 ...

  5. BZOJ2843: 极地旅行社

    [传送门:BZOJ2843] 简要题意: 给出n个点以及它们的权值,有m个操作,4种操作: 1.询问从x到y的路径上的权值和,如果不连通则输出impossible 2.连接x和y,如果本来就联通则输出 ...

  6. 极地旅行社[LCT]

    题目描述 不久之前,Mirko建立了一个旅行社,名叫"极地之梦".这家旅行社在北极附近购买了N座冰岛,并且提供观光服务. 当地最受欢迎的当然是帝企鹅了,这些小家伙经常成群结队的游走 ...

  7. bzoj2843 极地旅行社

    bzoj2843 三个操作:1.连接x,y 2.把x的值改为y 3.查询x到y这条路径上的所以数的和 没有cut的lct- ps:真的想打自己(再见 各种笔误 #include <cstdio& ...

  8. 【BZOJ28431180】极地旅行社,LCT练习

    传送门-P2843 (1180是权限题,所以就不放了) 写在前面:为什么BZOJ上LCT好多都是权限题(╯‵□′)╯︵┻━┻ 思路:判断联通用findroot函数(洞穴探测里已经说过了):修改x的操作 ...

  9. bzoj 2843: 极地旅行社

    Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 1077  Solved: 645 [Submit][Status][Discuss] Descrip ...

最新文章

  1. 安卓定时启动软件app_便签app排行榜前十名安卓手机哪个高颜值便签软件好用?...
  2. python中使用tab键进行提示(python3有效)
  3. vscode怎么用命令行打开本地项目(code .)
  4. Objective-C 和 Swift 混编项目的小 Tips(一)
  5. Redis持久化的几种方式——RDB深入解析
  6. 从Google Maglev说起,如何造一个牛逼的负载均衡?
  7. linux系统中自动生成snap文件_在Linux操作系统下自动生成Makefile的方法
  8. Mysql的两种存储引擎以及区别
  9. 设计师交流社区|积累开拓眼界必备网站
  10. 死锁、活锁、性能问题
  11. java构建学生对象布尔类型,Java如何将原始布尔类型转换为布尔对象?
  12. PIC温控器c语言程序,PIC CCS C语言程序范例.doc
  13. oracle排序去重,Oracle中去重复+排序
  14. 【083】毛笔字在线生成器-在线生成几十种毛笔字
  15. 硬盘容量和计算机容量的换算,t和g的换算(硬盘容量G跟T的换算)
  16. 完美解决小爱同学蓝牙音箱(包括触屏版)连接电脑后找不到音频设备问题
  17. 无线网络WPA-PSK加密破解
  18. 如何拯救无法「深度学习」的制造业,2019工业智能灵魂10问
  19. 企业进行固定资产盘点的作用
  20. 外汇汇率接口 java_基于java的货币汇率接口调用代码实例

热门文章

  1. GridControl 设置自带选中复选框及设置该列列头名称
  2. shell脚本----for循环-转 Syntax error: Bad for loop variable
  3. OpenCV实现图像翻转
  4. L1-007. 念数字-PAT团体程序设计天梯赛GPLT
  5. 利用ambassador实现container跨主机连接
  6. 监控系统之weblogic,apache,tuxedo的监控项的整理
  7. SQL中Left Join 与Right Join 与 Inner Join 与 Full Join的区别
  8. 基于VUE+TS中引用ECharts的中国地图和世界地图密度表
  9. Rancher Kubernetes Engine(RKE)正式发布:闪电般的Kubernetes安装部署体验 1
  10. Linux的用户和组管理