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 ...
随机推荐
- Python学习 :深浅拷贝
深浅拷贝 一.浅拷贝 只拷贝第一层数据(不可变的数据类型),并创建新的内存空间进行储蓄,例如:字符串.整型.布尔 除了字符串以及整型,复杂的数据类型都使用一个共享的内存空间,例如:列表 列表使用的是同 ...
- django之单表查询
一.创建表 1.创建模型: 创建名为book的app,在book下的models.py中创建模型: from django.db import models # Create your models ...
- Sql Server 游标概念与实例
引言 先不讲游标的什么概念,看如下Sql Server2008 图例: 需求:两张表的O_ID是一一对应的,现在求将加薪的工资+原来的工资=现在的工资,也就是O_Salary=O_Salary+A_S ...
- java 堆栈内存分析详解
计算机术语里面堆和栈代表不同的存储结构:stack-栈:heap-堆 所以java虚拟机(JVM)中堆和栈是两种内存 堆.栈对比 对比点 堆 栈 JVM中的功能 内存数据区 内存指令区 动静态 运行时 ...
- 开启一个项目如何上传到git
1.(先进入项目文件夹)通过命令 git init 把这个目录变成git可以管理的仓库 git init 2.把文件添加到版本库中,使用命令 git add .添加到暂存区里面去,不要忘记后面的小数点 ...
- Hibernate-ORM:16.Hibernate中的二级缓存Ehcache的配置
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客讲述Hibernate中的二级缓存的配置,作者将使用的是ehcache缓存 一,目录 1.二级缓存的具 ...
- 触发显示和隐藏 div
<script> window.onload = function(){ var oDiv1 = document.getElementById("div1"); va ...
- 通过数据库恢复SharePoint网站
SharePoint网站一般包含很多个数据库,最主要的有3个,分别是SharePoint_Admin_Content(管理中心数据库),SharePoint_Config(配置数据库)和 ...
- [转]Visual Studio 项目类型 GUID 清单
转自:https://www.codeproject.com/Reference/720512/List-of-Visual-Studio-Project-Type-GUIDs Complete li ...
- Android PopupWindow 疑难杂症之宽度WRAP_CONTENT
一直以来都觉得 Android 中的 PopupWindow 不好用.主要有以下两点:1.宽度不好控制2.位置不好控制 今天单说第1点. 由于应用有好几种国家的语言,加上各设备宣染效果不完全一样,对p ...