bzoj2843极地旅行社题解
  • 题目大意
    有n座小岛,当中每一个岛都有若干帝企鹅。

    一開始岛与岛之间互不相连。有m个操作。各自是在两个岛之间修一座双向桥,若两岛已连通则不修并输出no,若不连通就输出yes并修建。改动一个岛上帝企鹅的数量;询问从岛A到岛B可看到多少帝企鹅,若到不了输出impossible。

  • 题解
    继续试水LCT。LCT维护每一个点自身的企鹅数以及其在Splay下的子树的企鹅数的总和。

    修桥操作要在LCT中询问是否有同样的根,没有则添边。改动时把要被改动的点弄到树根去,直接改动就可以。查询时要先推断是否为同一结点,再推断是否连通。若连通,则把当中一个点x弄到根上,还有一个点y用access连上去,再用Splay把y弄到辅助树的根上。

    这时x一定是y最左端的子孙(由于它是根。中序序列里最靠前)。直接输出y左子树企鹅的总和加上y自己的企鹅数就可以。

  • Code

#include <cstdio>
#include <algorithm>
#include <cstring>
#define maxn 30005
using namespace std;
int n, m;
struct node *nil, *T[maxn], *S[maxn];
struct node
{bool rev;int val, s;node *fa, *lc, *rc;node(bool rev = false, int val = 0, int s = 0, node *fa = nil, node *lc = nil, node *rc = nil): rev(rev), val(val), s(s), fa(fa), lc(lc), rc(rc) {}inline void update(){s = lc -> s + rc -> s + val;}inline void rever(){rev ^= 1;swap(lc, rc);}inline void pushdown(){if(rev){rev = false;lc -> rever(); rc -> rever();}}
};
inline void zig(node *x)
{node *y = x -> fa;y -> lc = x -> rc;x -> rc -> fa = y;x -> rc = y;x -> fa = y -> fa;if(y == y -> fa -> lc) y -> fa -> lc = x;else if(y == y -> fa -> rc) y -> fa -> rc = x;y -> fa = x;y -> update();
}
inline void zag(node *x)
{node *y = x -> fa;y -> rc = x -> lc;x -> lc -> fa = y;x -> lc = y;x -> fa = y -> fa;if(y == y -> fa -> lc) y -> fa -> lc = x;else if(y == y -> fa -> rc) y -> fa -> rc = x;y -> fa = x;y -> update();
}
void splay(node *x)
{int top = 0;S[top++] = x;for(node *i = x; i == i -> fa -> lc || i == i -> fa -> rc; i = i -> fa){S[top++] = i -> fa;}while(top--) S[top] -> pushdown();node *y = nil, *z = nil;while(x == x -> fa -> lc || x == x -> fa -> rc){y = x -> fa; z = y -> fa;if(x == y -> lc){if(y == z -> lc) zig(y);zig(x);}else{if(y == z -> rc) zag(y);zag(x);}}x -> update();
}
inline void access(node *x)
{for(node *y = nil; x != nil; y = x, x = x -> fa){splay(x);x -> rc = y;x -> update();}
}
inline void makeroot(node *x)
{access(x); splay(x); x -> rever();
}
inline void lnk(node *x, node *y)
{makeroot(x);x -> fa = y;splay(y);
}
inline node* find(node *x)
{access(x); splay(x);while(x -> lc != nil) x = x -> lc;return x;
}
inline void change(node *x, int k)
{makeroot(x);x -> val = k;x -> update();
}
inline int query(node *x, node *y)
{if(x == y) return x -> val;if(find(x) != find(y)) return -1;makeroot(x);access(y);splay(y);return (y -> lc -> s + y -> val);
}
int main()
{int a, b, c;char ch[10];scanf("%d", &n);nil = new node(); *nil = node();for(int i = 1; i <= n; ++i) T[i] = new node();for(int i = 1; i <= n; ++i){scanf("%d", &(T[i] -> val));T[i] -> update();}scanf("%d", &m);while(m--){scanf("%s%d%d", ch, &a, &b);if(ch[0] == 'b'){if(find(T[a]) != find(T[b])){lnk(T[a], T[b]); puts("yes");}else puts("no");}else if(ch[0] == 'p'){change(T[a], b);}else{c = query(T[a], T[b]);if(c == -1) puts("impossible");else printf("%d\n", c);}}for(int i = 1; i <= n; ++i){delete T[i];T[i] = NULL;}delete nil;nil = NULL;return 0;
}

