BZOJ 1180 [CROATIAN2009]OTOCI Link Cut Trees

2024-03-30 16:58

本文主要是介绍BZOJ 1180 [CROATIAN2009]OTOCI Link Cut Trees,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Description

给出n个结点以及每个点初始时对应的权值wi。起始时点与点之间没有连边。有3类操作: 1、bridge A B:询问结点A与结点B是否连通。如果是则输出“no”。否则输出“yes”,并且在结点A和结点B之间连一条无向边。 2、penguins A X:将结点A对应的权值wA修改为X。 3、excursion A B:如果结点A和结点B不连通,则输出“impossible”。否则输出结点A到结点B的路径上的点对应的权值的和。给出q个操作,要求在线处理所有操作。数据范围:1<=n<=30000, 1<=q<=300000, 0<=wi<=1000。

Input

第一行包含一个整数n(1<=n<=30000),表示节点的数目。第二行包含n个整数,第i个整数表示第i个节点初始时对应的权值。第三行包含一个整数q(1<=n<=300000),表示操作的数目。以下q行,每行包含一个操作,操作的类别见题目描述。任意时刻每个节点对应的权值都是1到1000的整数。

Output

输出所有bridge操作和excursion操作对应的输出,每个一行。

Sample Input

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

Sample Output

4
impossible
yes
6
yes
yes
15
yes
15
16

HINT




传送门
LCT的模板题目……
之前怎么就没发现没有这道基础题呢???
最坑的是时限50s……
然后我第一发样例过了很开心就提交……然后发现……
我Rotate里面有个判断打错了!
最好WA吧……
结果就TLE了  = =  汗。。。。

改好之后就A了……跑了5000ms+
感觉跑的时间主要花在我建立这么多子程序= =
有些只用了1遍这样= =
不过更加清晰嘛。



