[LNOI2014]LCA

题意

给一个\(n(\le 50000)\)节点的有根树,询问\(l,r,z\),求\(\sum_{l\le i\le r}dep[lca(i,z)]\)


一直想启发式合并...

关于LCA的深度,有一个转换。

比如询问\((x,y)\)的\(lca\)深度,可以把\(x\)到跟每个点染色+1,然后查询\(y\)到根的权值。

这个题离线进行差分,每次加一个点染色求前缀询问即可。


Code:

#include <cstdio>
#include <cctype>
#include <vector>
const int N=5e5+10;
const int mod=201314;
int read()
{
int x=0;char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) x=x*10+c-'0',c=getchar();
return x;
}
int n,q,ans[N];
int head[N],to[N],Next[N],cnt;
void add(int u,int v)
{
to[++cnt]=v,Next[cnt]=head[u],head[u]=cnt;
}
int dfn[N],top[N],f[N],siz[N],ws[N],dfsclock;
void dfs1(int now)
{
siz[now]=1;
for(int v,i=head[now];i;i=Next[i])
{
f[v=to[i]]=now;
dfs1(v);
siz[now]+=siz[v];
if(siz[ws[now]]<siz[v]) ws[now]=v;
}
}
void dfs2(int now,int anc)
{
top[now]=anc;
dfn[now]=++dfsclock;
if(ws[now]) dfs2(ws[now],anc);
for(int v,i=head[now];i;i=Next[i])
if(!dfn[v=to[i]])
dfs2(v,v);
}
int sum[N<<2],tag[N<<2];
#define ls id<<1
#define rs id<<1|1
void pushdown(int id,int L,int R)
{
if(tag[id])
{
int Mid=L+R>>1;
(sum[ls]+=1ll*tag[id]*(Mid+1-L))%=mod;
(sum[rs]+=1ll*tag[id]*(R-Mid))%=mod;
tag[ls]+=tag[id],tag[rs]+=tag[id];
tag[id]=0;
}
}
void change(int id,int L,int R,int l,int r)
{
if(l==L&&r==R)
{
(sum[id]+=R+1-L)%=mod;
++tag[id];
return;
}
pushdown(id,L,R);
int Mid=L+R>>1;
if(r<=Mid) change(ls,L,Mid,l,r);
else if(l>Mid) change(rs,Mid+1,R,l,r);
else change(ls,L,Mid,l,Mid),change(rs,Mid+1,R,Mid+1,r);
sum[id]=sum[ls]+sum[rs];
}
int query(int id,int L,int R,int l,int r)
{
if(l==L&&r==R) return sum[id];
pushdown(id,L,R);
int Mid=L+R>>1;
if(r<=Mid) return query(ls,L,Mid,l,r);
else if(l>Mid) return query(rs,Mid+1,R,l,r);
else return (query(ls,L,Mid,l,Mid)+query(rs,Mid+1,R,Mid+1,r))%mod;
}
void modify(int now)
{
while(top[now]!=top[1])
{
change(1,1,n,dfn[top[now]],dfn[now]);
now=f[top[now]];
}
change(1,1,n,1,dfn[now]);
}
int ask(int now)
{
int ret=0;
while(top[now]!=top[1])
{
(ret+=query(1,1,n,dfn[top[now]],dfn[now]))%=mod;
now=f[top[now]];
}
(ret+=query(1,1,n,1,dfn[now]))%=mod;
return ret;
}
struct node{int id,z;}bee;
std::vector<node> qry[N];
int main()
{
n=read(),q=read();
for(int i=2;i<=n;i++) add(read()+1,i);
dfs1(1),dfs2(1,1);
for(int l,r,i=1;i<=q;i++)
{
l=read()+1,r=read()+1,bee.z=read()+1,bee.id=-i;
qry[l-1].push_back(bee);
bee.id=i;
qry[r].push_back(bee);
}
for(int i=1;i<=n;i++)
{
modify(i);
for(int j=0;j<qry[i].size();j++)
{
int id=qry[i][j].id,z=qry[i][j].z;
if(id>0) ans[id]+=ask(z);
else ans[-id]-=ask(z);
}
}
for(int i=1;i<=q;i++)
printf("%d\n",(ans[i]+mod)%mod);
return 0;
}

2019.2.1

