【刷题】BZOJ 3626 [LNOI2014]LCA
Description
给出一个n个节点的有根树(编号为0到n-1,根节点为0)。一个点的深度定义为这个节点到根的距离+1。
设dep[i]表示点i的深度,LCA(i,j)表示i与j的最近公共祖先。
有q次询问,每次询问给出l r z,求sigma_{l<=i<=r}dep[LCA(i,z)]。
(即,求在[l,r]区间内的每个节点i与z的最近公共祖先的深度之和)
Input
第一行2个整数n q。
接下来n-1行,分别表示点1到点n-1的父节点编号。
接下来q行,每行3个整数l r z。
Output
输出q行,每行表示一个询问的答案。每个答案对201314取模输出
Sample Input
5 2
0
0
1
1
1 4 3
1 4 2
Sample Output
8
5
HINT
共5组数据,n与q的规模分别为10000,20000,30000,40000,50000。
Solution
答案要求:\(\sum_{i=l}^rdep[lca(i,z)]\)
转化答案,我们把 \(l\) 到 \(r\) 中所有的点到根的路径上的所有点权+1,然后答案就变成了 \(z\) 到根的权值之和
这个东西用LCT维护就行了
然后考虑多次询问的问题
我们把询问按 \(l\) (也不尽是 \(l\) )从小到大排好序后,从1到n枚举树上的点加点权的时候,如果有一个询问的 \(l\) 或 \(r\) 正好是当前枚举的点,就记录下来,也就是说,对于每个 \(l\) 或 \(r\) 与当前枚举的点的编号相同的话,就记录一个\(\sum_{j=1}^ivalue_j\)
最后用差分的思想,\(ans[l,r]=ans[1,r]-ans[1,l-1]\)
就可以求答案了
#include<bits/stdc++.h>
#define ll long long
#define db double
#define ld long double
const int MAXN=50000+10,Mod=201314;
int n,q,ans[MAXN];
struct question{
int id,pt,ps,vp;
inline bool operator < (const question &A) const {
return ps<A.ps;
};
};
question Q[MAXN<<1];
#define lc(x) ch[(x)][0]
#define rc(x) ch[(x)][1]
struct LCT{
int ch[MAXN][2],fa[MAXN],rev[MAXN],sum[MAXN],val[MAXN],add[MAXN],stack[MAXN],cnt,size[MAXN];
inline bool nroot(int x)
{
return lc(fa[x])==x||rc(fa[x])==x;
}
inline void reverse(int x)
{
std::swap(lc(x),rc(x));
rev[x]^=1;
}
inline void plus(int x,int k)
{
(sum[x]+=k*size[x]%Mod)%=Mod;
(val[x]+=k)%=Mod;(add[x]+=k)%=Mod;
}
inline void pushup(int x)
{
size[x]=size[lc(x)]+size[rc(x)]+1;
sum[x]=(sum[lc(x)]+sum[rc(x)]+val[x])%Mod;
}
inline void pushdown(int x)
{
if(add[x])
{
if(lc(x))plus(lc(x),add[x]);
if(rc(x))plus(rc(x),add[x]);
add[x]=0;
}
if(rev[x])
{
if(lc(x))reverse(lc(x));
if(rc(x))reverse(rc(x));
rev[x]=0;
}
}
inline void rotate(int x)
{
int f=fa[x],p=fa[f],c=(rc(f)==x);
if(nroot(f))ch[p][rc(p)==f]=x;
fa[ch[f][c]=ch[x][c^1]]=f;
fa[ch[x][c^1]=f]=x;
fa[x]=p;
pushup(f);
pushup(x);
}
inline void splay(int x)
{
cnt=0;
stack[++cnt]=x;
for(register int i=x;nroot(i);i=fa[i])stack[++cnt]=fa[i];
while(cnt)pushdown(stack[cnt--]);
for(register int y=fa[x];nroot(x);rotate(x),y=fa[x])
if(nroot(y))rotate((lc(y)==x)==(lc(fa[y])==y)?y:x);
pushup(x);
}
inline void access(int x)
{
for(register int y=0;x;x=fa[y=x])splay(x),rc(x)=y,pushup(x);
}
inline void makeroot(int x)
{
access(x);splay(x);reverse(x);
}
inline void split(int x,int y)
{
makeroot(x);access(y);splay(y);
}
inline void link(int x,int y)
{
makeroot(x);fa[x]=y;
}
};
LCT T;
#undef lc
#undef rc
template<typename T> inline void read(T &x)
{
T data=0,w=1;
char ch=0;
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
x=data*w;
}
template<typename T> inline void write(T x,char c='\0')
{
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0');
if(c!='\0')putchar(c);
}
template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
template<typename T> inline T min(T x,T y){return x<y?x:y;}
template<typename T> inline T max(T x,T y){return x>y?x:y;}
int main()
{
read(n);read(q);
for(register int i=2;i<=n;++i)
{
int u;read(u);u++;
T.link(i,u);
}
for(register int i=1,l,r,z;i<=q;++i)
{
read(l);read(r);read(z);
l++;r++;z++;
Q[i].ps=l-1;Q[i].pt=-1;Q[i].id=i;Q[i].vp=z;
Q[i+q].ps=r;Q[i+q].pt=1;Q[i+q].id=i;Q[i+q].vp=z;
}
std::sort(Q+1,Q+q*2+1);
for(register int i=1,j=1;i<=n;++i)
{
while(Q[j].ps<i&&j<=q*2)++j;
T.split(1,i);T.plus(i,1);
while(Q[j].ps==i&&j<=q*2)
{
T.split(1,Q[j].vp);
(ans[Q[j].id]+=(Q[j].pt*T.sum[Q[j].vp]%Mod+Mod)%Mod)%=Mod;
++j;
}
}
for(register int i=1;i<=q;++i)write(ans[i],'\n');
return 0;
}
【刷题】BZOJ 3626 [LNOI2014]LCA的更多相关文章
- BZOJ 3626: [LNOI2014]LCA [树链剖分 离线|主席树]
3626: [LNOI2014]LCA Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2050 Solved: 817[Submit][Status ...
- bzoj 3626 [LNOI2014]LCA(离线处理+树链剖分,线段树)
3626: [LNOI2014]LCA Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1272 Solved: 451[Submit][Status ...
- bzoj 3626: [LNOI2014]LCA 离线+树链剖分
3626: [LNOI2014]LCA Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 426 Solved: 124[Submit][Status] ...
- BZOJ 3626: [LNOI2014]LCA( 树链剖分 + 离线 )
说多了都是泪啊...调了这么久.. 离线可以搞 , 树链剖分就OK了... -------------------------------------------------------------- ...
- [BZOJ 3626] [LNOI2014] LCA 【树链剖分 + 离线 + 差分询问】
题目链接: BZOJ - 3626 题目分析 考虑这样的等价问题,如果我们把一个点 x 到 Root 的路径上每个点的权值赋为 1 ,其余点的权值为 0,那么从 LCA(x, y) 的 Depth 就 ...
- bzoj 3626: [LNOI2014]LCA
Description 给出一个n个节点的有根树(编号为0到n-1,根节点为0).一个点的深度定义为这个节点到根的距离+1.设dep[i]表示点i的深度,LCA(i,j)表示i与j的最近公共祖先.有q ...
- P4211[BZOJ 3626] [LNOI2014]LCA
题目描述 给出一个n个节点的有根树(编号为0到n-1,根节点为0).一个点的深度定义为这个节点到根的距离+1. 设dep[i]表示点i的深度,LCA(i,j)表示i与j的最近公共祖先. 有q次询问,每 ...
- BZOJ 3626: [LNOI2014]LCA 树链剖分 线段树 离线
http://www.lydsy.com/JudgeOnline/problem.php?id=3626 LNOI的树链剖分题没有HAOI那么水,学到的东西还是很多的. 我如果现场写,很难想出来这种题 ...
- BZOJ 3626 [LNOI2014]LCA:树剖 + 差分 + 离线【将深度转化成点权之和】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3626 题意: 给出一个n个节点的有根树(编号为0到n-1,根节点为0,n <= 50 ...
随机推荐
- SQL Server 各版本安装包分享
已将SQL Server 2005以上各版本的安装包分享到百度云盘,有需要的朋友可以下载进行安装,相关安装教程可以百度搜索.安装遇到难以解决的问题可以留言给我,2016版以上在选择功能的时候建议初学者 ...
- python3实现合并两个有序数组
很早就听同学和师兄经常说刷题很重要,然而编程能力一直都很渣的我最近才开始从leetcode的初级算法开始.今天遇到的这道题虽然很简单,因为是头一次用自己的方法速度还不错,特此记录一下,还大神们请不要嘲 ...
- RHEL7 利用单个物理网卡实现VLAN
使用nmcli创建网桥配置 #nmcli connection add type bridge con-name br0 stp no 使用nmcli创建VLAN设备配置 #nmcli connect ...
- 2019CSUST集训队选拔赛题解(二)
凛冬将至 Description 维斯特洛大陆的原住民是森林之子,他们长得如孩童一般,善于使用石器,威力值35,用树叶树枝作为衣物,在森林里繁衍生息,与万物和平相处.他们会使用古老的魔法(比如绿之视野 ...
- 【深度学习的实用层面】(一)训练,验证,测试集(Train/Dev/Test sets)
在配置训练.验证.和测试数据集的过程中做出正确的决策会更好地创建高效的神经网络,所以需要对这三个名词有一个清晰的认识. 训练集:用来训练模型 验证集:用于调整模型的超参数,验证不同算法,检验哪种算法更 ...
- e2fsck命令详解
原文链接:https://ipcmen.com/e2fsck Linux e2fsck命令用于检查使用 Linux ext2 档案系统的 partition 是否正常工作. 语法 e2fsck [-p ...
- Git基础级介绍
这篇随笔是在学习了廖雪峰老师的git教程之后写的总结,要看详细的基础级git介绍可以去http://www.liaoxuefeng.com/wiki/0013739516305929606dd1836 ...
- 2-Eighth Scrum Meeting20151208
任务分配 闫昊: 今日完成:和唐彬讨论研究上届的网络接口代码. 明日任务:商讨如何迁移ios代码到android平台. 唐彬: 今日完成:和闫昊讨论研究上届的网络接口代码. 明日任务:商讨如何迁移io ...
- 2-Fourth Scrum Meeting20151204
任务安排 闫昊: 今日完成:设计本地数据库. 明日任务:请假.(最近代码写得多……很累……) 唐彬: 今日完成:ios客户端代码的了解. 明日任务:ios客户端代码的深度学习. 史烨轩: 今日完成: ...
- 安卓端通过http对Mysql进行增删改查
各类it学习视频,大家都可以看看哦!我自己本人都是通过这些来学习it只知识的! 下面是视频链接转自:http://www.cnblogs.com/yzxk/p/4749440.html Android ...