题目:https://www.luogu.org/problemnew/show/P4115

论文:https://wenku.baidu.com/view/1bc2e4ea172ded630b1cb602.html

重链剖分,分别用线段树维护每条重链。线段树叶子的信息是该点轻孩子的信息;线段树区间的信息是考虑重链的一个区间以及附带的轻孩子们的信息。

修改一个点,改它所在的重链的信息。祖先的每条重链都有一个点的 “轻孩子信息” 改变了,改一下那个位置的值,更新它的线段树,再用该重链的信息作为轻孩子更新更上面的重链。

本题每个点要维护的是 “向下以白点为端点的最长链” 和 “向下以白点为端点的次长链” 。用可删堆维护。

线段树区间维护 “从左边开始、以白点结束的最长链” 、 “从右边开始、以白点结束的最长链” 、 “中间一条两端点都是白点的最长链” 。前两个信息是为了更新第三个信息。

每条重链的答案放进全局可删堆中。

注意求 “次长链” 的时候,自己是先把堆顶拿出来,再看剩下的堆的堆顶。要注意再看之前先用删除堆更新一下!

预处理的时候,自己想一个一个插入。在 pshp 的时候要用到兄弟的 fl , fr , pr , sc 等信息。所以得先把线段树整个建出来,不能有些孩子是空的就开始 pshp 。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define ls Ls[cr]
#define rs Rs[cr]
using namespace std;
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return fx?ret:-ret;
}
int Mx(int a,int b){return a>b?a:b;}
int Mn(int a,int b){return a<b?a:b;}
const int N=1e5+,M=2e5+,INF=1e9,Lm=-1e8;
int n,hd[N],xnt,to[M],nxt[M],w[M]; bool col[N];
int siz[N],son[M],dep[N],fa[N],fw[N],top[N];
int dis[N],dp2[N],lm[N],tot,rt[N],Ls[M],Rs[M];
int dy[N],fl[M],fr[M],mx[M],pr[M],sc[M];
priority_queue<int> q[N],dq[N],ans,dans;
int Dis(int x,int y){return dp2[y]-dp2[x];}
void frs(int x)
{
while(dq[x].size()&&q[x].top()==dq[x].top())
q[x].pop(), dq[x].pop();
}
void pshp(int cr)
{
pr[cr]=pr[ls]; sc[cr]=sc[rs];
fl[cr]=Mx(fl[ls],Dis(pr[cr],pr[rs])+fl[rs]);
fr[cr]=Mx(fr[rs],Dis(sc[ls],sc[cr])+fr[ls]);
mx[cr]=Mx(Dis(sc[ls],pr[rs])+fr[ls]+fl[rs],Mx(mx[ls],mx[rs]));
}
void build(int l,int r,int &cr)
{
cr=++tot;fl[cr]=fr[cr]=mx[cr]=-INF;
pr[cr]=dy[l]; sc[cr]=dy[r];
if(l==r)return; int mid=l+r>>;
build(l,mid,ls); build(mid+,r,rs);
}
void updt(int l,int r,int cr,int p,int k)
{
if(l==r)
{
fl[cr]=fr[cr]=dis[k]; pr[cr]=sc[cr]=k;
if(!q[k].size()){ mx[cr]=-INF; return;}
q[k].pop(); frs(k);//////
int d2=-INF;
if(q[k].size())d2=q[k].top();
if(!col[k])mx[cr]=Mx(dis[k]+d2,Mx(dis[k],d2));
//col[k] not col[cr]!!
else mx[cr]=dis[k]+d2;
q[k].push(dis[k]);
return;
}
int mid=l+r>>;
if(p<=mid)updt(l,mid,ls,p,k); else updt(mid+,r,rs,p,k);
pshp(cr);
}
void add(int x,int y,int z)
{to[++xnt]=y;nxt[xnt]=hd[x];hd[x]=xnt;w[xnt]=z;}
void dfs(int cr,int f)
{
dep[cr]=dep[f]+; dp2[cr]=dp2[f]+fw[cr];
fa[cr]=f; siz[cr]=;
for(int i=hd[cr],v;i;i=nxt[i])
if((v=to[i])!=f)
{
fw[v]=w[i]; dfs(v,cr); siz[cr]+=siz[v];
if(siz[v]>siz[son[cr]])son[cr]=v;
}
}
int Ps(int cr){return dep[cr]-dep[top[cr]]+;}
void dfsx(int cr,int f)
{
if(son[cr])top[son[cr]]=top[cr],dfsx(son[cr],cr);
for(int i=hd[cr],v;i;i=nxt[i])
if((v=to[i])!=f&&v!=son[cr])
{
top[v]=v;dfsx(v,cr);
if(fl[rt[v]]>Lm)q[cr].push(fl[rt[v]]+w[i]);
}
if(!col[cr])q[cr].push();
if(q[cr].size())dis[cr]=q[cr].top(); else dis[cr]=-INF;
int p=Ps(cr),tp=top[cr];
if(p>lm[tp])
{
lm[tp]=p;
for(int i=p,k=cr;i;i--,k=fa[k])dy[i]=k;
build(,p,rt[tp]);
}
updt(,lm[tp],rt[tp],p,cr);
if(tp==cr)ans.push(mx[rt[cr]]);
}
void chg(int cr)
{
col[cr]=!col[cr];
if(!col[cr])q[cr].push(); else dq[cr].push();
int x=top[cr]; frs(cr);
if(q[cr].size())dis[cr]=q[cr].top(); else dis[cr]=-INF;
dans.push(mx[rt[x]]);
if(fa[x])dq[fa[x]].push(fl[rt[x]]+fw[x]);
updt(,lm[x],rt[x],Ps(cr),cr);
ans.push(mx[rt[x]]);
if(fa[x])q[fa[x]].push(fl[rt[x]]+fw[x]);
while(fa[x])
{
cr=fa[x]; x=top[cr]; frs(cr);
if(q[cr].size())dis[cr]=q[cr].top(); else dis[cr]=-INF;
dans.push(mx[rt[x]]);
if(fa[x])dq[fa[x]].push(fl[rt[x]]+fw[x]);
updt(,lm[x],rt[x],Ps(cr),cr);
ans.push(mx[rt[x]]);
if(fa[x])q[fa[x]].push(fl[rt[x]]+fw[x]);
}
}
int main()
{
n=rdn();
for(int i=,u,v,z;i<n;i++)
{
u=rdn();v=rdn();z=rdn();
add(u,v,z);add(v,u,z);
}
dfs(,); top[]=; dfsx(,);
int Q=rdn(); char ch;int x;
while(Q--)
{
cin>>ch;
if(ch=='A')
{
while(dans.size()&&ans.top()==dans.top())
ans.pop(),dans.pop();
if(ans.top()<Lm)puts("They have disappeared.");
else printf("%d\n",ans.top());
}
else
{ x=rdn(); chg(x);}
}
return ;
}

