洛谷树剖模板题 P3384 | 树链剖分

原题链接

对于以u为根的子树,后代节点的dfn显然比他的dfn大,我们可以记录一下回溯到u的dfn,显然这两个dfn构成了一个连续区间,代表u及u的子树

剩下的就和树剖一样了

  1 #include<cstdio>
  2 #include<algorithm>
  3 #include<cstring>
  4 #define N 100010
  5 typedef long long ll;
  6 using namespace std;
  7 int ecnt,head[N],son[N],fa[N],sz[N],n,m,r,deep[N],pos[N],indx[N],tot,op,back[N],top[N];
  8 ll val[N],P;
  9 struct adj
 10 {
 11     int nxt,v;
 12 }e[2*N];
 13 struct node
 14 {
 15     int l,r;
 16     ll sum,lz;
 17 }t[4*N];
 18 void add(int u,int v)
 19 {
 20     e[++ecnt].v=v;
 21     e[ecnt].nxt=head[u];
 22     head[u]=ecnt;
 23     e[++ecnt].v=u;
 24     e[ecnt].nxt=head[v];
 25     head[v]=ecnt;
 26 }
 27 void dfs1(int x,int father,int dep)
 28 {
 29     deep[x]=dep,fa[x]=father,sz[x]=1;
 30     for (int i=head[x];i;i=e[i].nxt)
 31     {
 32     int v=e[i].v;
 33     if (fa[x]==v) continue;
 34     dfs1(v,x,dep+1);
 35     sz[x]+=sz[v];
 36     if (sz[v]>sz[son[x]]) son[x]=v;
 37     }
 38 }
 39 void dfs2(int x,int TOP)
 40 {
 41     top[x]=TOP;
 42     pos[x]=++tot;
 43     indx[tot]=x;
 44     if (son[x]) dfs2(son[x],TOP);
 45     for (int i=head[x];i;i=e[i].nxt)
 46     {
 47     int v=e[i].v;
 48     if (v==fa[x] || v==son[x]) continue;
 49     dfs2(v,v);
 50     }
 51     back[x]=tot;
 52 }
 53 void pushdown(int p)
 54 {
 55     if (t[p].l==t[p].r || !t[p].lz) return;
 56     int w=t[p].lz;
 57     t[p<<1].sum=(t[p<<1].sum+w*(t[p<<1].r-t[p].l+1)%P)%P;
 58     t[p<<1|1].sum=(t[p<<1|1].sum+w*(t[p<<1|1].r-t[p<<1|1].l+1)%P)%P;
 59     t[p<<1].lz+=w;
 60     t[p<<1].lz%=P;
 61     t[p<<1|1].lz+=w;
 62     t[p<<1|1].lz%=P;
 63     t[p].lz=0;
 64 }
 65 void pushup(int p)
 66 {
 67     t[p].sum=(t[p<<1].sum+t[p<<1|1].sum)%P;
 68 }
 69 void build(int p,int l,int r)
 70 {
 71     t[p].l=l,t[p].r=r,t[p].lz=0;
 72     if (l!=r)
 73     {
 74     int mid=l+r>>1;
 75     build(p<<1,l,mid);
 76     build(p<<1|1,mid+1,r);
 77     pushup(p);
 78     }
 79     else
 80     t[p].sum=val[indx[l]]%P;
 81 }
 82 void modify(int p,int l,int r,int w)
 83 {
 84     if (t[p].l==l && t[p].r==r)
 85     {
 87     t[p].sum+=w*(t[p].r-t[p].l+1);
 88     t[p].lz+=w;
 89     return ;
 90     }
 91     pushdown(p);
 92     int mid=t[p].l+t[p].r>>1;
 93     if (r<=mid) modify(p<<1,l,r,w);
 94     else if (l>mid) modify(p<<1|1,l,r,w);
 95     else modify(p<<1,l,mid,w),modify(p<<1|1,mid+1,r,w);
 96     pushup(p);
 97 }
 98 ll query(int p,int l,int r)
 99 {
100     if (t[p].l==l && t[p].r==r)
101     return t[p].sum%P;
102     int mid=t[p].l+t[p].r>>1;
103     pushdown(p);
104     if (r<=mid) return query(p<<1,l,r)%P;
105     if (l>mid) return query(p<<1|1,l,r)%P;
106     return (query(p<<1,l,mid)+query(p<<1|1,mid+1,r))%P;
107 }
108 void pathInc(int u,int v,int w)
109 {
110     while (top[u]!=top[v])
111     {
112     if (deep[top[u]]<deep[top[v]]) swap(u,v);
113     modify(1,pos[top[u]],pos[u],w);
114     u=fa[top[u]];
115     }
116     if (deep[u]>deep[v]) swap(u,v);
117     modify(1,pos[u],pos[v],w);
118 }
119 ll pathQuery(int u,int v)
120 {
121     ll ret=0;
122     while (top[u]!=top[v])
123     {
124     if (deep[top[u]]<deep[top[v]]) swap(u,v);
125     ret=(ret+query(1,pos[top[u]],pos[u]))%P;
126     u=fa[top[u]];
127     }
128     if (deep[u]>deep[v]) swap(u,v);
129     return (ret+query(1,pos[u],pos[v]))%P;
130 }
131 int main()
132 {
133     scanf("%d%d%d%lld",&n,&m,&r,&P);
134     for (int i=1;i<=n;i++)
135     scanf("%lld",&val[i]);
136     for (int i=1,u,v;i<n;i++)
137     scanf("%d%d",&u,&v),add(u,v);
138     dfs1(r,0,0);
139     dfs2(r,r);
140     build(1,1,n);
141     for (int i=1,x,y,z;i<=m;i++)
142     {
143     scanf("%d",&op);
144     if (op==1)
145         scanf("%d%d%d",&x,&y,&z),pathInc(x,y,z);
146     else if (op==2)
147         scanf("%d%d",&x,&y),printf("%lld\n",pathQuery(x,y));
148     else if (op==3)
149         scanf("%d%d",&x,&z),modify(1,pos[x],back[x],z);
150     else scanf("%d",&x),printf("%lld\n",query(1,pos[x],back[x]));
151     }
152     return 0;
153 }

 

