【BZOJ 1180】 (LCT)
1180: [CROATIAN2009]OTOCI
Time Limit: 50 Sec Memory Limit: 162 MB
Submit: 1078 Solved: 662Description
给出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 5Sample Output
4
impossible
yes
6
yes
yes
15
yes
15
16HINT
Source
【分析】
LCT裸题。。
没有cut操作。。
嗯。。。还是要调试啊。。。
注意LCT是维护链的,,询问路径对LCT来说就是小菜一碟。。
不过之前维护子树的那题用LCT变成路径维护的感觉很强啊。。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define Maxn 30010 struct node
{
int son[],fa,w,sm;
bool rev;
node() {son[]=son[]=fa=w=sm=rev=;}
}tr[Maxn]; int q[Maxn],ql;
struct LCT
{
void upd(int x)
{
int lc=tr[x].son[],rc=tr[x].son[];
tr[x].sm=tr[lc].sm+tr[rc].sm+tr[x].w;
}
void push_down(int x)
{
int lc=tr[x].son[],rc=tr[x].son[];
if(tr[x].rev)
{
swap(tr[x].son[],tr[x].son[]);
tr[lc].rev^=;tr[rc].rev^=;
tr[x].rev=;
}
}
bool is_root(int x)
{
return tr[tr[x].fa].son[]!=x&&tr[tr[x].fa].son[]!=x;
}
void rot(int x)
{
int fa=tr[x].fa,yy=tr[fa].fa;
int w=tr[fa].son[]==x?:; if(!is_root(fa))
{
if(tr[yy].son[]==fa) tr[yy].son[]=x;
else tr[yy].son[]=x;
}tr[x].fa=yy; tr[tr[x].son[w]].fa=fa;
tr[fa].son[-w]=tr[x].son[w]; tr[x].son[w]=fa;
tr[fa].fa=x;
upd(fa);//upd(x);
}
void pre(int x)
{
ql=;
while(!is_root(x)) q[++ql]=x,x=tr[x].fa;
q[++ql]=x;
while(ql) push_down(q[ql--]);
}
void splay(int x)
{
pre(x);
while(!is_root(x))
{
int fa=tr[x].fa,yy=tr[fa].fa;
if(!is_root(fa))
{
if((tr[yy].son[]==fa)==(tr[fa].son[]==x)) rot(fa);
else rot(x);
}
rot(x);
}upd(x);
}
void access(int x)
{
int lt=;
while(x)
{
splay(x);
tr[x].son[]=lt;
upd(x);
lt=x;
x=tr[x].fa;
}
}
void make_root(int x)
{
access(x);
splay(x);
tr[x].rev^=;
}
void split(int x,int y)
{
make_root(x);
access(y);
splay(y);
}
int find_root(int x)
{
access(x);
splay(x);
while(tr[x].son[]) x=tr[x].son[];
return x;
}
bool cn(int x,int y)
{
return find_root(x)==find_root(y);
}
void link(int x,int y)
{
make_root(x);
tr[x].fa=y;
}
}LCT; char s[]; int main()
{
int n;
scanf("%d",&n);
for(int i=;i<=n;i++)
{
int x;
scanf("%d",&x);
tr[i].w=x;LCT.upd(x);
}
int q;
scanf("%d",&q);
while(q--)
{
int x,y;
scanf("%s%d%d",s,&x,&y);
if(s[]=='e')
{
if(!LCT.cn(x,y)) printf("impossible\n");
else
{
LCT.split(x,y);
printf("%d\n",tr[y].sm);
}
}
else if(s[]=='b')
{
if(!LCT.cn(x,y)) {printf("yes\n");LCT.link(x,y);}
else printf("no\n");
}
else
{
LCT.splay(x);
tr[x].w=y;LCT.upd(x);
}
}
return ;
}
2017-04-27 10:50:31
【BZOJ 1180】 (LCT)的更多相关文章
- 网站静态化处理—web前端优化—下【终篇】(13)
网站静态化处理—web前端优化—下[终篇](13) 本篇继续web前端优化的讨论,开始我先讲个我所知道的一个故事,有家大型的企业顺应时代发展的潮流开始投身于互联网行业了,它们为此专门设立了一个事业部, ...
- 【Unity Shader】(三) ------ 光照模型原理及漫反射和高光反射的实现
[Unity Shader](三) ---------------- 光照模型原理及漫反射和高光反射的实现 [Unity Shader](四) ------ 纹理之法线纹理.单张纹理及遮罩纹理的实现 ...
- 【Unity Shader】(四) ------ 纹理之法线纹理、单张纹理及遮罩纹理的实现
笔者使用的是 Unity 2018.2.0f2 + VS2017,建议读者使用与 Unity 2018 相近的版本,避免一些因为版本不一致而出现的问题. [Unity Shader](三) ----- ...
- 【Unity Shader】(五) ------ 透明效果之半透明效果的实现及原理
笔者使用的是 Unity 2018.2.0f2 + VS2017,建议读者使用与 Unity 2018 相近的版本,避免一些因为版本不一致而出现的问题 [Unity Shader学习笔记](三) -- ...
- 【Unity Shader】(十) ------ UV动画原理及简易实现
笔者使用的是 Unity 2018.2.0f2 + VS2017,建议读者使用与 Unity 2018 相近的版本,避免一些因为版本不一致而出现的问题. [Unity Shader](三) ----- ...
- 【Unity Shader】(九) ------ 高级纹理之渲染纹理及镜子与玻璃效果的实现
笔者使用的是 Unity 2018.2.0f2 + VS2017,建议读者使用与 Unity 2018 相近的版本,避免一些因为版本不一致而出现的问题. [Unity Shader](三) ----- ...
- 【Unity Shader】(八) ------ 高级纹理之立方体纹理及光线反射、折射的实现
笔者使用的是 Unity 2018.2.0f2 + VS2017,建议读者使用与 Unity 2018 相近的版本,避免一些因为版本不一致而出现的问题. [Unity Shader](三) -- ...
- 【Unity Shader】(七) ------ 复杂的光照(下)
笔者使用的是 Unity 2018.2.0f2 + VS2017,建议读者使用与 Unity 2018 相近的版本,避免一些因为版本不一致而出现的问题. [Unity Sha ...
- 【Unity Shader】(六) ------ 复杂的光照(上)
笔者使用的是 Unity 2018.2.0f2 + VS2017,建议读者使用与 Unity 2018 相近的版本,避免一些因为版本不一致而出现的问题. [Unity Sha ...
随机推荐
- NodeJS 笔记 URL模块
url模块 ,包含分析和解析 URL 的工具. var url = require('url'); url.parse(urlStr[, parseQueryString][, slashesDeno ...
- C语言复习---比赛问题
一:比赛问题 两个乒乓球队进行比赛,各出三人.甲队为a,b,c三人,乙队为x,y,z三人.已抽签决定比赛名单.有人向队员打听比赛的名单.a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单. ...
- amipy exampes
jupyter notebook of backtest examples using amipy amipy examples: http://nbviewer.jupyter.org/github ...
- .NET面试题系列(五)数据结构(Array、List、Queue、Stack)及线程安全问题
常用数据结构的时间复杂度 如何选择数据结构 Array (T[]) 当元素的数量是固定的,并且需要使用下标时. Linked list (LinkedList<T>) 当元素需要能够在列表 ...
- python 音乐下载演示源代码
import requests import re api = 'http://music.taihe.com/search?' header = { 'User-Agent': 'Mozilla/5 ...
- 分模块开发创建Action子模块——(九)
web层选择war打包方式. 1.右击父工程新建maven模块
- linux下常用FTP命令 上传下载文件【转】
1. 连接ftp服务器 格式:ftp [hostname| ip-address]a)在linux命令行下输入: ftp 192.168.1.1 b)服务器询问你用户名和密码,分别输入用户名和相应密码 ...
- PHP中冒号、endif、endwhile、endfor使用介绍
我们经常在wordpress一类博客程序的模板里面看到很多奇怪的PHP语法,比如: 复制代码代码如下: <?php if(empty($GET_['a'])): ?> <font c ...
- java多线程计算和
如题:如何利用多线程实现1~1000000000的和 本文利用Callable可以返回值的特性,并将执行结果用CompletionService进行存储,最后将分步值累加. import java.u ...
- maven:多个镜像配置
<mirrors> <mirror> <id>nexus-aliyun</id> <mirrorOf>nexus-aliyun</mi ...