P4219 [BJOI2014]大融合

题目描述

小强要在\(N\)个孤立的星球上建立起一套通信系统。这套通信系统就是连接\(N\)个点的一个树。 这个树的边是一条一条添加上去的。在某个时刻,一条边的负载就是它所在的当前能够 联通的树上路过它的简单路径的数量。

现在,你的任务就是随着边的添加,动态的回答小强对于某些边的负载的 询问。

输入输出格式

输入格式:

第一行包含两个整数 \(N, Q\),表示星球的数量和操作的数量。星球从 \(1\) 开始编号。

接下来的 \(Q\) 行,每行是如下两种格式之一:

  • A x y 表示在 \(x\) 和 \(y\) 之间连一条边。保证之前 \(x\) 和 \(y\) 是不联通的。
  • Q x y表示询问 \((x,y)\) 这条边上的负载。保证 \(x\) 和 \(y\) 之间有一条边。

输出格式:

对每个查询操作,输出被查询的边的负载。

说明

对于所有数据,\(1≤N,Q≤10^5\)


LCT维护子树信息,涨见识了。

\(sizx_i\)代表虚边连的儿子的大小。

然后\(updata\)这样写

  1. void updata(int now){siz[now]=siz[ls]+siz[rs]+sizx[now]+1;}

然后是在\(access\)的时候修改一下虚边儿子大小,在\(link\)的时候要把两个树都选上去保证没得父亲,因为我们不想把被连的那个点的信息再向上更新。

维护最值可以在每个点开个平衡树


Code:

  1. #include <cstdio>
  2. #define ll long long
  3. #define ls ch[now][0]
  4. #define rs ch[now][1]
  5. #define fa par[now]
  6. const int N=1e5+10;
  7. int ch[N][2],par[N],siz[N],sizx[N],tag[N],s[N],tot,tmp;
  8. bool isroot(int now){return ch[fa][0]==now||ch[fa][1]==now;}
  9. int identity(int now){return ch[fa][1]==now;}
  10. void updata(int now){siz[now]=siz[ls]+siz[rs]+sizx[now]+1;}
  11. void Reverse(int now){tag[now]^=1,tmp=ls,ls=rs,rs=tmp;}
  12. void connect(int f,int now,int typ){ch[fa=f][typ]=now;}
  13. void pushdown(int now)
  14. {
  15. if(tag[now])
  16. {
  17. if(ls) Reverse(ls);
  18. if(rs) Reverse(rs);
  19. tag[now]^=1;
  20. }
  21. }
  22. void Rotate(int now)
  23. {
  24. int p=fa,typ=identity(now);
  25. connect(p,ch[now][typ^1],typ);
  26. if(isroot(p)) connect(par[p],now,identity(p));
  27. else fa=par[p];
  28. connect(now,p,typ^1);
  29. updata(p),updata(now);
  30. }
  31. void splay(int now)
  32. {
  33. while(isroot(now)) s[++tot]=now,now=fa;
  34. s[++tot]=now;
  35. while(tot) pushdown(s[tot--]);
  36. now=s[1];
  37. for(;isroot(now);Rotate(now))
  38. if(isroot(fa))
  39. Rotate(identity(now)^identity(fa)?now:fa);
  40. }
  41. void access(int now)
  42. {
  43. for(int las=0;now;las=now,now=fa)
  44. splay(now),sizx[now]+=siz[rs]-siz[las],rs=las;
  45. }
  46. void evert(int now){access(now),splay(now),Reverse(now);}
  47. void link(int u,int v){evert(u),access(v),splay(v),par[u]=v,sizx[v]+=siz[u],updata(v);}
  48. void cat(int u,int v){evert(u),access(v),splay(v),ch[v][0]=par[u]=0,updata(v);}
  49. int query(int now){access(now),splay(now);return siz[now];}
  50. int n,q;
  51. int main()
  52. {
  53. scanf("%d%d",&n,&q);
  54. for(int i=1;i<=n;i++) siz[i]=1;
  55. char op[3];
  56. for(int u,v,i=1;i<=q;i++)
  57. {
  58. scanf("%s%d%d",op,&u,&v);
  59. if(op[0]=='Q') cat(u,v),printf("%lld\n",1ll*query(u)*query(v)),link(u,v);
  60. else link(u,v);
  61. }
  62. return 0;
  63. }

2018.12.7

