loj2230 「BJOI2014」大融合
LCT裸题
我LCT学傻了这题明显可以树剖我不会树剖了
本来的siz是Splay上的子树和,并没有什么用。
所以每个点维护虚子树和和子树和
虚子树和即虚边连接的子树和,且只有在access和link操作更改。
注意link操作
原来的link:
void link(int a,int b){makeroot(a);father[a]=b;}
现在的link:
//siz[i] i的子树和
//_siz[i] i的虚子树和
void link(int a,int b){makeroot(a);father[a]=b;_siz[b]+=siz[a];update(b);}
然而上面是错的,因为a会成为b和b所有爸爸的虚子树和,你只更新了b。你错了。(滑稽)
所以要先把b也放到根。
void link(int a,int b){makeroot(a);makeroot(b);father[a]=b;_siz[b]+=siz[a];update(b);}
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cctype>
using namespace std;
#define rg register
#define il inline
#define sta static
#define vd void
il int gi(){
sta int x,flg;sta char ch;
x=flg=0,ch=getchar();
while(!isdigit(ch)){if(ch=='-')flg=-1;ch=getchar();}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return flg?-x:x;
}
const int maxn=100001;
int ch[maxn][2],fa[maxn],siz[maxn],_siz[maxn];
bool rev[maxn];
typedef const int& fast;
il bool isrt(fast x){return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;}
il vd upd(fast x){if(x)siz[x]=siz[ch[x][0]]+siz[ch[x][1]]+1+_siz[x];}
il vd Rev(fast x){if(x)rev[x]^=1,std::swap(ch[x][0],ch[x][1]);}
il vd down(fast x){
if(!isrt(x))down(fa[x]);
if(rev[x])Rev(ch[x][0]),Rev(ch[x][1]),rev[x]=0;
}
il vd rotate(fast x){
sta int y,z,o;y=fa[x],z=fa[y],o=ch[y][1]==x;
if(!isrt(y))ch[z][ch[z][1]==y]=x;fa[x]=z;
ch[y][o]=ch[x][!o];fa[ch[x][!o]]=y;
fa[y]=x,ch[x][!o]=y;
upd(y);
}
il vd splay(fast x){
down(x);
sta int y,z;
for(y=fa[x],z=fa[y];!isrt(x);rotate(x),y=fa[x],z=fa[y])
if(!isrt(y))rotate(((ch[y][0]==x)^(ch[z][0]==y))?x:y);
upd(x);
}
il vd access(int x){for(rg int y=0;x;x=fa[y=x])splay(x),_siz[x]+=siz[ch[x][1]]-siz[y],ch[x][1]=y,upd(x);}
il vd makert(fast x){access(x),splay(x),Rev(x);}
il vd link(fast x,fast y){makert(x),makert(y),fa[x]=y,_siz[y]+=siz[x],upd(y);}
il vd split(fast x,fast y){makert(x),access(y),splay(y);}
int main(){
#ifndef ONLINE_JUDGE
freopen("in.in","r",stdin);
freopen("out.out","w",stdout);
#endif
int n=gi(),q=gi(),x,y;char opt[3];
for(rg int i=1;i<=n;++i)siz[i]=1;
while(q--){
scanf("%s",opt);x=gi(),y=gi();
if(opt[0]=='A')link(x,y);
else split(x,y),printf("%lld\n",1ll*siz[x]*(siz[y]-siz[x]));
}
return 0;
}
loj2230 「BJOI2014」大融合的更多相关文章
- LOJ#2230. 「BJOI2014」大融合
LOJ#2230. 「BJOI2014」大融合 题目描述 小强要在$N$个孤立的星球上建立起一套通信系统.这套通信系统就是连接$N$个点的一个树.这个树的边是一条一条添加上去的. 在某个时刻,一条边的 ...
- 【LOJ】#2230. 「BJOI2014」大融合
题解 我现在真是太特么老年了 一写数据结构就颓废,难受 这题就是用lct维护子树 ???lct怎么维护子树 这样想,我们给每个点记录虚边所在的子树大小,只发生在Access和link的时候 这样的话我 ...
- Loj 2230. 「BJOI2014」大融合 (LCT 维护子树信息)
链接:https://loj.ac/problem/2230 思路: 设立siz数组保存虚点信息,sum表示总信息 维护子树信息link操作和access操作需要进行一些改动 可参考博客:https: ...
- 「ZJOI2016」大森林 解题报告
「ZJOI2016」大森林 神仙题... 很显然线段树搞不了 考虑离线操作 我们只搞一颗树,从位置1一直往后移动,然后维护它的形态试试 显然操作0,1都可以拆成差分的形式,就是加入和删除 因为保证了操 ...
- @loj - 2092@ 「ZJOI2016」大森林
目录 @description@ @solution@ @accepted code@ @details@ @description@ 小 Y 家里有一个大森林,里面有 n 棵树,编号从 1 到 n. ...
- LOJ2229. 「BJOI2014」想法(随机化)
题目链接 https://loj.ac/problem/2229 题解 评分标准提示我们可以使用随机化算法. 首先,我们为每一道编号在 \([1, m]\) 以内的题目(这些题目也对应了 \(m\) ...
- 【BJOI2014】大融合【LCT】
闲着没事写篇题解 传送门 LCT维护子树的模板题 树链剖分中,子树可以用dfs序维护.但LCT你总不可能动态维护dfs序啊 LCT之所以不能直接维护子树,是因为LCT只能维护它的重儿子.我们把这棵子树 ...
- loj2092 「ZJOI2016」大森林
ref不是太懂-- #include <algorithm> #include <iostream> #include <cstring> #include < ...
- 「HEOI2014」大工程
问题分析 首先不难想到是虚树.建完虚树需要保持节点间原先的距离关系. 然后总距离和最小距离用树形DP求,最大距离用两遍dfs即可.注意统计的时候只对关键点进行统计. 真是麻烦 参考程序 ac的时候是l ...
随机推荐
- Linux 系统的网络配置文件
系统的网络配置文件 方式一: 界面操作 setup -->界面配置网络,网关等 方式二: 修改配置文件 # 修改配置 vim /etc/sysconfig/network-scripts/ifc ...
- Matlab 之meshgrid, interp, griddata 用法和实例(转)
http://blog.sina.com.cn/s/blog_67f37e760101bu4e.html 实例结果http://wenku.baidu.com/link?url=SiGsFZIxuS1 ...
- September 05th 2017 Week 36th Tuesday
I always in the deepest despair, meet the most beautiful sunrise. 我总是在最深的绝望里遇见最美丽的惊喜. Some pessimist ...
- Spring 容器介绍
Spring 框架的实现依赖 IoC (反向控制) 原则,更为形象的称呼是 DI (依赖注入).相对于 Bean 直接构造依赖的对象,Spring 框架则根据 Bean之间的依赖关系创建对象,并注入到 ...
- TeamViewer app案例分析
产品 产品名 TeamViewer远程app 选择原因 远程连接软件是不时之需,当有时私人电脑没有在身边而又需要操作电脑时,远程控制TeamViewer这个软件能帮我们大忙. 调研与评测 1.第一次上 ...
- springboot+mybatis+mysql创建简单web后台项目
第一步:搭建框架 新建进入这个页面 新建名字,第一次可以默认,然后下一步 第三步:选择依赖 第四步:新建项目名和存放项目路径(你可以新建一个文件夹存放) 点击finish,首次创建Springboot ...
- Android混合式开发(Hybrid)
安卓混合式开发(Hybrid) 1 环境搭建 1.1 首先,下载 Android Studio (Intellij Idea) 下载地址:http://www.android-studio.org/ ...
- 【原创】Spring 注入方式
Spring 强烈推荐注解在构造器上,且对于不能为null的字段或者属性都用断言. 1. 设值注入 原理:通过setter方法注入 XML配置方式:bean下的property标签,用value指定基 ...
- [转]地图投影的N种姿势
此处直接给出原文链接: 1.地图投影的N种姿势 2.GIS理论(墨卡托投影.地理坐标系.地面分辨率.地图比例尺.Bing Maps Tile System)
- PAT乙级1006
1006 换个格式输出整数 (15 分) 让我们用字母 B 来表示“百”.字母 S 表示“十”,用 12...n 来表示不为零的个位数字 n(<10),换个格式来输出任一个不超过 3 位的正 ...