这这这这这这什么毒瘤题!!!!!!!!!!!!!!!!!!!!!!!!!!!!

卡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姐都虚。

但是我在网上看到一个大佬有一个神思路A掉了

下面是我改过之后的的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 黑白树 并查集+线段树的更多相关文章

  1. BZOJ 3910 并查集+线段树合并

    思路: 1. 并查集+线段树合并 记得f[LCA]==LCA的时候 f[LCA]=fa[LCA] 2.LCT(并不会写啊...) //By SiriusRen #include <cstdio& ...

  2. UVA1455 - Kingdom(并查集 + 线段树)

    UVA1455 - Kingdom(并查集 + 线段树) 题目链接 题目大意:一个平面内,给你n个整数点,两种类型的操作:road x y 把city x 和city y连接起来,line fnum ...

  3. 并查集&线段树&树状数组&排序二叉树

    超级无敌巨牛逼并查集(带权并查集)https://vjudge.net/problem/UVALive-4487 带删点的加权并查集 https://vjudge.net/problem/UVA-11 ...

  4. 【Codeforces576E_CF576E】Painting Edges(可撤销并查集+线段树分治)

    题目 CF576E 分析: 从前天早上肝到明天早上qwq其实颓了一上午MC ,自己瞎yy然后1A,写篇博客庆祝一下. 首先做这题之前推荐一道很相似的题:[BZOJ4025]二分图(可撤销并查集+线段树 ...

  5. 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 ...

  6. bzoj 2733 永无乡 - 并查集 - 线段树

    永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达另一个岛. ...

  7. 并查集 + 线段树 LA 4730 Kingdom

    题目传送门 题意:训练指南P248 分析:第一个操作可以用并查集实现,保存某集合的最小高度和最大高度以及城市个数.运用线段树成端更新来统计一个区间高度的个数,此时高度需要离散化.这题两种数据结构一起使 ...

  8. YYHS-猜数字(并查集/线段树维护)

    题目描述     LYK在玩猜数字游戏.    总共有n个互不相同的正整数,LYK每次猜一段区间的最小值.形如[li,ri]这段区间的数字的最小值一定等于xi.     我们总能构造出一种方案使得LY ...

  9. luogu5012 水の数列 (并查集+线段树)

    如果我们能求出来每个区间个数的最大分值,那就可以用线段树维护这个东西 然后出答案了 然后这个的求法和(luogu4269)Snow Boots G非常类似,就是我们把数大小排个序,每次都拿<=x ...

随机推荐

  1. ctf题目writeup(8)

    2019.2.11 南京邮电的ctf平台: 地址http://ctf.nuptzj.cn/challenges# 他们好像搭新的平台了...我注册弄了好半天... 1. 签到题,打开网址: 查看一下页 ...

  2. 48-Identity MVC:Model前后端验证

    1-创建RegisterViewModel类 namespace MvcCookieAuthSample.ViewModel { public class RegisterViewModel { [R ...

  3. Java基础——内部类

    一.什么是内部类 将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类 内部类所在的类在编译成功后,会出现这样两个class文件:OuterClass.class和OuterClass$In ...

  4. PHP.41-TP框架商城应用实例-后台16-商品属性2-AJAX添加、删除

     添加商品属性 思路:根据[后台15]类型表{id,type_name}与属性表{id,attr_name,attr_type,attr_option_values,type_id} 1.建表商品属性 ...

  5. vue2018年5月报错No parser and no file path given

    mac电脑直接: rm -rf node_modules rm package-lock.json npm install npm install prettier@~1.12.1 执行完这四个命令, ...

  6. delphi 数据库中Connection与Query连接数量问题思考

    今天闲着没事,测试了一下Connection连接MSSQL,可以承受多少连接.    1.看看ADOConnection的连接数:写了一个代码,动态创建,测试了10000个连接,花了大约5~10分钟创 ...

  7. java容器操作一

    List l = new ArrayList(); l.add(1); l.add("ne"); // 获取 System.out.println(l.get(0)); // 判断 ...

  8. ASP.NET Web API 2 返回 Json格式

    最近在学习ASP.NET的Web API,刚刚开始以为会有些复杂,结果却非常简单. 学习的地址:http://www.asp.net/web-api/overview/getting-started- ...

  9. npx 命令介绍

    这个是在 npmv5.2.0引入的一条命令(查看),引入这个命令的目的是为了提升开发者使用包内提供的命令行工具的体验. 为什么引入这个命令 举个例子,我们开发中要运行 parcel 命令来打包:par ...

  10. Htmlemail邮件发送

    /** * * @param path //发送附件路径 * @param name //附件名称 * @param hostName //邮件服务器名称 * @param port //服务器端口 ...