洛谷 4115 Qtree4——链分治的更多相关文章

  1. 洛谷.4115.Qtree4/BZOJ.1095.[ZJOI2007]Hide捉迷藏(动态点分治 Heap)

    题目链接 洛谷 SPOJ BZOJ1095(简化版) 将每次Solve的重心root连起来,会形成一个深度为logn的树,就叫它点分树吧.. 我们对每个root维护两个东西: 它管辖的子树中所有白点到 ...

  2. 洛谷 P2056 [ZJOI2007]捉迷藏 || bzoj 1095: [ZJOI2007]Hide 捉迷藏 || 洛谷 P4115 Qtree4 || SP2666 QTREE4 - Query on a tree IV

    意识到一点:在进行点分治时,每一个点都会作为某一级重心出现,且任意一点只作为重心恰好一次.因此原树上任意一个节点都会出现在点分树上,且是恰好一次 https://www.cnblogs.com/zzq ...

  3. 洛谷P3810 陌上花开 CDQ分治(三维偏序)

    好,这是一道三维偏序的模板题 当然没那么简单..... 首先谴责洛谷一下:可怜的陌上花开的题面被无情的消灭了: 这么好听的名字#(滑稽) 那么我们看了题面后就发现:这就是一个三维偏序.只不过ans不加 ...

  4. 【算法学习】【洛谷】树链剖分 & P3384 【模板】树链剖分 P2146 软件包管理器

    刚学的好玩算法,AC2题,非常开心. 其实很早就有教过,以前以为很难就没有学,现在发现其实很简单也很有用. 更重要的是我很好调试,两题都是几乎一遍过的. 介绍树链剖分前,先确保已经学会以下基本技巧: ...

  5. 洛谷P3384 树链剖分

    如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式: 2 x ...

  6. [洛谷P3806] [模板] 点分治1

    洛谷 P3806 传送门 这个点分治都不用减掉子树里的了,直接搞就行了. 注意第63行 if(qu[k]>=buf[j]) 不能不写,也不能写成>. 因为这个WA了半天...... 如果m ...

  7. 洛谷 P3384 树链剖分(模板题)

    题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式 ...

  8. 【树链剖分】洛谷P3379 树链剖分求LCA

    题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...

  9. 洛谷P4390 Mokia CDQ分治

    喜闻乐见的CDQ分治被我搞的又WA又T..... 大致思路是这样的:把询问用二维前缀和的思想拆成4个子询问.然后施CDQ大法即可. 我却灵光一闪:树状数组是可以求区间和的,那么我们只拆成两个子询问不就 ...

