BZOJ 2843: 极地旅行社( LCT )

LCT..

------------------------------------------------------------------------

#include<cstdio>

#include<algorithm>

#include<cstring>

#include<iostream>

#define rep( i , n ) for( int i = 0 ; i < n ; ++i )

#define clr( x , c ) memset( x , c , sizeof( x ) )

using namespace std;

const int maxn = 30000 + 5;

const int maxnode = maxn + 100;

int seq[ maxn ];

int n;

struct Node *pt , *null;

struct Node {

Node *ch[ 2 ] , *p , *fa;

int sum , v;

bool rev , isRoot;

Node( int _v = 0 ) : v( _v ) {

ch[ 0 ] = ch[ 1 ] = p = fa = null;

sum = v;

isRoot = true;

rev = false;

}

inline void setc( Node* c , int d ) {

ch[ d ] = c;

c -> p = this;

}

inline void Rev() {

rev ^= 1;

swap( ch[ 0 ] , ch[ 1 ] );

}

inline void relax() {

if( rev ) {

rev = false;

rep( i , 2 ) if( ch[ i ] != null )

ch[ i ] -> Rev();

}

}

inline bool d() {

return this == p -> ch[ 1 ];

}

inline void upd() {

sum = ch[ 0 ] -> sum + ch[ 1 ] -> sum + v;

}

inline void setRoot( Node* f ) {

isRoot = true;

p = null;

fa = f;

}

void* operator new( size_t ) {

return pt++;

}

};

Node NODE[ maxnode ];

void rot( Node* t ) {

Node* p = t -> p;

p -> relax();

t -> relax();

int d = t -> d();

p -> p -> setc( t , p -> d() );

p -> setc( t -> ch[ d ^ 1 ] , d );

t -> setc( p , d ^ 1 );

p -> upd();

if( p -> isRoot ) {

p -> isRoot = false;

t -> isRoot = true;

t -> fa = p -> fa;

}

}

void splay( Node* t , Node* f = null ) {

static Node* S[ maxn ];

int top = 0;

for( Node* o = t ; o != null ; o = o -> p )

S[ ++top ] = o;

while( top ) S[ top-- ] -> relax();

for( Node* p = t -> p ; p != f ; p = t -> p ) {

if( p -> p != f )

p -> d() != t -> d() ? rot( t ) : rot( p );

rot( t );

}

t -> upd();

}

void access( Node* t ) {

for( Node* o = null ; t != null ; o = t , t = t -> fa ) {

splay( t );

t -> ch[ 1 ] -> setRoot( t );

t -> setc( o , 1 );

}

}

void makeRoot( Node* t ) {

access( t );

splay( t );

t -> Rev();

}

Node* findRoot( Node* t ) {

access( t );

splay( t );

while( t -> ch[ 0 ] != null ) {

t -> relax();

t = t -> ch[ 0 ];

}

splay( t );

return t;

}

void cut( Node* x , Node* y ) {

makeRoot( x );

access( y );

splay( x );

x -> setc( null , 1 );

y -> setRoot( null );

}

void join( Node* x , Node* y ) {

makeRoot( x );

x -> fa = y;

}

void init() {

pt = NODE;

null = new Node( 0 );

}

Node* V[ maxn ];

int main() {

freopen( "test.in" , "r" , stdin );

init();

cin >> n;

rep( i , n ) scanf( "%d" , seq + i );

// rep( i , n ) cout << seq[ i ] << ‘ ‘;

rep( i , n ) V[ i ] = new Node( *( seq + i ) );

int m , a , b;

char s[ 20 ];

cin >> m;

while( m-- ) {

scanf( " %s%d%d" , s , &a , &b );

a-- , b--;

if( s[ 0 ] == ‘b‘ ) {

if( findRoot( V[ a ] ) != findRoot( V[ b ] ) ) {

printf( "yes\n" );

join( V[ a ] , V[ b ] );

} else

printf( "no\n" );

} else if( s[ 0 ] == ‘e‘ ) {

if( findRoot( V[ a ] ) != findRoot( V[ b ] ) )

printf( "impossible\n" );

else {

makeRoot( V[ a ] );

access( V[ b ] );

splay( V[ b ] );

printf( "%d\n" , V[ b ] -> sum );

}

}

else {

b++;

makeRoot( V[ a ] );

V[ a ] -> v = b;

V[ a ] -> upd();

}

}

return 0;

}

------------------------------------------------------------------------

2843: 极地旅行社

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 152  Solved: 93
[Submit][Status][Discuss]

Description

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

Mirko的旅行社遭受一次重大打击,以至于观光游轮已经不划算了。旅行社将在冰岛之间建造大桥,并用观光巴士来运载游客。Mirko希望开发一个电脑程序来管理这些大桥的建造过程,以免有不可预料的错误发生。

这些冰岛从1到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"。

Input

第一行一个正整数N,表示冰岛的数量。

第二行N个范围[0, 1000]的整数,为每座岛屿初始的帝企鹅数量。

第三行一个正整数M,表示命令的数量。