posted on 2017-06-17 14:39 mthoutai 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/mthoutai/p/7040189.html

bzoj2843极地旅行社题解相关推荐

  1. bzoj2843极地旅行社

    bzoj2843极地旅行社 题意: 一些点,每个点有一个权值.有三种操作:点与点连边,单点修改权值,求两点之间路径上点的权值和(需要判输入是否合法) 题解: 以前一直想不通为什么神犇们的模板中LCT在 ...

  2. BZOJ2843 - 极地旅行社

    Portal Description 给出\(n(n\leq3\times10^4)\)个独立的带权顶点,对其进行\(m(m\leq10^5)\)次操作: 连接两个不连通的节点.如果它们已经联通,输出 ...

  3. BZOJ2843:极地旅行社

    Description 不久之前,Mirko建立了一个旅行社,名叫"极地之梦".这家旅行社在北极附近购买了N座冰岛,并且提供观光服务. 当地最受欢迎的当然是帝企鹅了,这些小家伙经常 ...

  4. BZOJ2843: 极地旅行社

    [传送门:BZOJ2843] 简要题意: 给出n个点以及它们的权值,有m个操作,4种操作: 1.询问从x到y的路径上的权值和,如果不连通则输出impossible 2.连接x和y,如果本来就联通则输出 ...

  5. BZOJ2843 极地旅行社 LCT

    欢迎访问~原文出处--博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ2843 题意概括 有n座岛 每座岛上的企鹅数量虽然会有所改变,但是始终在[0, 1000]之间.你的 ...

  6. bzoj2843 极地旅行社

    bzoj2843 三个操作:1.连接x,y 2.把x的值改为y 3.查询x到y这条路径上的所以数的和 没有cut的lct- ps:真的想打自己(再见 各种笔误 #include <cstdio& ...

  7. bzoj 2843: 极地旅行社

    Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 1077  Solved: 645 [Submit][Status][Discuss] Descrip ...

  8. 极地旅行社[LCT]

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

  9. [COCI 2009] OTOCI / 极地旅行社

    题目描述 不久之前,Mirko 建立了一个旅行社,名叫"极地之梦".这家旅行社在北极附近购买了 nn 座冰岛,并且提供观光服务. 当地最受欢迎的当然是帝企鹅了,这些小家伙经常成群结 ...

最新文章

  1. [置顶] 决策树绘图(二)
  2. Shell函数详解(函数定义、函数调用)
  3. SAP 作业类型主数据
  4. Django框架(23.Django中的模板的标签、变量、过滤器和注释)
  5. Android学习一:文件操作
  6. 【Boost】boost库中智能指针概述
  7. 微信公众账号开发文档
  8. 推荐一个好用的Chrome扩展,专门处理xml的,名叫XML Tree
  9. go编译成c语言,Go语言是怎么完成编译的
  10. 华北电力大学计算机科学与技术考研,华北电力大学吴克河教授谈计算机科学与技术专业...
  11. 【剑指offer】面试题49:丑数
  12. Error 2503 and 2502 when installing/uninstalling on Windows 10
  13. matlab nastran,nastran op2 matlab
  14. 02_行销(Marketing)里用逻辑回归来找寻顾客参与度后面的原因
  15. 计算机应用基础课件教学大赛,全国“XX杯”说课大赛计算机应用基础类优秀作品:设置IP地址教学课件.ppt...
  16. cwRsync的安装与配置用法
  17. 在线工具网,程序员必备小网址
  18. 计算机课搞事情检讨,【热门】作弊检讨书范文10篇
  19. 使用QQ推广作为客服或留言
  20. 20189320《网络攻防》第二周作业

热门文章

  1. django外键和多数据库应用
  2. Ubuntu下使用VNC
  3. eclipse建java项目不见_秒建一个后台管理系统?用这5个开源免费的Java项目就够了...
  4. 蓝桥杯 ALGO-159 算法训练 P0103
  5. 【note】Swift初见笔记
  6. 蓝桥杯 ALGO-123 算法训练 A+B problem
  7. 1062. Talent and Virtue (25)-PAT甲级真题
  8. python数组写入txt
  9. Android签名打包详解
  10. HDU1013 POJ1519 Digital Roots