随机推荐

  1. (转)ArcGIS Runtime for Android 使用异步GP服务绘制等值线

    关于基于Android上ArcGIS Server GP服务的调用,已经有前辈给出了很好的例子: http://blog.csdn.net/esrichinacd/article/details/92 ...

  2. Beta冲刺前的准备

    Beta冲刺前准备 1.讨论组长否重选的议题和结论 经过团队讨论,不重选组长.我们团队在队长的带领下积极完成任务,使得团队项目初具模型.经过alpha阶段,我们的团队从一开始的零散到如今的凝聚,通力合 ...

  3. Windows Server 2012系统上安装.net framework3.5教程

    1.先下载WIN2012R2安装NET3.5的专用数据源 https://pan.baidu.com/s/1bqiUTyR 提取码h09k 并解压,比如解压到桌面,解压后的路径为C:\Users\Ad ...

  4. 搭建、访问ftp

    FTP是文件传输协议,是在网络上进行文件传输的协议,使用的是C/S模式,属于网络传输协议的应用层.FTP是讲文件从一台计算机传送到另一台计算机上,不受操作系统的限制,TCP端口号是21,数据库端口号是 ...

  5. Delphi编程之好用的三方控件

    Delphi的强大与其庞大的组件库息息相关,目前的XE10.1版本已自带FastReport和GDI+等,下面我们来看一下几个非常强大且实用的组件库 一.DevExpress套件 Dev包含Grid. ...

  6. random模块(随机数)

    random.random() #0-1之间的随机数 random.randint(1,10) #1-10 包括10的随机数 --> int random.choice(list) #随机选取列 ...

  7. 简单几步,教你学会PHP,新手必看!

    学习php的方法,学东西,永远不要妄想有速成这一说,告诉你了一个方式,但是缺少努力这一环节,那也是白搭.掌握好的学习方法非常必要,看看这篇如何学习PHP培训的方法,在此提醒一下大家,PHP不像别的科目 ...

  8. JVM学习二:垃圾收集(Garbage Collection,GC)机制

    JVM的GC分为两个主要部分,第一部分是判断对象是否已死(堆内存的垃圾回收占主要部分,方法区(metaspace)的内存回收在最新的官方文档中未给出详细解释,暂时不做讨论范围),第二部分是对内存区进行 ...

  9. Altium Designer 10 执行DRC发现有 Length Constraint 解决办法

    在PCB布局连线结束后,执行DRC,结果Length Constraint 报错,如图: 在Design Rules中找对应的规则约束,怎么也找不见. 其实是,在差分对进行等长蛇形绕线的步骤中,约束了 ...

  10. 【EMV L2】2CS.001.00 ~ 2CS.007.00

    测试case要求,对于T=0和T=1卡,命令中是否存在Le是有差异的: - Select: Mandatory Command00 A4 04 00 Lc Command Data LeLc = 05 ...