HDU 3966 Aragorn's Story (树链剖分+线段树)

题意:给你一棵树,然后有三种操作

  I L R K: 把L与R的路径上的所有点权值加上K

  D L R K:把L与R的路径上的所有点权值减去K

  Q X:查询节点编号为X的权值

思路:树链剖分裸题(我还没有怎么学懂,但基本已经没有什么太大的问题,主要的问题就在于点或者边对于数据结构的映射关系是,主要没有单独手写过树链剖分,所以对这部分 没有什么体会)

我们知道树链剖分是一种将树剖为链的一种算法,其思想和dfs序差不多,但根据树链剖分的性质,我们的重链是连续的区间,这样对于重链或者重链上的点我们可以方便的用数据结构维护,对于修改操作,是一种类似于LCA的算法,但感觉本质上还是一种LCA,只不过每次向上跳的部分是跳到top,其他的就是两次dfs,分别维护组时候大小以及一些其他的东西,第二遍dfs 找出重链

代码:

#include <bits/stdc++.h>
using namespace std;const int maxn=50008;
const int maxm=100008;int n,m,Q;
int a[maxn],sz[maxn],dep[maxn],fa[maxn],top[maxn],w[maxn],son[maxn];
int Rank[maxn];
int sum[maxn<<2],lazy[maxn<<2];struct line
{int u,v,nxt;
}eg[maxm];
int head[maxn],summ,cnt;
void addedge(int u,int v)
{eg[++summ].u=u;eg[summ].v=v;eg[summ].nxt=head[u];head[u]=summ;
}
void add(int u,int v)
{addedge(u,v);addedge(v,u);
}
void dfs1(int u)
{sz[u]=1;son[u]=0;for(int i=head[u];i;i=eg[i].nxt){int v=eg[i].v;if(v!=fa[u]){fa[v]=u;dep[v]=dep[u]+1;dfs1(v);sz[u]+=sz[v];if(sz[v]>sz[son[u]])son[u]=v;}}
}void dfs2(int u,int tp,int x)
{top[u]=tp;w[u]=++cnt;Rank[cnt]=u;if(son[u])dfs2(son[u],tp,1);for(int i=head[u];i;i=eg[i].nxt){int v=eg[i].v;if(v==son[u]||v==fa[u])continue;dfs2(v,v,2);}
}void init()
{memset(head,0,sizeof(head));summ=1;cnt=0;dep[1]=1;fa[1]=0;
}
void pushup(int rt)
{sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void pushdown(int rt,int len)
{if(lazy[rt]){lazy[rt<<1]+=lazy[rt];lazy[rt<<1|1]+=lazy[rt];sum[rt<<1]+=lazy[rt]*(len-len/2);sum[rt<<1|1]+=lazy[rt]*(len/2);lazy[rt]=0;}
}void build(int l,int r,int rt)
{lazy[rt]=0;if(l==r){sum[rt]=a[Rank[l]];return ;}int mid=(l+r)>>1;build(l,mid,rt<<1);build(mid+1,r,rt<<1|1);pushup(rt);
}
void update(int L,int R,int val,int l,int r,int rt)
{if(L<=l&&r<=R){sum[rt]+=val*(r-l+1);lazy[rt]+=val;return ;}pushdown(rt,r-l+1);int mid=(l+r)>>1;if(L<=mid)update(L,R,val,l,mid,rt<<1);if(mid<R)update(L,R,val,mid+1,r,rt<<1|1);pushup(rt);
}int query(int x,int l,int r,int rt)
{if(l==r){return sum[rt];}pushdown(rt,r-l+1);int mid=(l+r)>>1;if(x<=mid)return query(x,l,mid,rt<<1);if(mid<x)return query(x,mid+1,r,rt<<1|1);
}
void modify(int x,int y,int val)
{while(top[x]!=top[y]){if(dep[top[x]]<dep[top[y]])swap(x,y);update(w[top[x]],w[x],val,1,n,1);x=fa[top[x]];}if(dep[x]>dep[y])swap(x,y);update(w[x],w[y],val,1,n,1);
}int main()
{while(~scanf("%d%d%d",&n,&m,&Q)){init();for(int i=1;i<=n;i++){scanf("%d",&a[i]);}for(int i=1;i<=m;i++){int u,v;scanf("%d%d",&u,&v);add(u,v);}dfs1(1);dfs2(1,1,1);build(1,cnt,1);while (Q--){char s[2];int x,y,z;scanf("%s",s);if (s[0]=='I'){scanf("%d %d %d",&x,&y,&z);modify(x,y,z);}if (s[0]=='D'){scanf("%d %d %d",&x,&y,&z);modify(x,y,-z);}if (s[0]=='Q'){scanf("%d",&x);printf("%d\n",query(w[x],1,n,1));}}}return 0;
}

 

转载于:https://www.cnblogs.com/lalalatianlalu/p/9740908.html

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

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

相关文章

canon相机api中文_您应该在佳能相机上掌握的10种相机设置

canon相机api中文Your camera is a tool, and you should be able to use it with total confidence. You should never have to dig through the manual or play around with random buttons trying to work out how to do something on a shoot. Here are the most important…

mysql普通索引自增_mysql中联合索引中的自增列的增长策略

《深入理解MySQL》中一段介绍MyISAM存储引擎中自动增长列的示例,如下1 mysql>create table autoincre_demo2 -> (d1 smallint not nullauto_increment,3 -> d2 smallint not null,4 -> name varchar(10),5 ->index(d2,d1)6 -> )enginemyisam;7 Query OK, 0 r…

spring-boot基础概念与简单应用

1.spring家族 2.应用开发模式 2.1单体式应用 2.2微服务架构 微服务架构中每个服务都可以有自己的数据库 3.微服务架构应当注意的细节 3.1关于"持续集成,持续交付,持续部署" 频繁部署、快速交付以及开发测试流程自动化都将成为未来软件工程的重要组成部分 可行方案(如…

邮箱客户端 gmail支持_如何联系Gmail支持

邮箱客户端 gmail支持Although you may not be able to directly contact Gmail support without subscribing to G Suite for businesses, there are a couple of ways to get the answers you’re looking for online. Let’s look at how you can get help with your Gmail …

jstorm mysql_zookeeper,kafka,jstorm,memcached,mysql流式数据处理平台部署

一&#xff0e;平台环境介绍:1&#xff0e;系统信息&#xff1a;项目信息系统版本:Ubuntu14.04.2 LTS \n \l用户&#xff1a;*****密码&#xff1a;******Java环境&#xff1a;openjdk-7-jre语言&#xff1a;en_US.UTF-8&#xff0c;en_US:en磁盘&#xff1a;每台vda为系统盘(5…

dock模拟macos教程_将macOS首选项窗格添加到您的Dock中以快速访问

dock模拟macos教程macOS: Is there a certain Preference pane you access constantly? You can quickly add it to your dock. macOS&#xff1a;是否存在您经常访问的特定“首选项”窗格&#xff1f; 您可以将其快速添加到扩展坞中。 Brett Terpstra, writing for Lifehacke…

怎么做mysql查询系统_mysql数据库系统学习(一)---一条SQL查询语句是如何执行的?...

一、第一节&#xff1a;一条sql查询语句是怎样执行的5.5.5版本以后&#xff0c;默认使用存储引擎为InnoDB不使用查询缓存&#xff0c;MySQL8.0没有查询缓存这个功能总体来说&#xff1a;MySQL分为service层和存储引擎层1)service层包括&#xff1a;连接器、分析器、优化器、执行…

mysql qt自增_mysql自增设置

MySQL设置自增字段的相关语句&#xff1a;alter table album change ALBUM_ID ALBUM_ID bigint not null auto_increment;alter table album auto_increment1;创建:mysql>create table cc(id int auto_increment,name varchar(20),primary key(id));mysql>create table c…

staem被盗_如何检查照片是否被盗

staem被盗Photos and other images get stolen all the time online. Someone takes a photo from the photographer’s website or social media channels and uses it for their own needs. This is completely illegal and happens to me all the time here at How-To Geek.…

数据库、表、表内容增删改查

数据库和表的创建 用户的增 删 改 查 增 create user 用户名192.168.16.% identified by ‘123’&#xff1b;创建一个账户&#xff0c;并设置密码&#xff0c;可不设密码 grant all on *.* to 用户地址; #给账户授权 flush privileges&#xff1b; #刷新授权立即生效 创…

立即通过Xumo.TV在线观看免费电视

Xumo.TV brings the channel surfing experience to cord cutters, with content from The History Channel, MSNBC, Fox Sports, and more. And it’s free. Xumo.TV将频道浏览体验带给剪线钳&#xff0c;其中包括The History Channel&#xff0c;MSNBC&#xff0c;Fox Sports…

NOIP2009靶形数独

试题描述小城和小华都是热爱数学的好学生&#xff0c;最近&#xff0c;他们不约而同地迷上了数独游戏&#xff0c;好胜的他们想用数独来一比高低。但普通的数独对他们来说都过于简单了&#xff0c;于是他们向 Z 博士请教&#xff0c; Z 博士拿出了他最近发明的“靶形数独”&…

mysql 1005 - can't create table_关于创建数据表报错一例(ERROR 1005 Can’t create table (errno: 121))...

问题描述曾遇到创建数据表报错问题&#xff0c;报错如下&#xff1a;ERROR 1005 (HY000) at line 18: Cant create table db1.t2 (errno: 121)通过日志查看有一条记录InnoDB: Error: table db1.t2 already exists in InnoDB internal可见要创建的这个表已经存在&#xff0c;导致…

h5输出文字write_免费下载:Write是用于手写的文字处理器

h5输出文字writeWindows/Mac/Linux/Android: Love the feel of writing by hand, but wish you could use features like copy/paste and undo? Write is a free tool that lets you do just that. Windows / Mac / Linux / Android&#xff1a;喜欢手写的感觉&#xff0c;但是…

11. IDEA 在同一工作空间创建多个项目

1.创建项目 二.、创建工作空间 JavaWorkspace 1、File-> New Project -> 创建工作空间 JavaWorkspace&#xff0c;并 顺便创建项目 JavaOne 2.创建第一个项目后形成的目录结构如下 三、在已经创建好的工作空间中创建第二个项目 1、File -> New Module -> 创建项目 …

winform 线程监听两个目录下的文件_vb.net 利用.net自带的GZipStream压缩或者解压文件的代码,不需要任何第三方控件...

网上很少有用VB写的压缩文件的代码&#xff0c;但是&#xff0c;在网络传输&#xff0c;文件下载,打包发布等等方面的需求又比较多&#xff0c;所以&#xff0c;借鉴了一下C#代码的例子&#xff0c;改造成了VB用的类。另外加上了多层文件夹压缩解压。但是&#xff0c;因为时间有…

什么是“ rpcsvchost”,以及为什么它在Mac上运行?

You find something called rpcsvchost while using Activity Monitor to see what’s running on your Mac. What is this process, and should you be worried? In a word, no: rpcsvhost is a core part of macOS. 在使用“活动监视器”查看Mac上正在运行的内容时&#xff…

自定义异常禁用异常堆栈_如何在Mac上禁用或自定义自动更正

自定义异常禁用异常堆栈Sometimes, autocorrect gets it wrong, replacing a word you meant to type with something completely different. You can customize it to fix these issues or disable it altogether. 有时候&#xff0c;自动更正会把它弄错&#xff0c;用完全不同…

控制dcom程序使用端口_使用VS Code调试.net控制台应用程序的方法

本文由 比特飞 原创发布&#xff0c;欢迎大家踊跃转载。转载请注明本文地址&#xff1a;https://www.byteflying.com/archives/6928。1、概述本文向大家介绍使用Visual Studio Code调试.net控制台应用程序的方法。2、方案首先在创建好一个控制台应用程序&#xff0c;再在扩展中…

omnipay支付--支付宝支付

最近负责的项目事关支付宝APP支付 也踩了一些坑 这边记录下 以下代码基于laravel框架下: 生成APP支付参数: $gateway $this->getGateway();$request $gateway->purchase();$request->setBizContent([subject > ,//产品描述out_trade_no > ,//本地订单号…