接下来M行即命令,为题目描述所示。

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


1<=N<=30000

1<=M<=100000

Source

时间: 2024-08-07 05:47:02

BZOJ 2843: 极地旅行社( LCT )的相关文章

BZOJ 2843: 极地旅行社 lct splay

http://www.lydsy.com/JudgeOnline/problem.php?id=2843 https://blog.csdn.net/clove_unique/article/details/50992341 和之前那道题lct求两点距离用lca不同,这道题因为给的边的两个端点是没有顺序的(没法直接按照给的点直接将某个点连到树上),所以bridge需要区间翻转的操作,因为splay维护的是链,所以区间翻转相当于将叶子变成了根,根变成叶子(链翻转过来),然后再把此时的根(x)连到y

BZOJ 1180 CROATIAN 2009 OTOCI/2843 极地旅行社 LCT

题目大意:给出一些初始相互分离的岛,有三个操作,1.分析两点是否联通,如果不连通,在之间连一条边.2.更改一个点的权值.3.询问两点之间路径上所有点的点权和. 思路:基本算是LCT的模板题了吧,好久没写了,基本都要忘了,这是照别人代码写的... CODE: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define MAX 30010 using

【bzoj2843】极地旅行社 LCT

题目描述 不久之前,Mirko建立了一个旅行社,名叫“极地之梦”.这家旅行社在北极附近购买了N座冰岛,并且提供观光服务.当地最受欢迎的当然是帝企鹅了,这些小家伙经常成群结队的游走在各个冰岛之间.Mirko的旅行社遭受一次重大打击,以至于观光游轮已经不划算了.旅行社将在冰岛之间建造大桥,并用观光巴士来运载游客.Mirko希望开发一个电脑程序来管理这些大桥的建造过程,以免有不可预料的错误发生.这些冰岛从1到N标号.一开始时这些岛屿没有大桥连接,并且所有岛上的帝企鹅数量都是知道的.每座岛上的企鹅数量虽

BZOJ2843: 极地旅行社

2843: 极地旅行社 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 90  Solved: 56[Submit][Status] Description 不久之前,Mirko建立了一个旅行社,名叫“极地之梦”.这家旅行社在北极附近购买了N座冰岛,并且提供观光服务.当地最受欢迎的当然是帝企鹅了,这些小家伙经常成群结队的游走在各个冰岛之间. Mirko的旅行社遭受一次重大打击,以至于观光游轮已经不划算了.旅行社将在冰岛之间建造大桥,并用观光巴士来运

【BZOJ2843】极地旅行社(Link-Cut Tree)

[BZOJ2843]极地旅行社(Link-Cut Tree) 题面 BZOJ 题解 \(LCT\)模板题呀 没什么好说的了.. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> #include<set> #include<map> #includ

【BZOJ2843】极地旅行社 离线+树链剖分+树状数组

[BZOJ2843]极地旅行社 Description 不久之前,Mirko建立了一个旅行社,名叫“极地之梦”.这家旅行社在北极附近购买了N座冰岛,并且提供观光服务.当地最受欢迎的当然是帝企鹅了,这些小家伙经常成群结队的游走在各个冰岛之间.Mirko的旅行社遭受一次重大打击,以至于观光游轮已经不划算了.旅行社将在冰岛之间建造大桥,并用观光巴士来运载游客.Mirko希望开发一个电脑程序来管理这些大桥的建造过程,以免有不可预料的错误发生.这些冰岛从1到N标号.一开始时这些 岛屿没有大桥连接,并且所有

【BZOJ 2843】极地旅行社

复习一下LinkCutTree的模板. #include<cstdio> #include<cstring> #include<algorithm> #define N 30003 #define read(x) x=getint() using namespace std; struct node *null; struct node { node *ch[2], *fa; int d, sum; short rev; bool pl() {return fa->

BZOJ 2843 LCT

这还是道LCT的题,跟着czl做了好多LCT的题啊!没事,czl带我飞!加油,不错,挺顺利的.加油!1592毫秒, 第一次考虑了代码量, 我写这个花了 2800的代码长度, 然而czl只有1900, 代码简化还是很重要啊! 1 #include<cstdio> 2 #include<iostream> 3 #define lc c[k][0] 4 #define rc c[k][1] 5 #define rep(i,j,k) for(int i = j; i <= k; i+

bzoj2843极地旅行社

Description 不久之前,Mirko建立了一个旅行社,名叫"极地之梦".这家旅行社在北极附近购买了N座冰岛,并且提供观光服 务.当地最受欢迎的当然是帝企鹅了,这些小家伙经常成群结队的游走在各个冰岛之间.Mirko的旅行社遭受一次 重大打击,以至于观光游轮已经不划算了.旅行社将在冰岛之间建造大桥,并用观光巴士来运载游客.Mirko希望 开发一个电脑程序来管理这些大桥的建造过程,以免有不可预料的错误发生.这些冰岛从1到N标号.一开始时这些 岛屿没有大桥连接,并且所有岛上的帝企鹅数量