#include<bits/stdc++.h>
using namespace std;
int read(){int x=0,f=1;char ch=getchar();while (ch<'0' || ch>'9'){if (ch=='-') f=-1;ch=getchar();}while (ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
const int N=30005;
int n;
struct LCT{int pre,son[2],sum,num;bool rev;
}tree[N];
bool isroot(int x){return tree[tree[x].pre].son[0]!=x &&tree[tree[x].pre].son[1]!=x;
}
void up(int x){if (x){int l=tree[x].son[0],r=tree[x].son[1];tree[x].sum=tree[x].num;if (l) tree[x].sum+=tree[l].sum;if (r) tree[x].sum+=tree[r].sum;}
}
void down(int x){if (x && tree[x].rev){int l=tree[x].son[0],r=tree[x].son[1];swap(tree[x].son[0],tree[x].son[1]);tree[l].rev^=1,tree[r].rev^=1,tree[x].rev^=1;}
}
void Rotate(int x){int y=tree[x].pre,z=tree[y].pre,l,r;if (tree[y].son[0]==x) l=0; else l=1;r=l^1;if (!isroot(y))if (tree[z].son[0]==y) tree[z].son[0]=x;else tree[z].son[1]=x;tree[x].pre=z,tree[y].pre=x;tree[y].son[l]=tree[x].son[r];tree[tree[x].son[r]].pre=y;tree[x].son[r]=y;up(y);
}
int stk[N];
void splay(int x){int top=1;stk[1]=x;for (int i=x;!isroot(i);i=tree[i].pre)stk[++top]=tree[i].pre;while (top) down(stk[top--]);while (!isroot(x)){int y=tree[x].pre,z=tree[y].pre;if (!isroot(y))if (tree[y].son[0]==x^tree[z].son[0]==y) Rotate(x);else Rotate(y);Rotate(x);}up(x);
}
void access(int x){for (int t=0;x;t=x,x=tree[x].pre)splay(x),tree[x].son[1]=t,up(x);
}
void makeroot(int x){access(x),splay(x);tree[x].rev^=1;
}
void split(int x,int y){makeroot(x);access(y),splay(y);
}
void link(int x,int y){makeroot(x);tree[x].pre=y;up(y);
}
int findroot(int x){access(x),splay(x);while (tree[x].son[0]) x=tree[x].son[0];return x;
}
bool sameset(int x,int y){return findroot(x)==findroot(y);
}
int querysum(int x,int y){split(x,y);return tree[y].sum;
}
int main(){n=read();for (int i=1;i<=n;i++)tree[i].num=read();int q=read(),x,y;char opt[15];while (q--){scanf("%s",opt);x=read(),y=read();if (opt[0]=='b')if (sameset(x,y)) puts("no");else puts("yes"),link(x,y);if (opt[0]=='p')tree[x].num=y,splay(x);if (opt[0]=='e')if (!sameset(x,y)) puts("impossible");else printf("%d\n",querysum(x,y));}return 0;
}

这篇关于BZOJ 1180 [CROATIAN2009]OTOCI Link Cut Trees的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/862051

相关文章

ora-01017 ora-02063 database link,oracle11.2g通过dblink连接oracle11.2g

错误图示: 问题解决 All database links, whether public or private, need username/password of the remote/target database. Public db links are accessible by all accounts on the local database, while private

Shell编程:文本处理器(cut、split、paste、eval 命令)

文章目录 文本处理器 2cut 命令-快速裁剪语法格式常用选项示例 split 命令-文件拆分语法格式常用选项示例 paste 命令-文件合并语法格式常用选项示例 eval 命令-变量扫描器工作原理示例 文本处理器 2 本章讲解 grep、sort、uniq、tr、cut、split、paste 命令等。这些文本处理器通常用于数据过滤、转换、清理、格式化和提取等操作,

【BZOJ】1324 Exca王者之剑 最大权独立集

传送门:【BZOJ】1324  Exca王者之剑 题目分析:赤裸裸的最大权独立集。。。最小割解决 代码如下: #include <cstdio>#include <vector>#include <cstring>#include <algorithm>using namespace std ;#define REP( i , a , b ) for ( int

【BZOJ】1026: [SCOI2009]windy数 数位DP

传送门:【BZOJ】1026: [SCOI2009]windy数 题目分析:数位DP水题。 代码如下: #include <stdio.h>#include <cstring>#include <algorithm>#define rep( i , a , b ) for ( int i = a ; i < b ; ++ i )#define For( i ,

【BZOJ】2152: 聪聪可可 点分治

传送门:【BZOJ】2152: 聪聪可可 题目分析:记录权值和%3的路径的个数。。。然后去重。。没了。。 代码如下: #include <vector>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std ;typedef lo

C++编译器与链接器工作原理 + Link错误

http://blog.csdn.net/qq_20389175/article/details/44159061 VC项目调试基础 --http://blog.csdn.net/phunxm/article/details/5203931   一.Debug版本和Release版本的区别 Debug通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release称为

CSS - link和@import的区别

页面中使用CSS的方式主要有3种:行内添加定义style属性值,页面头部内嵌调用和外面链接调用,其中外面引用有两种:link和@import。外部引用CSS两种方式link和@import的方式分别是: XML/HTML代码 <link rel="stylesheet" rev="stylesheet" href="CSS文件" type="text/css" media="all

解决Node.js调用fs.renameSync报错的问题(Error: EXDEV, cross-device link not permitted)

在写一个文件上传的功能时候,调用fs.renameSync方法错误 出错 代码所在如下: 1 function upload(response,request){ 2 console.log("upload called"); 3 var form = new formidable.IncomingForm(); 4 console.log("about t

Html中a标签的四个属性 link ,visited , hover ,active 是有顺序的! LVHA

1。html中a标签的四个属性书写是有顺序的,如果顺序不对,显示效果有可能出现差错。 a:link{text-decoration:none ; color:#c00 ;} a:visited {text-decoration:none ; color:#c30 ;} a:hover {text-decoration:underline ; color:#f60 ;} a:active

Pandas-高级处理(八):数据离散化【pandas.cut:根据指定分界点对连续数据进行分箱处理】【pandas.qcut:指定箱子的数量对连续数据进行等宽分箱处理】【get_dummies】

Python实现连续数据的离散化处理主要基于两个函数:pandas.cut和pandas.qcut,pandas.cut根据指定分界点对连续数据进行分箱处理,pandas.qcut可以指定箱子的数量对连续数据进行等宽分箱处理(注意:所谓等宽指的是每个箱子中的数据量是相同的) 应用cut、qcut实现数据的区间分组应用get_dummies实现数据的one-hot编码 数据离散化 可以用来减少