洛谷 P4211 [LNOI2014]LCA 解题报告的更多相关文章

  1. 洛谷$P4211\ [LNOI2014]\ LCA$ 树链剖分+线段树

    正解:树剖+线段树 解题报告: 传送门$QwQ$ 看到$dep[lca]$啥的就想到之前托腮腮$CSP$模拟$D1T3$的那个套路,,, 然后试下这个想法,于是$dep[lca(x,y)]=\sum_ ...

  2. 洛谷 P4211 [LNOI2014]LCA (树链剖分+离线)

    题目:https://www.luogu.org/problemnew/solution/P4211 相当难的一道题,其思想难以用言语表达透彻. 对于每个查询,区间[L,R]中的每个点与z的lca肯定 ...

  3. 洛谷 P1783 海滩防御 解题报告

    P1783 海滩防御 题目描述 WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和仓库总是被敌方派人偷袭 ...

  4. 洛谷 P4597 序列sequence 解题报告

    P4597 序列sequence 题目背景 原题\(\tt{cf13c}\)数据加强版 题目描述 给定一个序列,每次操作可以把某个数\(+1\)或\(-1\).要求把序列变成非降数列.而且要求修改后的 ...

  5. 洛谷1087 FBI树 解题报告

    洛谷1087 FBI树 本题地址:http://www.luogu.org/problem/show?pid=1087 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全 ...

  6. 洛谷 P2680 运输计划 解题报告

    P2680 运输计划 题目背景 公元2044年,人类进入了宇宙纪元. 题目描述 公元2044年,人类进入了宇宙纪元. \(L\)国有\(n\)个星球,还有\(n-1\)条双向航道,每条航道建立在两个星 ...

  7. 洛谷 P4175 [CTSC2008]网络管理 解题报告

    P4175 [CTSC2008]网络管理 题目描述 带修改树上链的第\(k\)大 输入输出格式 输入格式: 第一行为两个整数\(N\)和\(Q\),分别表示路由器总数和询问的总数. 第二行有\(N\) ...

  8. 洛谷 P3349 [ZJOI2016]小星星 解题报告

    P3349 [ZJOI2016]小星星 题目描述 小\(Y\)是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有\(n\)颗小星星,用\(m\)条彩色的细线串了起来,每条细线连着两颗小星星. 有一 ...

  9. 洛谷 P2597 [ZJOI2012]灾难 解题报告

    P2597 [ZJOI2012]灾难 题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发 ...

随机推荐

  1. ubuntu12.04安装squid

    一:简介 1.Squid:优化Web交付 Squid是支持HTTP,HTTPS,FTP等的Web的缓存代理.它通过缓存和重用经常请求的网页来减少带宽并缩短响应时间.Squid拥有广泛的访问控制,是一个 ...

  2. 关于用tesseract和tesserocr识别图片的一个问题

    对于像我这样初学python网络爬虫的freshman来说,软件的准备和环境的配置能让我们崩溃.其中用刚安装好的tesseract和tesserocr库测试识别验证码就是其中一例. 这里我要测试的验证 ...

  3. Centos下安装破解confluence6.3的操作记录

    confluence是一个专业的企业知识管理与协同软件,可以用于构建企业wiki.通过它可以实现团队成员之间的协作和知识共享.现在大多数公司都会部署一套confluence,用作内部wiki.现在co ...

  4. Linux磁盘空间被占用问题 (分区目录占用空间比实际空间要大: 资源文件删除后, 空间没有真正释放)

    问题说明:IDC里的一台服务器的/分区使用率爆满了!已达到100%!经查看发现有个文件过大(80G),于是在跟有关同事确认后rm -f果断删除该文件.但是发现删除该文件后,/分区的磁盘空间压根没有释放 ...

  5. tomcat内存溢出问题记录

    问题说明:公司内网环境中部署的jenkins代码发版平台突然不能访问了,查看tomcat的catalina.out日志发现报错如下: [root@redmine logs]# tail -f /srv ...

  6. Python下操作Memcache/Redis/RabbitMQ说明

    一.MemcacheMemcache是一套分布式的高速缓存系统,由LiveJournal的Brad Fitzpatrick开发,但目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的.需要频繁访 ...

  7. [ERROR] Fatal error: Please read "Security" section of the manual to find out how to run mysqld as root!

    测试mysqld启动mysql server的时候,报如下错误: 2015-12-17 00:46:02 10785 [ERROR] Fatal error: Please read "Se ...

  8. Code Review —— by12061154Joy

    对结对队友刘丽萍的代码进行了复审: 优点: 1,代码逻辑正确,基本能够完全需求 2,用了不少C#自带的函数,第一次写C#,相信是查阅了不少资料,虽然还有很多地方值得优化,不过第一次能做到这样已经很不错 ...

  9. Finished yeah!

    终于到了最后的博客阶段,这时候才知道博客此时此刻是多么的惬意,它成了书写心声的自由平台!耗时一天完成这作业说起来也是蛮辛苦的,编译器需要新装,IDE需要熟悉,当然最主要的是之前浅入浅出的C++功底在此 ...

  10. 广商博客冲刺第六七天new

    第四五天沖刺傳送門 第一版的網頁已經放到 云服務器(估計快到期了) 傳送門. (不怎么會玩服務器啊..求指教..目前問題如下: 1.我的電腦mysql密碼跟服務器的密碼不一樣..上傳的時候要把代碼里面 ...