bzoj2843极地旅行社

题意:

一些点,每个点有一个权值。有三种操作:点与点连边,单点修改权值,求两点之间路径上点的权值和(需要判输入是否合法)

题解:

以前一直想不通为什么神犇们的模板中LCT在link和cut后都要在根节点打翻转标记。现在明白了,因为只有这样才能保持深度的正确性,以前没有因此炸过是因为我以前都是把LCT拿来当链剖用的,根本不用link和cut~~这道题是LCT模板题也没什么好说的。不过CCZ大爷有更快的做法,就是离线读入所有连边操作,然后建一棵树用链剖,判断输入是否合法就在线用并查集查询与维护。orzCCZ!

代码:

 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <cstring>
 4 #define inc(i,j,k) for(int i=j;i<=k;i++)
 5 #define maxn 50000
 6 using namespace std;
 7
 8 int fa[maxn],ch[maxn][2],sm[maxn],v[maxn];bool rev[maxn];
 9 inline void update(int x){
10     if(x==0)return; sm[x]=v[x];
11     if(ch[x][0])sm[x]+=sm[ch[x][0]]; if(ch[x][1])sm[x]+=sm[ch[x][1]];
12 }
13 inline bool is_root(int x){
14     if(x==0||fa[x]==0)return 1;
15     return x!=ch[fa[x]][0]&&x!=ch[fa[x]][1];
16 }
17 inline void pushdown(int x){
18     if(rev[x]){
19         swap(ch[x][0],ch[x][1]); if(ch[x][0])rev[ch[x][0]]^=1; if(ch[x][1])rev[ch[x][1]]^=1; rev[x]^=1;
20     }
21 }
22 void rotate(int x){
23     if(x==0||is_root(x))return;
24     int a1=fa[x],a2=fa[fa[x]],a3; bool b1=(x==ch[a1][1]),b2=(a1==ch[a2][1]),b3=is_root(a1); a3=ch[x][!b1];
25     if(!b3)ch[a2][b2]=x; fa[x]=a2; ch[a1][b1]=a3; if(a3)fa[a3]=a1; ch[x][!b1]=a1; fa[a1]=x;
26     update(a1); update(x); if(!b3)update(a2);
27 }
28 int dt[maxn],dts,y;
29 void splay(int x){
30     if(x==0)return; dts=0; y=x; while(! is_root(y))dt[++dts]=y,y=fa[y];
31     dt[++dts]=y; while(dts)pushdown(dt[dts]),dts--;
32     while(!is_root(x)){
33         if(!is_root(fa[x]))((x==ch[fa[x]][1])^(fa[x]==ch[fa[fa[x]]][1]))?rotate(x):rotate(fa[x]);
34         rotate(x);
35     }
36 }
37 int access(int x){
38     if(x==0)return 0; int t=0;
39     while(x){splay(x); ch[x][1]=t; update(x); if(t)fa[t]=x; t=x; x=fa[x];}
40     return t;
41 }
42 bool link(int x,int y){
43     if(x==0||y==0)return 0; access(x); splay(x); rev[x]^=1; fa[x]=y; return 1;
44 }
45 int querysum(int x,int y){
46     if(x==0||y==0)return 0; if(x==y)return v[x]; access(x); int a=access(y); splay(x);
47     if(x==a)return v[a]+sm[ch[a][1]];else return sm[x]+v[a]+sm[ch[a][1]];
48 }
49 void change(int x,int y){
50     splay(x); v[x]=y; update(x);
51 }
52 int find(int x){
53     access(x); splay(x); while(ch[x][0])x=ch[x][0]; return x;
54 }
55 int n,m; char s[20];
56 int main(){
57     //freopen("test.txt","r",stdin);
58     scanf("%d",&n); inc(i,1,n)scanf("%d",&v[i]),fa[i]=0,ch[i][0]=ch[i][1]=rev[i]=0,sm[i]=v[i]; scanf("%d",&m);
59     inc(i,1,m){
60         int a,b; scanf("%s%d%d",s,&a,&b);
61         if(s[0]=='b'){if(find(a)==find(b))puts("no");else link(a,b),puts("yes");}
62         if(s[0]=='p')change(a,b);
63         if(s[0]=='e')if(find(a)!=find(b))puts("impossible");else printf("%d\n",querysum(a,b));
64     }
65     return 0;
66 }

20160420

转载于:https://www.cnblogs.com/YuanZiming/p/5703246.html

bzoj2843极地旅行社相关推荐

  1. bzoj2843极地旅行社题解

    bzoj2843极地旅行社题解 题目大意 有n座小岛,当中每一个岛都有若干帝企鹅. 一開始岛与岛之间互不相连.有m个操作.各自是在两个岛之间修一座双向桥,若两岛已连通则不修并输出no,若不连通就输出y ...

  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. MySQL慢查询(一) - 开启慢查询
  2. CSS3 :nth-child(n)使用注意
  3. excel下划线转驼峰公式
  4. java中线程死锁及避免_如何避免Java线程中的死锁?
  5. 通过扫码自定义链接安装iOS app,版本更新总结。
  6. 教你如何从0到1实现组件化架构
  7. 【u249】新斯诺克
  8. gin 打linux环境包问题解决
  9. 2016012013 王雪 散列函数的应用及其安全性
  10. mysql如何导入mdl文件_将sql文件导入PowerDesigner中的方法(将oracle sql文件转换成mysql)...
  11. Windows文件系统
  12. 局域网内和局域网间的通信(交换机与路由器)
  13. 微信小程序测试自学文档
  14. html 防网页假死,JavaScript-如何防止由于脚本引起的浏览器假死
  15. win10系统无法连接xp工作组计算机,Win10系统访问XP共享打印机连接不了的解决方法...
  16. vue移动端开启键盘 页面底部样式乱了
  17. 华为的王炸黑科技鸿蒙系统,华为黑科技“cyberverse”发布,“鸿蒙系统”在其面前都不值一提...
  18. javaapplet还有用吗
  19. 文秘要学计算机吗,高考志愿:计算机专业和文秘专业哪个适合女生?
  20. 微博舆情 之 热点话题分析

热门文章

  1. 机器学习工具 sklearn与tensorflow优劣势
  2. 百度引流标题怎么写新颖?什么样的标题最吸引人?
  3. 数据挖掘实验(SAS)关联规则挖掘
  4. Tina理财笔记(三)——房住不炒时代背景下的真实房产收益
  5. 2020年10月公有云性能评测:盛大云-华东蝉联冠军,腾讯云-北京无缘前三
  6. 快来快来理一理 JAVA Thead状态分析
  7. Azure Active Directory Connect深度解析
  8. Jenkins 集成蒲公英
  9. 百家文章采集,自媒体写作轻松上手!
  10. #关闭笔记本屏幕#笔记本怎么关闭屏幕#笔记本怎么关闭显示器@FDDLC