BZOJ 3319 黑白树 并查集+线段树
这这这这这这什么毒瘤题!!!!!!!!!!!!!!!!!!!!!!!!!!!!
卡LCT(优秀的LCT由于是均摊本身就带着2,3的常数在,而且这道题对于LCT标记十分难维护,又得乘上4,5然后就炸了),卡树剖,卡正解,但是暴力能A!!!!!!!!!!!!!!!!!!!!!!
考试的时候我撸了一发LCT可是.....我忘了rev标记的延迟性会影响到题中所需标记.......我们只有在spaly的时候才会用到pushdown是为了让传上去的东西·真,因为这个pushdown在把信息全部传下去之后也是会真的,但是我们不肯能一个一个下传再把它pushup上去,所以我们要传上去的是真的。因为我们用了标记因此影响他的只有他父亲,这时候我们需要在spaly的时候pushdown,然而这个时候我们等于把123456789 pushdown(fa)之后是678951234 再pushdown(x)之后是678953412,这就是在把x旋到fa的时候只是带着一个标记仍然是 6 9 端点而不是9 6,这就是说如果只是把那个pushdown主体弄成了真的但是他的儿子确实假的,所以我们旋转的时候pushup出来的也是假的!!!
所谓正解就是线段树为护dfs序+并查集删点去重,这东西在每个点一秒的时候都过不了,Po姐都虚。
下面是我改过之后的的TLE程序
#include<cstdio>
#include<cstring>
#include<ctime>
#include<iostream>
#include<cstdlib>
#define MAXN 1000010
using namespace std;
inline int read()
{
int sum=;
char ch=getchar();
while(ch<''||ch>'')ch=getchar();
while(ch>=''&&ch<='')
{
sum=(sum<<)+(sum<<)+ch-'';
ch=getchar();
}
return sum;
}
struct Tr
{
int to,next,id;
}c[MAXN<<];
int head[MAXN],t;
int f[MAXN],fid[MAXN],id[MAXN],l[MAXN],r[MAXN],sz,deep[MAXN];
int fa[MAXN];
inline void add(int x,int y,int z)
{
c[++t].to=y;
c[t].next=head[x];
head[x]=t;
c[t].id=z;
}
void dfs(int x,int FA,int FID,int d)
{
f[x]=FA;
fid[x]=FID;
id[x]=++sz;
l[x]=sz;
for(int i=head[x];i;i=c[i].next)
if(c[i].to!=FA)
{
dfs(c[i].to,x,c[i].id,d+)
deep[c[i].id]=d+;
}
r[x]=sz;
}
struct Seg_Tree
{
struct Node
{
Node *ch[];
int l,r,mid,id;
void pushdown()
{
ch[]->id=deep[id]>deep[ch[]->id]?id:ch[]->id;
ch[]->id=deep[id]>deep[ch[]->id]?id:ch[]->id;
}
}node[MAXN<<],*root;
int sz,n;
Node *New(int l,int r)
{
Node *x=&node[sz++];
x->l=l;
x->r=r;
x->mid=(l+r)>>;
return x;
}
void build(Node *p)
{
if(p->l==p->r)return;
p->ch[]=New(p->l,p->mid);
p->ch[]=New(p->mid+,p->r);
build(p->ch[]);
build(p->ch[]);
}
void Init()
{
root=New(,n);
build(root);
}
void update(Node *p,int l,int r,int id)
{
if(p->l>=l&&p->r<=r)
{
p->id=deep[id]>deep[p->id]?id:p->id;
return;
}
p->pushdown();
if(l<=p->mid)update(p->ch[],l,r,id);
if(p->mid<r)update(p->ch[],l,r,id);
}
int query(Node *p,int pos)
{
if(p->l==p->r)return p->id;
p->pushdown();
return query(pos>p->mid?p->ch[]:p->ch[],pos);
}
}YY;
inline int find(int x)
{
return x==fa[x]?x:(fa[x]=find(fa[x]));
}
inline void unit(int x,int y)
{
fa[find(x)]=find(y);
}
inline void gan(int x,int y)
{
if(find(x)==find(y))return;
if(deep[find(x)]<deep[find(y)])x^=y^=x^=y;
while(deep[find(x)]>deep[find(y)])
{
int X=find(x);
YY.update(YY.root,l[X],r[X],fid[X]);
unit(X,f[X]);
}
while(find(x)!=find(y))
{
if(deep[find(x)]<deep[find(y)])x^=y^=x^=y;
int X=find(x);
YY.update(YY.root,l[X],r[X],fid[X]);
unit(X,f[X]);
}
}
int main()
{
freopen("wbtree.in","r",stdin);
freopen("wbtree.out","w",stdout);
int n=YY.n=read();
YY.Init();
int T=read();
for(int i=;i<n;i++)
{
int x=read(),y=read();
add(x,y,i);
add(y,x,i);
}
dfs(,,,);
for(int i=;i<=n;i++)fa[i]=i;
while(T--)
{
int opt=read(),x=read();
if(opt==)printf("%d\n",YY.query(YY.root,id[x]));
else
{
int y=read();
gan(x,y);
}
}
return ;
}
BZOJ 3319 黑白树 并查集+线段树的更多相关文章
- BZOJ 3910 并查集+线段树合并
思路: 1. 并查集+线段树合并 记得f[LCA]==LCA的时候 f[LCA]=fa[LCA] 2.LCT(并不会写啊...) //By SiriusRen #include <cstdio& ...
- UVA1455 - Kingdom(并查集 + 线段树)
UVA1455 - Kingdom(并查集 + 线段树) 题目链接 题目大意:一个平面内,给你n个整数点,两种类型的操作:road x y 把city x 和city y连接起来,line fnum ...
- 并查集&线段树&树状数组&排序二叉树
超级无敌巨牛逼并查集(带权并查集)https://vjudge.net/problem/UVALive-4487 带删点的加权并查集 https://vjudge.net/problem/UVA-11 ...
- 【Codeforces576E_CF576E】Painting Edges(可撤销并查集+线段树分治)
题目 CF576E 分析: 从前天早上肝到明天早上qwq其实颓了一上午MC ,自己瞎yy然后1A,写篇博客庆祝一下. 首先做这题之前推荐一道很相似的题:[BZOJ4025]二分图(可撤销并查集+线段树 ...
- bzoj 3237 连通图 - 并查集 - 线段树
Input Output Sample Input 4 5 1 2 2 3 3 4 4 1 2 4 3 1 5 2 2 3 2 1 2 Sample Output Connected Disconne ...
- bzoj 2733 永无乡 - 并查集 - 线段树
永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达另一个岛. ...
- 并查集 + 线段树 LA 4730 Kingdom
题目传送门 题意:训练指南P248 分析:第一个操作可以用并查集实现,保存某集合的最小高度和最大高度以及城市个数.运用线段树成端更新来统计一个区间高度的个数,此时高度需要离散化.这题两种数据结构一起使 ...
- YYHS-猜数字(并查集/线段树维护)
题目描述 LYK在玩猜数字游戏. 总共有n个互不相同的正整数,LYK每次猜一段区间的最小值.形如[li,ri]这段区间的数字的最小值一定等于xi. 我们总能构造出一种方案使得LY ...
- luogu5012 水の数列 (并查集+线段树)
如果我们能求出来每个区间个数的最大分值,那就可以用线段树维护这个东西 然后出答案了 然后这个的求法和(luogu4269)Snow Boots G非常类似,就是我们把数大小排个序,每次都拿<=x ...
随机推荐
- Scala语法(二)
(1)类,对象 //定义类(属性.方法),实例化对象 class counter{ *//主构造器 class counter(name:String,mode:Int){ ... } 实例化:val ...
- 使用C6748和C5509A对nRF24L01驱动进行数据传输
1. 写在前面 今天下午做了一个C5509A和C6748两个DSP的数据传输,经由RF24L01设备传输,都是模拟SPI协议,对于两个DSP来说,无非是配GPIO引脚,写好时序和延时.C5509A的G ...
- Django自带后台使用配置
参考官网地址:https://docs.djangoproject.com/en/1.11/ref/contrib/admin/ ,本文章值是介绍简单配置,如果需要详细内容可以查阅官方文档 自动管理界 ...
- 实验吧编程题python
网址:http://ctf5.shiyanbar.com/jia 之后第一步就是刷新一下网页,发现给的公式会变,(废话,要不直接算数不就行了...)但是格式不会变. 所以那就暴力一点好了,我们看一下这 ...
- (数据科学学习手札06)Python在数据框操作上的总结(初级篇)
数据框(Dataframe)作为一种十分标准的数据结构,是数据分析中最常用的数据结构,在Python和R中各有对数据框的不同定义和操作. Python 本文涉及Python数据框,为了更好的视觉效果, ...
- UVa Problem 100 The 3n+1 problem (3n+1 问题)
参考:https://blog.csdn.net/metaphysis/article/details/6431937 #include <iostream> #include <c ...
- 如何打war包
1. 利用jdk里的工具 例如我们要打包的文件在D:\myHome\dist: 运行 cmd: cd D:\myHome\dist 进入D:\myHome\dist 然后输入 D:\myHome\di ...
- Python字符串处理:过滤字符串中的英文与符号,保留汉字
使用Python 的re模块,re模块提供了re.sub用于替换字符串中的匹配项. re.sub(pattern, repl, string, count=0) 参数说明: pattern:正则重的模 ...
- Eclipse中JS文件红叉处理
使用新版本的Eclipse 或者 MyEclipse,项目中的 JS文件出现红叉,让人觉得项目中存在错误代码,给人的感觉很不爽. 记录一下去掉红叉的方法: 第1步: 打开工作空间中的项目找到项目的 . ...
- eclipse 关闭validating
1.起因 validating XXX 总是非常的浪费时间,有时候还会造成程序卡死 2.解决 windows - Perferences - Validation build 全部去掉