转载于:https://www.cnblogs.com/mrsheep/p/7892142.html

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

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

相关文章

我同学

周六在朋友圈提到的&#xff0c;我有一个在三星工作、从事camera方向研究的同学&#xff0c;他在去三星之前已经做了很多年camera了&#xff0c;之前在知识星球也给大家推荐了他的技术公众号&#xff0c;对喜欢或者从事camera研究的会非常有帮助&#xff0c;建议大家关注一下。…

学教育成空中楼阁 巨额学费背后却是失业风险

央视国际 [url]www.cctv.com[/url]  2006年11月13日 09:22 来源&#xff1a; 大学的病&#xff0c;其病在学。现在的大学&#xff0c;大家都很忙&#xff0c;但大学要教什么&#xff0c;怎么教&#xff0c;其实没人操心。这样教出的学生&#xff0c;不会做人&#xff0c;也不…

计算机组成原理填空题目,(计算机组成原理练习题.doc

(计算机组成原理练习题1.填空题(1)寄存器寻址方式中&#xff0c;指令的地址码部分给出 寄存器号 &#xff0c;操作码在 寄存器 中&#xff1b;直接寻址方式指令中&#xff0c;直接给出 操作数的地址 &#xff0c;需访问 主存 一次可获得操作数&#xff1b;存储器间接寻址方式指…

Uva 201 Squares (暴力 + 枚举)

【题意】 给出 n*n 的 点 H 横向 V 纵向 &#xff08;注意&#xff09; V 想 I,j 相反 问 边 为1 &#xff0c;2 &#xff0c; 3 。。。。 n 的 正方向有几个 【思路】 n 很小 直接暴力 枚举 枚举 两个点&#xff0c; 看看 从 左上角 到右下角 &#xff08;变成为 s的…

自己都不觉得自己值钱,别人怎么觉得你值钱?

今天跟一个同学聊天&#xff0c;他最近正在找工作&#xff0c;找了一家外包企业拿到offer&#xff0c;对方开了薪资&#xff0c;他问我「发哥&#xff0c;这个薪资没有问题吧&#xff1f;」。薪资这个问题&#xff0c;我之前已经给出过建议&#xff0c;新企业的薪资最好能能让你…

ASP.NET AJAX入门系列(10):Timer控件简单使用

本文主要通过一个简单示例&#xff0c;让Web页面在一定的时间间隔内局部刷新&#xff0c;来学习一下ASP.NET AJAX中的服务端Timer控件的简单使用。主要内容Timer控件的简单使用1&#xff0e;添加新页面并切换到设计视图。2&#xff0e;如果页面没有包含ScriptManager控件&#…

全国计算机等级考试暨南大学,9月暨南大学计算机等级考试报名时间通知

全国计算机等级考试暨南大学珠海校区考点2017年下半年(第49次)全国计算机等级考试已经开始报名&#xff0c;以下是小编收集的暨南大学计算机等级考试报名时间通知&#xff0c;希望大家认真阅读!报考事项通知1、网上报名时间为2017年6月15日17:00至30日12:00。广东省全国计算机等…

使用OpenXml打开word文档中嵌入的另一个文档

今天在写字处理评分程序的时候遇到一个之前没有经历过的场景&#xff1a;在给定的字处理素材文档文档中嵌入了另一个字处理文档&#xff0c;题目要求既要对素材文档进行修改&#xff0c;也要对嵌入的文档进行格式调整。打开嵌入的文档对于操作者来说非常容易&#xff0c;只需双…

ANSI是什么编码?

原文&#xff1a;http://www.cnblogs.com/malecrab/p/5300486.html用Notepad创建一个文本文件text.txt&#xff0c;其默认编码格式为ANSI&#xff08;乍看之下&#xff0c;还以为是ASCII呢&#xff09;&#xff0c;输入汉字居然不是乱码&#xff1a;保存为test.txt&#xff0c;…

Run ASMX Without IIS

http://msdn.microsoft.com/msdnmag/issues/04/12/ServiceStation/default.aspxExcellent, but how about on PDA? I need a SOAP Server running on PDA:( 转载于:https://www.cnblogs.com/swnuwangyun/archive/2006/11/16/562499.html

R语言数据分析过程

R语言数据分析前期&#xff1a;预处理过程&#xff0c;供自己查阅&#xff0c;欢迎大家指正。 利用R语言导入数据&#xff1a; taobao<-read.csv("taobao.csv",stringsAsFactors F) 我最常用到就是read.csv&#xff0c;其中stringsAsFactorsF很重要&#xff0c;不…

苏州,遇见NXP痞子衡

昨天的文&#xff0c;今天发--晚上打球照片&#xff0c;大家都是1.8的&#xff0c;结果拍出来变矮了因为公司项目问题&#xff0c;今天飞苏州&#xff0c;昨晚上就得到了命令&#xff0c;早上直接从家里开拔&#xff0c;这次去苏州提前跟痞子衡说了情况&#xff0c;原因是上次我…

计算机组成原理节拍分为几种,计算机组成原理习题答案第七章

计算机组成原理题答案,计算机组成原理,习题答案&#xff11; &#xff0e;控制器有哪几种控制方式&#xff1f; 各有何特点&#xff1f;解&#xff1a;控制器的控制方式可以分为&#xff13; 种&#xff1a;同步控制方式、异步控制方式和联合控制方式。同步控制方式的各项操作都…

Android中GC的触发时机和条件

本文分析基于Android R(11)源码Java对象的创建由Allocator负责&#xff0c;回收由Collector负责。从Android O开始&#xff0c;对于前台应用默认的GC Collector是CC(Concurrent Copying) Collector&#xff0c;与之相匹配的Allocator则是Region-based Bump Pointer Allocator(w…

java console 到文件

System.setOut(new PrintStream(new FileOutputStream("c:\\temp\\test1.txt"))); System.out.println(x);转载于:https://www.cnblogs.com/kakaisgood/p/7910620.html

计算机安全可靠替代工程,基于安全可靠软硬件的党政军OA系统的整系统优化方法与研究-计算机技术专业论文.docx...

万方数据万方数据摘要“十二五”期间&#xff0c;基于国家重大科技专项“核高基”前一阶段的基础软硬件产 品技术成果&#xff0c;以应用示范为牵引&#xff0c;全面验证、推广“十一五”“核高基”成果成为 工作重点和主题。由于国产关键基础软硬件产品不成熟以及缺乏系统性的…

使用.NET读取XML文件

介绍 本文中我将介绍在ASP.NET应用程序中如何读取XML文件&#xff0c;这是一个十分有用的技巧。使用这个技巧&#xff0c;我们能够定制我们的应用程序的配置文件&#xff0c;也可以读取那些保存在XML文件中的数据。 概论 下面的代码将使用XmlTextReader对象将磁盘文件中的数据读…

【华为出品】物联网全栈开发实战营第2期来啦!送海思开发板

物联网一直在改变我们生活的方方面面。可穿戴设备有助于监控我们的偏好、习惯和健康状况。智能家居设备可提高家居的舒适度、安全性和便利性。城市利用连接的数字设备收集的海量数据(数十亿个)来改善城市规划。制造商使用工业物联网设备来优化工厂车间的操作。据MarketsandMark…

2017年12月计算机一级c,2017年12月计算机二级C语言考试操作题冲刺卷(2)

三. 程序设计题3 [简答题]请编写函数fun&#xff0c;其功能是&#xff1a;移动一维数组中的内容&#xff0c;若数组中有n个整数&#xff0c;要求把下标从0&#xff5e;P(含P&#xff0c;P小于等于n-1)的数组元素平移到数组的最后。例如&#xff0c;一维数组中的原始内容为&…

6. Nginx + PHP + FastGCI安装

LNAMP Linux Nginx Apache Mysql PHP Nginx PHP&#xff08;fast CGI&#xff09; 可以理解为一个php加速的一个接口 Php-fpm 可以实现fastcgi协议需要的进程池&#xff0c;php-fpm实现的fastcgi进程叫php-cgi&#xff0c;所以php-fmp其实是他自身的fastcgi 或 php-cgi进程管理…