热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

洛谷P4219[BJOI2014]大融合【LCT维护子树】

时空限制1000ms128MB题目描述小强要在N个孤立的星球上建立起一套通信系统。这套通信系统就是连接N个点的一个树。这个树的边是一条一条添加上去的。在某个时刻,

时空限制 1000ms / 128MB


题目描述

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


输入格式:

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

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

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


输出格式:

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


说明

对于所有数据,1≤N,Q≤1051≤N,Q≤10^51N,Q105




题目分析

题目中涉及动态加边的操作,所以马上想到LCT
但是LCT只擅长维护链信息,而此题要求维护子树,这就涉及到了LCT一个新的巧妙变化

先做两个定义


  • 实儿子:结点xxxsplaysplaysplay中的儿子
  • 虚儿子:与结点xxx在原树中直接相连但在xxx不在同一个splaysplaysplay

结合LCT的特性我们又知道以下几点


  • xxx与它的实儿子在原图中不一定有直接连边
  • splaysplaysplay维护树链的信息都是维护实儿子的信息
  • xxx的实儿子信息包括了实儿子的虚儿子和实儿子的实儿子

那么为了得知xxx原树中子树的信息我们可以


  • access(x)access(x)access(x)后返回xxx虚儿子的信息

这是因为access(x)access(x)access(x)后会使xxx没有实儿子

那么为了为了维护虚实儿子的信息,一些涉及虚实儿子转换的LCT函数就需要修改
以此题中维护子树大小为例,Ts[x]Ts[x]Ts[x]xxx虚儿子信息,size[x]size[x]size[x]为原树信息总和

Ts[x]Ts[x]Ts[x]只包含x所有虚儿子(通过轻边指向x)的信息总和
size[x]size[x]size[x]实际上是xxxLCTLCTLCT中的所有儿子的信息总和(包括辅助树Splay左右儿子的总和以及被轻边所指的虚儿子的总和)

那么要修改的函数应该有三个
首先access(x)access(x)access(x)肯定要改

void access(int x)
{int t=0;while(x){splay(x);Ts[x]+=size[ch[x][1]]-size[t];//加上由实儿子变成虚儿子的size,减去虚儿子变成实儿子的sizech[x][1]=t;update(x);t=x; x=fa[x];}
}

link(x,y)link(x,y)link(x,y)使得x,yx,yx,y之间多了一条轻边,即xxx变成了yyy的虚儿子,所以TsTsTs肯定要改
还有一处不同是mkrt(y)mkrt(y)mkrt(y),因为连边后yyy到其splaysplaysplay根路径上的结点信息都会改变,这么做省去更新的麻烦


void match(int x,int y)
{mkrt(x); mkrt(y);fa[x]=y;Ts[y]+=size[x];
}

最后就是更新函数

void update(int x)
{int lc=ch[x][0],rc=ch[x][1];size[x]=size[lc]+size[rc]+Ts[x]+1;//sum[x]=sum[lc]+size[rc]+Tsum[x]+val[x];//权值总和
}

还有一个cut(x,y)cut(x,y)cut(x,y)似乎也涉及断边?
事实上cut(x,y)cut(x,y)cut(x,y)断掉的是重边,也就是实儿子间断开,并不影响虚儿子信息更新



知道了这么多,这题其实也就挺裸了
查询也很简单

mkrt(u); access(v); splay(v);
printf("%lld\n",(Ts[u]+1ll)*(Ts[v]+1ll));

完整代码

#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long lt;int read()
{int f&#61;1,x&#61;0;char ss&#61;getchar();while(ss<&#39;0&#39;||ss>&#39;9&#39;){if(ss&#61;&#61;&#39;-&#39;)f&#61;-1;ss&#61;getchar();}while(ss>&#61;&#39;0&#39;&&ss<&#61;&#39;9&#39;){x&#61;x*10&#43;ss-&#39;0&#39;;ss&#61;getchar();}return x*f;
}const int maxn&#61;500010;
int n,m;
int fa[maxn],ch[maxn][2];
int lzy[maxn],st[maxn],cnt;
lt Ts[maxn],size[maxn];
char ss[5];int isrt(int x)
{return ch[fa[x]][0]!&#61;x&&ch[fa[x]][1]!&#61;x;
}void push(int x)
{if(!lzy[x]) return;swap(ch[x][0],ch[x][1]);lzy[ch[x][0]]^&#61;1; lzy[ch[x][1]]^&#61;1;lzy[x]&#61;0;
}void update(int x)
{int lc&#61;ch[x][0],rc&#61;ch[x][1];size[x]&#61;size[lc]&#43;size[rc]&#43;Ts[x]&#43;1;
}void rotate(int x)
{int y&#61;fa[x],z&#61;fa[y];int d&#61;(ch[y][0]&#61;&#61;x);if(!isrt(y)){if(ch[z][0]&#61;&#61;y) ch[z][0]&#61;x;else ch[z][1]&#61;x;}fa[y]&#61;x; fa[ch[x][d]]&#61;y; fa[x]&#61;z;ch[y][d^1]&#61;ch[x][d]; ch[x][d]&#61;y;update(y); update(x);
}void splay(int x)
{int top&#61;0; st[&#43;&#43;top]&#61;x;for(int i&#61;x;!isrt(i);i&#61;fa[i])st[&#43;&#43;top]&#61;fa[i];while(top) push(st[top--]);while(!isrt(x)){int y&#61;fa[x],z&#61;fa[y];if(!isrt(y)){if((ch[z][0]&#61;&#61;y)^(ch[y][0]&#61;&#61;x)) rotate(x);else rotate(y);}rotate(x);}
}void access(int x)
{int t&#61;0;while(x){splay(x);Ts[x]&#43;&#61;size[ch[x][1]]-size[t];ch[x][1]&#61;t;update(x);t&#61;x; x&#61;fa[x];}
}void mkrt(int x)
{access(x); splay(x);lzy[x]^&#61;1;
}void match(int x,int y)
{mkrt(x); mkrt(y);fa[x]&#61;y;Ts[y]&#43;&#61;size[x];
}int main()
{n&#61;read(); m&#61;read();for(int i&#61;1;i<&#61;n;&#43;&#43;i) size[i]&#61;1;for(int i&#61;1;i<&#61;m;&#43;&#43;i){scanf("%s",&ss);int u&#61;read(),v&#61;read();if(ss[0]&#61;&#61;&#39;A&#39;) match(u,v);else if(ss[0]&#61;&#61;&#39;Q&#39;){mkrt(u); access(v); splay(v);printf("%lld\n",(Ts[u]&#43;1ll)*(Ts[v]&#43;1ll));}}return 0;
}

推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
author-avatar
手机用户2602921613
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有