洛谷 P4219 [BJOI2014]大融合 解题报告的更多相关文章

  1. 洛谷P4219 - [BJOI2014]大融合

    Portal Description 初始有\(n(n\leq10^5)\)个孤立的点,进行\(Q(Q\leq10^5)\)次操作: 连接边\((u,v)\),保证\(u,v\)不连通. 询问有多少条 ...

  2. 洛谷P4219 [BJOI2014]大融合(LCT,Splay)

    LCT维护子树信息的思路总结与其它问题详见我的LCT总结 思路分析 动态连边,LCT题目跑不了了.然而这题又有点奇特的地方. 我们分析一下,查询操作就是要让我们求出砍断这条边后,x和y各自子树大小的乘 ...

  3. 洛谷P4219 [BJOI2014]大融合(LCT)

    LCT维护子树信息的思路总结与其它问题详见我的LCT总结 思路分析 动态连边,LCT题目跑不了了.然而这题又有点奇特的地方. 我们分析一下,查询操作就是要让我们求出砍断这条边后,x和y各自子树大小的乘 ...

  4. 洛谷 P4219 [BJOI2014]大融合

    查询,就相当于先删去这条边,然后查询边的两个端点所在连通块大小,乘起来得到答案,然后再把边加回去 可以用线段树分治做 #pragma GCC optimize("Ofast") # ...

  5. 洛谷4219 BJOI2014大融合(LCT维护子树信息)

    QWQ 这个题目是LCT维护子树信息的经典应用 根据题目信息来看,对于一个这条边的两个端点各自的\(size\)乘起来,不过这个应该算呢? 我们可以考虑在LCT上多维护一个\(xv[i]\)表示\(i ...

  6. P4219 [BJOI2014]大融合(LCT)

    P4219 [BJOI2014]大融合 对于每个询问$(u,v)$所求的是 ($u$的虚边子树大小+1)*($v$的虚边子树大小+1) 于是我们再开个$si[i]$数组表示$i$的虚边子树大小,维护一 ...

  7. 洛谷_Cx的故事_解题报告_第四题70

    1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h>   struct node {     long x,y,c; ...

  8. 洛谷 P2317 [HNOI2005]星际贸易 解题报告

    P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...

  9. 洛谷 P2606 [ZJOI2010]排列计数 解题报告

    P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...

随机推荐

  1. 【MySQL函数】replace()函数

    1.replace()函数 语法:replace(a,b,c) a的b部分被c替换 案例:select replace(abcde,bcd,123)-- 结果a123e

  2. WPF DataGridTable

    由于项目要显示表头合并,而数据源列随时变更,又不想重复的画表格,就实现动态数据(dynamic)绑定和配置数据列模板的方式 编辑DataGridColumnHeader样式实现表头合并:效果如下 实现 ...

  3. Flask 路由相关操作

    URL Route URL 后接 / 作为目录级访问 URL 后不接 / 作为文件级访问 from flask import Flask app = Flask(__name__) @app.rout ...

  4. python进程-进阶

    进程同步(multiprocessing.Lock(锁机制).multiprocessing.Semaphore(信号量机制).multiprocessing.Event(事件机制)) 在计算机中,有 ...

  5. 001----Mysql隔离级别

    一:事务隔离级别 mysql数据库的隔离界别如下: 1, READ UNCOMMITTED(未提交读) 事务中的修改,即使没有提交,对其它事务也是可见的.  这样会造成脏读(Dirty Read)的问 ...

  6. CSS3实现图片渐入效果

    很多网站都有那种图片渐入的效果,如:http://www.mi.com/minote/,这种效果用css3和一些js实现起来特别简单. 拿我之前做的页面来说一下怎么利用css3来实现图片渐入效果. 下 ...

  7. python 抓取网页(一)

    #-------PYTHON获取网页内容-------------# import sys, urllib url = "http://www.baidu.com" #网页地址 w ...

  8. “取件帮”微信小程序宣传视频链接及内容介绍

    1.视频链接 视频上传至优酷自频道,地址链接:http://v.youku.com/v_show/id_XMzg2NTM3OTc5Ng==.html?spm=a2hzp.8253869.0.0 2.视 ...

  9. Iterable,Iterator和forEach

    Iterable Interface Iterable<T> 方法: Iterator<T> iterator() Returns an iterator over a set ...

  10. 3.结对编程成果报告(小学生四则运算的出题程序,Java实现)

    程序名称:小学生四则运算的出题程序 先附上代码: package com.makequestion; import java.text.DecimalFormat;import java.util.R ...