【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->ch[1] == this;}
	bool check() {return fa == null || (fa->ch[0] != this && fa->ch[1] != this);}
	void setc(node *r, bool c) {ch[c] = r; r->fa = this;}
	void push() {
		if (rev) {
			rev = 0; swap(ch[0], ch[1]);
			ch[0]->rev ^= 1;
			ch[1]->rev ^= 1;
		}
	}
	void count() {sum = ch[0]->sum + ch[1]->sum + d;}
};
node pool[N];
int n;
inline int getint() {
	int k = 0, fh = 1; char c = getchar();
	for(; c < ‘0‘ || c > ‘9‘; c = getchar())
		if (c == ‘-‘) fh = -1;
	for(; c >= ‘0‘ && c <= ‘9‘; c = getchar())
		k = k * 10 + c - ‘0‘;
	return k * fh;
}
namespace LCT {
	void Build() {
		null = &pool[0]; null->ch[0] = null->ch[1] = null->fa = null;
		null->d = null->sum = null->rev = 0;
		read(n);
		for(int i = 1; i <= n; ++i) {
			read(pool[i].d);
			pool[i].ch[0] = pool[i].ch[1] = pool[i].fa = null;
			pool[i].sum = pool[i].rev = 0;
		}
	}
	void rotate(node *r) {
		node *f = r->fa; bool c = r->pl();
		if (f->check()) r->fa = f->fa;
		else f->fa->setc(r, f->pl());
		f->setc(r->ch[!c], c);
		r->setc(f, !c);
		f->count();
	}
	void update(node *r) {if (!r->check()) update(r->fa); r->push();}
	void splay(node *r) {
		update(r);
		for(; !r->check(); rotate(r))
			if (!r->fa->check()) rotate(r->pl() == r->fa->pl() ? r->fa : r);
		r->count();
	}
	node *access(node *r) {
		node *y = null;
		for(; r != null; y = r, r = r->fa)
			splay(r), r->ch[1] = y;
		return y;
	}
	node *findrt(node *r) {
		access(r); splay(r);
		while (r->ch[0] != null) r = r->ch[0];
		return r;
	}
	void changert(node *r) {
		access(r)->rev ^= 1; splay(r);
	}
	void link(node *r, node *t) {
		changert(r); r->fa = t;
	}
}

int main() {
	LCT::Build();
	int m = getint(), a, b;
	node *aa, *bb;
	char c;
	for(int i = 1; i <= m; ++i) {
		for(c = getchar(); c < ‘a‘ || c > ‘z‘; c = getchar());
		read(a); read(b);
		switch (c) {
			case ‘b‘:
				if (LCT::findrt(&pool[a]) == LCT::findrt(&pool[b])) puts("no");
				else {puts("yes"); LCT::link(&pool[a], &pool[b]);}
			break;
			case ‘p‘:
				LCT::changert(&pool[a]); pool[a].d = b; pool[a].count();
			break;
			case ‘e‘:
				if (LCT::findrt(&pool[a]) != LCT::findrt(&pool[b])) puts("impossible");
				else {
					LCT::changert(&pool[a]); LCT::access(&pool[b]); LCT::splay(&pool[b]);
					printf("%d\n",pool[b].sum);
				}
			break;
		}
	}
	return 0;
}

水啊水~~~

时间: 2024-10-05 21:45:12

【BZOJ 2843】极地旅行社的相关文章

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 ) me

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: 极地旅行社

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标号.一开始时这些 岛屿没有大桥连接,并且所有

bzoj2843极地旅行社

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

【bzoj2843】极地旅行社 LCT

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

bzoj2843: 极地旅行社 离线+树链剖分

离线建树,树链剖分. #include<bits/stdc++.h> #define N 100010 #define M (l+r>>1) #define P (k<<1) #define S (k<<1|1) #define L l,M,P #define R M+1,r,S #define Z int l=1,int r=n,int k=1 using namespace std; int n,m; struct edge{ edge* s; int