jzoj3626-[LNOI2014]LCA【树链剖分,线段树】

正题

题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3626


题目大意

一棵树,每次给出(l,r,z)(l,r,z)(l,r,z)询问∑i=lrdepLCA(i,z)\sum_{i=l}^rdep_{LCA(i,z)}i=lrdepLCA(i,z)


解题思路

若询问LCA(x,y)LCA(x,y)LCA(x,y)的深度有一种方法,将1∼x1\sim x1x的路径都打上标记,然后查询1∼y1\sim y1y这条路径上有多少个打了记号的点。

若查询一个点xxx和很多个点的LCALCALCA深度和就可以对于每个点到根节点的路径上+1+1+1,然后查询1∼x1\sim x1x路径上数字和即可。

所以我们可以将询问(l,r,z)(l,r,z)(l,r,z)拆分成(1,r,z)−(1,l−1,z)(1,r,z)-(1,l-1,z)(1,r,z)(1,l1,z),然后用指针扫过去,用树链剖分维护树上路径和即可。

时间复杂度O((n+Q)log⁡2n)O((n+Q)\log^2n)O((n+Q)log2n)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=5e4+10;
struct Tree_node{ll w,lazy;
};
struct Edge_node{ll to,next;
}a[N];
struct node{ll x,y,val,id;
}q[N*2];
struct Seq_Tree{Tree_node t[N*4];void Downdata(ll x,ll l,ll r){if(!t[x].lazy) return;ll mid=(l+r)/2;t[x*2].w+=t[x].lazy*(mid-l+1);t[x*2+1].w+=t[x].lazy*(r-mid);t[x*2].lazy+=t[x].lazy;t[x*2+1].lazy+=t[x].lazy;t[x].lazy=0;return;}void Change(ll k,ll l,ll r,ll x,ll y,ll val){if(l==x&&r==y){t[k].lazy+=val;t[k].w+=val*(r-l+1);return;}ll mid=(l+r)/2;Downdata(k,l,r);if(y<=mid) Change(k*2,l,mid,x,y,val);else if(x>mid) Change(k*2+1,mid+1,r,x,y,val);else Change(k*2,l,mid,x,mid,val),Change(k*2+1,mid+1,r,mid+1,y,val);t[k].w=t[k*2].w+t[k*2+1].w; }ll Ask(ll k,ll l,ll r,ll x,ll y){if(l==x&&r==y) return t[k].w;ll mid=(l+r)/2;Downdata(k,l,r);if(y<=mid) return Ask(k*2,l,mid,x,y);if(x>mid) return Ask(k*2+1,mid+1,r,x,y);return Ask(k*2,l,mid,x,mid)+Ask(k*2+1,mid+1,r,mid+1,y);}
}T;
ll n,m,cnt,tot,num,ans[N],ls[N],fa[N];
ll siz[N],seq[N],id[N],son[N],dep[N],top[N];
void addl(ll x,ll y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;
}
void dfs1(ll x){siz[x]=1; for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;dep[y]=dep[x]+1;dfs1(y);siz[x]+=siz[y];if(siz[y]>siz[son[x]]) son[x]=y;}return;
}
void dfs2(ll x){id[x]=++cnt;seq[cnt]=x;if(son[x]){top[son[x]]=top[x];dfs2(son[x]);}for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(y==son[x]) continue;top[y]=y;dfs2(y);}
}
void Change_path(ll x,ll y,ll num)
{while(top[x]!=top[y]){if(dep[top[x]]<dep[top[y]])swap(x,y); T.Change(1,1,n,id[top[x]],id[x],num);x=fa[top[x]];}if(dep[x]<dep[y]) swap(x,y);T.Change(1,1,n,id[y],id[x],num); 
}
ll Ask_path(ll x,ll y)
{ll ans=0;while(top[x]!=top[y]){if(dep[top[x]]<dep[top[y]])swap(x,y); ans+=T.Ask(1,1,n,id[top[x]],id[x]);x=fa[top[x]];}if(dep[x]<dep[y]) swap(x,y);ans+=T.Ask(1,1,n,id[y],id[x]); return ans;
}
bool cmp(node x,node y)
{return x.x<y.x;}
int main()
{scanf("%lld%lld",&n,&m);for(ll i=2;i<=n;i++){scanf("%lld",&fa[i]);fa[i]++;addl(fa[i],i);}dep[1]=1;dfs1(1);dfs2(1);for(ll i=1;i<=m;i++){ll l,r,z;scanf("%lld%lld%lld",&l,&r,&z);l++;r++;z++;q[++num]=(node){l-1,z,-1,i};q[++num]=(node){r,z,1,i};}sort(q+1,q+1+num,cmp);ll now=1;for(ll i=1;i<=num;i++){while(now<=q[i].x)Change_path(1,now,1),now++;ans[q[i].id]+=q[i].val*Ask_path(1,q[i].y);}for(ll i=1;i<=m;i++)printf("%lld\n",ans[i]%201314); 
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321667.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

37、JAVA_WEB开发基础之上传功能

是什么 上传指的是将客户端的文件保存到服务器的磁盘中 基本实现原理 读取客户端的文件信息&#xff0c;将文件信息以流的形式发送到服务器&#xff0c;然后服务器将流中的信息保存到本地&#xff0c;以实现文件的上传 实例 注意&#xff1a;提交的表单类型一定是 enctype…

2017西安交大ACM小学期 文本查找[AC自动机]

文本查找 发布时间: 2017年7月5日 00:10 最后更新: 2017年7月5日 13:47 时间限制: 1500ms 内存限制: 128M 描述 给定m种两两不同的关键词&#xff0c;并给定一段文本&#xff0c;问这段文本中有几种关键词出现&#xff08;一种关键词出现多次只算一次&#xff09;。 输入…

P4296-[AHOI2007]密码箱【数论】

正题 题目链接:https://www.luogu.com.cn/problem/P4296 题目大意 一个数字nnn&#xff0c;求有多少个x<nx<nx<n使得x2%n1x^2\%n1x2%n1。 解题思路 x2kn1x^2kn1x2kn1 x2−1knx^2-1knx2−1kn (x−1)(x1)%n0(x-1)(x1)\%n0(x−1)(x1)%n0 ⇒\Rightarrow⇒ x(x2)%n0(x2&l…

38、JAVA_WEB开发基础之下载功能

是什么 下载指的是将服务器端的文件保存到客户端的磁盘中 基本实现原理 根据对应的要下载的文件在服务器端找到对应的文件&#xff0c;然后获取到文件流对象&#xff0c;将流对象发送到客户端&#xff0c;然后客户端通过对返回结果中文件流的解析&#xff0c;将流对象转换成…

2017西安交大ACM小学期 有趣异或[Trie树]

有趣异或 发布时间: 2017年7月4日 23:59 最后更新: 2017年7月5日 14:56 时间限制: 1500ms 内存限制: 512M 描述 给定n个非负整数&#xff0c;保证这些数两两不相同。现给定x&#xff0c;请从中选2个不同的数a,b&#xff0c;使得a^b^x最大。 输入 包含多组测试数据。 每组…

P5675-[GZOI2017]取石子游戏【博弈论,dp】

正题 题目链接:https://www.luogu.com.cn/problem/P5675 题目大意 nnn堆石子&#xff0c;第iii堆有aia_iai​个。指定一些石子堆使得先手必胜并指定一个先手第一个取的位置使得先手必败&#xff0c;求有多少方案数。 解题思路 根据NIMNIMNIM游戏&#xff0c;只要石子数异或和…

39、JAVA_WEB开发基础之ajax和json

ajax是什么 首先要知道ajax并不是一种新的技术&#xff0c;而是几种技术的强强联合&#xff0c;全称是Asynchronous Javascript and xml&#xff0c;其精髓在于异步加载资源&#xff0c;因此可以实现局部加载效果&#xff08;因为可以异步加载&#xff0c;所以不需要依靠整张页…

(不误正业)鼓励做题的时间陷阱

前言 在家闲的无聊想着没人陪我做题就写了一个可以(或许)鼓励做题的东西 正题 关于时间陷阱 时间陷阱是种游戏类型&#xff0c;玩家开始时有一个倒计时&#xff0c;没完成一个任务会增加倒计时&#xff0c;时间到了那么任务就输了。 这里编写的时间陷阱任务重要度(完成后加的…

2017西安交大ACM小学期 美妙音乐[差分KMP匹配]

美妙音乐 发布时间: 2017年7月3日 13:14 最后更新: 2017年7月5日 13:47 时间限制: 500ms 内存限制: 128M 描述 一段音乐是由若干个音符组成的&#xff0c;音乐中的某段音符称为旋律。给定一首音乐&#xff0c;问某个旋律出现了多少次。注意&#xff1a; &#xff08;1&am…

1、数据库简介

数据库是什么 数据库是一种用来存储数据的仓库&#xff0c;是一种高效存储和处理数据的介质&#xff08;载体&#xff09;。我们通常口中所说的数据库指的是数据库管理系统&#xff08;DBMS&#xff09;&#xff0c;是一种用于方便管理数据库的软件。 数据库的分类 根据存储…

P2387-[NOI2014]魔法森林【LCT】

前言 话说LCTLCTLCT的SplaySplaySplay和平时写的SplaySplaySplay差别好大&#xff0c;调了我半天 正题 题目链接:[https://www.luogu.com.cn/problem/P2387 题目大意 nnn个点mmm条边有a,ba,ba,b两个值&#xff0c;求一条路径从1−>n1->n1−>n使得路径上最大的aaa加上…

2017西安交大ACM小学期 敏感词汇[AC自动机]

敏感词汇 发布时间: 2017年7月5日 00:23 最后更新: 2017年7月6日 14:40 时间限制: 1500ms 内存限制: 128M 描述 我们知道&#xff0c;在进行聊天时&#xff0c;有些词汇是敏感词汇&#xff0c;含有敏感词汇的内容是不允许被发送的。现在给定m个敏感词汇&#xff0c;并给定…

2、安装和连接mysql

安装mysql 1、官网下载mysql 下载网址&#xff1a;https://www.mysql.com/ 2、解压并配置mysql 解压下载的&#xff08;前提下载的zip版本的mysql&#xff09;mysql安装包&#xff0c;放到指定磁盘 配置环境变量&#xff1a;将mysql下的bin目录的全路径名配置到环境变量的p…

51nod-诺德街【数学期望】

正题 题目链接:http://www.51nod.com/Contest/Problem.html#contestProblemId305 题目大意 nnn个商铺&#xff0c;第iii个商铺有pip_ipi​的概率营业&#xff0c;一个人从111走到nnn再走回来一直重复&#xff0c;如果走到没有人营业的商铺那么就结束。 求期望走多少个商铺后停…

ACM一类方程问题的求解[最短路建模] bzoj2118

在ACM生涯里已经预见两回判断这种方程是否有解、有几个解的问题了。 例如&#xff1a; 1 给定非负整数a,b,c,n&#xff0c;请判断axbyczn是否存在(x,y,z)均为非负整数的解 题目链接&#xff1a;http://oj.xjtuacm.com/contest/14/problem/124/ 再例如&#xff1a; 2 现有…

3、数据库中的字符集和校对集

字符集 字符集指的就是存储数据到硬盘时用到的编码方式&#xff0c;mysql中操作字符集的基本sql如下&#xff1a; show character set; -- 查看服务器支持哪些字符集 show variables like ‘character_set%’; -- 查看服务器对外处理的默认字符集 set character_set_clien…

P3810-[模板]三维偏序(陌上花开)【CDQ分治,树状数组】

正题 题目链接:https://www.luogu.com.cn/problem/P3810 题目大意 nnn个三元组(a,b,c)(a,b,c)(a,b,c)&#xff0c;f(i)∑i1n,j≠i[aj≤ai&bj≤bi&bj≤bi]f(i)\sum_{i1}^{n,j\neq i}[a_j\leq a_i\&b_j\leq b_i\&b_j\leq b_i]f(i)i1∑n,j​i​[aj​≤ai​&…

4、mysql数据库的权限管理

权限管理指的是对试图连接和操作数据库服务器的用户进行访问控制 关于权限管理的一些sql实例如下&#xff1a; -- 首先通过cmd窗口连接mysql服务器 mysql -u root -p *******-- mysql数据库下有一个user表&#xff0c;里边存储的是user的信息 select user from user;-- 添加一…

P3157-[CQOI2011]动态逆序对【CDQ分治,树状数组】

正题 题目链接:https://www.luogu.com.cn/problem/P3157 题目大意 一个长度为nnn序列&#xff0c;每次删除一个数&#xff0c;求删除前的逆序对数量。 解题思路 时光倒流之后&#xff0c;我们变为每次加入一个数求逆序对数量。 我们将加入一个数的贡献分为后面和前面两部分…

5、mysql中的库操作

对数据库的操作包括对数据库的增、删、改、查 接下来介绍一下基本的sql语句 -- 创建数据库 create database 数据库名称 字符集&#xff08;charset utf8&#xff09;; create database czpdb charset urf8; -- czpdb 数据库在磁盘中就是一个文件夹&#xff0c;它下边的db.op…