BZOJ1180 [CROATIAN2009]OTOCI 【LCT】
题目
给出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。
输入格式
第一行包含一个整数n(1<=n<=30000),表示节点的数目。第二行包含n个整数,第i个整数表示第i个节点初始时对应的权值。第三行包含一个整数q(1<=n<=300000),表示操作的数目。以下q行,每行包含一个操作,操作的类别见题目描述。任意时刻每个节点对应的权值都是1到1000的整数。
输出格式
输出所有bridge操作和excursion操作对应的输出,每个一行。
输入样例
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
输出样例
4
impossible
yes
6
yes
yes
15
yes
15
16
题解
LCT板题
但蒟蒻opt[0]打成了opt[1]查了一个中午QAQ
对着黄学长代码还是学会了更加简化的LCT代码
没白弄
#include<iostream>
#include<cstdio>
#include<cstring>
#define LL long long int
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define isrt(u) !(e[e[u].f].ch[0] == u || e[e[u].f].ch[1] == u)
#define isr(u) (e[e[u].f].ch[1] == u)
#define ls e[u].ch[0]
#define rs e[u].ch[1]
using namespace std;
const int maxn = 30005,maxm = 100005,INF = 1000000000;
inline int RD(){
int out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57) {if (c == '-') flag = -1; c = getchar();}
while (c >= 48 && c <= 57) {out = (out << 1) + (out << 3) + c - '0'; c = getchar();}
return out * flag;
}
int N,M;
char opt[20];
struct node{int f,ch[2],w,sum,rev;}e[maxn];
void pup(int u){e[u].sum = e[ls].sum + e[u].w + e[rs].sum;}
void pd(int u){
if (e[u].rev){
swap(ls,rs);
e[ls].rev ^= 1; e[rs].rev ^= 1; e[u].rev ^= 1;
}
}
void push_down(int u){
if (!isrt(u)) push_down(e[u].f);
pd(u);
}
void spin(int u){
int s = isr(u),fa = e[u].f;
e[u].f = e[fa].f; if (!isrt(fa)) e[e[fa].f].ch[isr(fa)] = u;
e[fa].ch[s] = e[u].ch[s ^ 1]; if (e[u].ch[s ^ 1]) e[e[u].ch[s ^ 1]].f = fa;
e[fa].f = u; e[u].ch[s ^ 1] = fa;
pup(fa); pup(u);
}
void splay(int u){
push_down(u);
for (; !isrt(u); spin(u))
if (!isrt(e[u].f)) spin((isr(u) ^ isr(e[u].f)) ? u : e[u].f);
}
void Access(int u){
for (int v = 0; u; u = e[v = u].f)
splay(u),e[u].ch[1] = v,pup(u);
}
void Make_root(int u){Access(u); splay(u); e[u].rev ^= 1;}
int Getrt(int u){
Access(u); splay(u);
while (ls) u = ls;
return u;
}
void Link(int u,int v){
Make_root(u); e[u].f = v;
}
int Getsum(int u,int v){
Make_root(u); Access(v); splay(v);
return e[v].sum;
}
void solve1(int u,int v){
if (Getrt(u) == Getrt(v)) puts("no");
else puts("yes"),Link(u,v);
}
void solve2(int u,int v){
Make_root(u);
e[u].w = v; pup(u);
}
void solve3(int u,int v){
if (Getrt(u) == Getrt(v)) printf("%d\n",Getsum(u,v));
else puts("impossible");
}
int main(){
N = RD(); REP(i,N) e[i].w = e[i].sum = RD();
M = RD(); int u,v;
while (M--){
scanf("%s",opt); u = RD(); v = RD();
if (opt[0] == 'b') solve1(u,v);
else if (opt[0] == 'p') solve2(u,v);
else solve3(u,v);
}
return 0;
}
BZOJ1180 [CROATIAN2009]OTOCI 【LCT】的更多相关文章
- bzoj 1180: [CROATIAN2009]OTOCI【LCT】
一道几乎是板子的LCT,但是沉迷数学很久时候突然1A了这道题还是挺开心的 #include<iostream> #include<cstdio> using namespace ...
- 【BZOJ2049】【LCT】Cave 洞穴勘测
Description 辉 辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通 道组成,并且每条通道连接了 ...
- 【HDU4010】【LCT】Query on The Trees
Problem Description We have met so many problems on the tree, so today we will have a query problem ...
- 1180: [CROATIAN2009]OTOCI(LCT)
1180: [CROATIAN2009]OTOCI Time Limit: 50 Sec Memory Limit: 162 MBSubmit: 1200 Solved: 747[Submit][ ...
- BZOJ1180 [CROATIAN2009]OTOCI LCT
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1180 本题和BZOJ2843一样. BZOJ2843 极地旅行社 LCT 题意概括 有n座岛 每座 ...
- BZOJ2843极地旅行社&BZOJ1180[CROATIAN2009]OTOCI——LCT
题目描述 给出n个结点以及每个点初始时对应的权值wi.起始时点与点之间没有连边.有3类操作: 1.bridge A B:询问结点A与结点B是否连通. 如果是则输出“no”.否则输出“yes”,并且在 ...
- ZJOI2012网络 题解报告【LCT】
题目描述 有一个无向图G,每个点有个权值,每条边有一个颜色.这个无向图满足以下两个条件: 对于任意节点连出去的边中,相同颜色的边不超过两条. 图中不存在同色的环,同色的环指相同颜色的边构成的环. 在这 ...
- BZOJ2631 tree 【LCT】
题目 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2:将树中原有的边( ...
- [BZOJ 3669] [Noi2014] 魔法森林 【LCT】
题目链接:BZOJ - 3669 题目分析 如果确定了带 x 只精灵A,那么我们就是要找一条 1 到 n 的路径,满足只经过 Ai <= x 的边,而且要使经过的边中最大的 Bi 尽量小. 其实 ...
随机推荐
- hdu5691 Sitting in Line(状压dp)
1 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> ...
- Centos7下MySql5.7安装及配置
安装MySql 软件包: mysql-community-libs-5.7.22-1.el7.x86_64.rpm mysql-community-common-5.7.22-1.el7.x86_64 ...
- 简版会员私信表设计及sql 私信列表查询
先上下表结构和数据 DROP TABLE IF EXISTS `message`; CREATE TABLE `message` ( `id` int(11) NOT NULL AUTO_INCREM ...
- dataTables设置下拉滚动出现表头挤在一起的解决方法
1.引入datatable的CSS文件 <link href="http://cdn.datatables.net/1.10.15/css/jquery.dataTables.min. ...
- 微信小程序开发入门学习(2):小程序的布局
概述 小程序的布局采用了和Css3中相同的 flex(弹性布局)方式,使用方法也类似(只是属性名不同而已). 水平排列 默认是从左向右水平依次放置组件,从上到下依次放置组件. 任何可视组件都需要使用样 ...
- layer 点击弹出图片
今天做东西有一个功能:在列表点击图片弹出并放大显示,使用到了layer的页面层,下边是个小demo success:function (e) { var url = e.qrcode_url; //a ...
- Teaching Is a Fruitful Way to Learn【教学是一种有效的学习方式】
Teaching Is a Fruitful Way to Learn For thousands of years, people have known that the best way to u ...
- 笔记-python-statement-with
笔记-python-statement-with 1. with语句 1.1. 基础使用案例 在开发时,经常使用with语句来打开文件: with open(‘a.txt’,’a+’, ...
- P1133 教主的花园
P1133 教主的花园 题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价值. 教 ...
- loj2174 「FJOI2016」神秘数
先考虑一下一个集合怎么用 \(O(n)\) 时间求出来,然后用主席树推广到一个序列就可以了.大致思想就是考虑一个数的权值和它前面的数的和的关系. #include <algorithm> ...