[luogu]P4312 [COCI 2009] OTOCI / 极地旅行社(LCT)
P4312 [COCI 2009] OTOCI / 极地旅行社
题目描述
不久之前,Mirko建立了一个旅行社,名叫“极地之梦”。这家旅行社在北极附近购买了N座冰岛,并且提供观光服务。
当地最受欢迎的当然是帝企鹅了,这些小家伙经常成群结队的游走在各个冰岛之间。Mirko的旅行社遭受一次重大打击,以至于观光游轮已经不划算了。旅行社将在冰岛之间建造大桥,并用观光巴士来运载游客。
Mirko希望开发一个电脑程序来管理这些大桥的建造过程,以免有不可预料的错误发生。这些冰岛从1到N标号。一开始时这些岛屿没有大桥连接,并且所有岛上的帝企鹅数量都是知道的。每座岛上的企鹅数量虽然会有所改变,但是始终在[0, 1000]之间。你的程序需要处理以下三种命令:
- bridge A B:询问结点A与结点B是否连通。如果是则输出“no”。否则输出“yes”,并且在结点A和结点B之间连一条无向边。
- penguins A X:将结点A对应的权值wA修改为X。
- excursion A B:如果结点A和结点B不连通,则输出“impossible”。否则输出结点A到结点B的路径上的点对应的权值的和。
给出q个操作,要求在线处理所有操作。
输入输出格式
输入格式:
第一行包含一个整数n(1<=n<=30000),表示节点的数目。
第二行包含n个整数,第i个整数表示第i个节点初始时对应的权值。
第三行包含一个整数q(1<=n<=300000),表示操作的数目。
以下q行,每行包含一个操作,操作的类别见题目描述。
任意时刻每个节点对应的权值都是1到1000的整数。
输出格式:
输出所有bridge操作和excursion操作对应的输出,每个一行。
输入输出样例
输入样例#1: 复制
5
4 2 4 5 6
10
excursion 1 1
excursion 1 2
bridge 1 2
excursion 1 2
bridge 3 4
bridge 3 5
excursion 4 5
bridge 1 3
excursion 2 4
excursion 2 5
输出样例#1: 复制
4
impossible
yes
6
yes
yes
15
yes
15
16
说明
数据范围:1<=n<=30000, 1<=q<=300000, 0<=wi<=1000。
题解
几个月没打lct了,打道模板练练手
看看操作吧。
1.只要link就可以了。注意yes和no的鬼畜输出。
2.先access当前点,然后splay当前点,最后push一下修改值就可以了。因为access以后当前点是深度最深的点。splay以后它就不属于除它自己以外的子树了,这个时候改它自己的值就可以了。
3.先判是否联通,是则提出这条边的和。
所以这是怎么在luogu上评了黑的?
代码
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
const int N=1e6+5;
struct node{
int v,ff,ch[2];
int rev,s;
}t[N];
int n,m,ch[N],S[N],top;
int read(){
int x=0,w=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*w;
}
bool isroot(int x){
return t[t[x].ff].ch[1]!=x&&t[t[x].ff].ch[0]!=x;
}
void pushup(int x){
t[x].s=t[t[x].ch[0]].s+t[t[x].ch[1]].s+t[x].v;
}
void pushdown(int x){
if(t[x].rev){
swap(t[x].ch[1],t[x].ch[0]);
t[t[x].ch[1]].rev^=1;
t[t[x].ch[0]].rev^=1;
t[x].rev=0;
}
}
void rotate(int x){
int y=t[x].ff,z=t[y].ff,k=t[y].ch[1]==x;
if(!isroot(y))t[z].ch[t[z].ch[1]==y]=x;t[x].ff=z;
t[y].ch[k]=t[x].ch[k^1];t[t[x].ch[k^1]].ff=y;
t[y].ff=x;t[x].ch[k^1]=y;
pushup(y);pushup(x);
}
void splay(int x){
S[top=1]=x;
for(int i=x;!isroot(i);i=t[i].ff)S[++top]=t[i].ff;
for(int i=top;i;i--)pushdown(S[i]);
while(!isroot(x)){
int y=t[x].ff,z=t[y].ff;
if(!isroot(y))
(t[y].ch[0]==x)^(t[z].ch[0]==y)?rotate(x):rotate(y);
rotate(x);
}
}
void access(int x){for(int y=0;x;y=x,x=t[x].ff)splay(x),t[x].ch[1]=y,pushup(x);}
void makeroot(int x){access(x);splay(x);t[x].rev^=1;}
int findroot(int x){access(x);splay(x);while(t[x].ch[0])x=t[x].ch[0];return x;}
void spilt(int x,int y){makeroot(x);access(y);splay(y);}
void link(int x,int y){makeroot(x);t[x].ff=y;}
int main(){
n=read();
for(int i=1;i<=n;i++)ch[i]=t[i].v=read();
m=read();
while(m--){
char opt[11];
scanf("%s",opt);
if(opt[0]=='e'){
int x=read(),y=read();
if(findroot(x)!=findroot(y))printf("impossible\n");
else spilt(x,y),printf("%d\n",t[y].s);
}
if(opt[0]=='p'){
int x=read(),y=read();;
access(x);splay(x);t[x].v=y;pushup(x);
}
if(opt[0]=='b'){
int x=read(),y=read();
if(findroot(x)==findroot(y))printf("no\n");
else printf("yes\n"),link(x,y);
}
}
return 0;
}
[luogu]P4312 [COCI 2009] OTOCI / 极地旅行社(LCT)的更多相关文章
- 洛谷P4312 [COCI 2009] OTOCI / 极地旅行社(link-cut-tree)
题目描述 不久之前,Mirko建立了一个旅行社,名叫“极地之梦”.这家旅行社在北极附近购买了N座冰岛,并且提供观光服务. 当地最受欢迎的当然是帝企鹅了,这些小家伙经常成群结队的游走在各个冰岛之间.Mi ...
- P4312 [COCI 2009] OTOCI / 极地旅行社
思路 LCT维护和的板子 注意findroot的时候要先access一下,修改点权之前要先splay到根 代码 #include <cstdio> #include <algorit ...
- [洛谷P4312][COCI 2009] OTOCI / 极地旅行社
题目大意:有$n(n\leqslant3\times10^4)$个点,每个点有点权,$m(m\leqslant3\times10^5)$个操作,操作分三种: $bridge\;x\;y:$询问节点$x ...
- BZOJ 1180 [CROATIAN 2009]OTOCI // BZOJ 2843 极地旅行社 // Luogu P4321 [COCI 2009] OTOCI / 极地旅行社 (LCA板题)
emmm-标题卡着长度上限- LCT板题-(ε=ε=ε=┏(゜ロ゜;)┛) CODE #include <cctype> #include <cmath> #include & ...
- 【题解】 Luogu P4312 / SP4155 [COCI 2009] OTOCI / 极地旅行社
原题地址:P4312 [COCI 2009] OTOCI / 极地旅行社/SP4155 OTOCI - OTOCI lct入门难度的题,十分弱智(小蒟蒻说lct是什么,能吃吗?) bridge操作判联 ...
- BZOJ 2843: 极地旅行社( LCT )
LCT.. ------------------------------------------------------------------------ #include<cstdio> ...
- [bzoj2843&&bzoj1180]极地旅行社 (lct)
双倍经验双倍的幸福... 所以另一道是300大洋的世界T_T...虽然题目是一样的,不过2843数据范围小了一点... 都是lct基本操作 #include<cstdio> #includ ...
- 【BZOJ1180】: [CROATIAN2009]OTOCI & 2843: 极地旅行社 LCT
竟然卡了我....忘记在push_down先下传父亲的信息了....还有splay里for():卡了我10min,但是双倍经验还是挺爽的,什么都不用改. 感觉做的全是模板题,太水啦,不能这么水了... ...
- 【bzoj2843】极地旅行社 LCT
题目描述 不久之前,Mirko建立了一个旅行社,名叫“极地之梦”.这家旅行社在北极附近购买了N座冰岛,并且提供观光服务.当地最受欢迎的当然是帝企鹅了,这些小家伙经常成群结队的游走在各个冰岛之间.Mir ...
随机推荐
- js实现点击复制网页内容(基于execCommand)
通过execCommand方法来实现,当一个HTML文档切换到设计模式 designMode时,文档对象暴露 execCommand 方法,该方法允许运行命令来操纵可编辑区域的内容.大多数命令影响文档 ...
- Windows系统环境变量、JAVA环境变量配置以及JVM加载过程
一:用户变量和系统变量的区别 右击我的电脑.属性.高级系统设置.环境变量. 对话框的上面为Administrator的用户变量,对话框的下面为系统变量.我们所说的环境变量一般指系统环境变量,对所有用户 ...
- 数据库-mongodb-聚合与map reduce
分组统计:group() 简单聚合:aggregate() 强大统计:mapReduce() Group函数: 1.不支持集群.分片,无法分布式计算 2.需要手写聚合函数的业务逻辑 curr指当前行, ...
- POJ 2183
模拟题 #include <iostream> #include <cstdio> #include <algorithm> using namespace std ...
- C++的标准模板库STL中实现的数据结构之链表std::list的分析与使用
摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解,即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第二篇.主要针对线性表中的链表 ST ...
- LeetCode OJ 215. Kth Largest Element in an Array 堆排序求解
题目链接:https://leetcode.com/problems/kth-largest-element-in-an-array/ 215. Kth Largest Element in an A ...
- Web前端国际化之jQuery.i18n.properties
Web前端国际化之jQuery.i18n.properties jQuery.i18n.properties介绍 国际化是如今Web应用程序开发过程中的重要一环,jQuery.i18n.propert ...
- 站点搭建从零開始(二)server空间
前面介绍了域名相关知识.这里介绍server,也经常被叫做空间.也就是站点数据实际保存的地方. 1.整体介绍 依据国家相关规定,国内server空间须要进行备案.也就是到相关的机构进行登记.详细方法能 ...
- javascript系列-class4.函数
欢迎加入前端交流群来py: 转载请标明出处! 在火影的世界中存在忍术,忍术是把强大的能量集中在一起以各种各样不同的形式发射出来.怎样使用各种各样的忍术那?通过结印. ...
- Defining and using constants from PySide in QML
Defining and using constants from PySide in QML This PySide tutorial shows you how to define constan ...