洛谷P3178 树上操作 [HAOI2015] 树链剖分
正解:树链剖分+线段树
解题报告:
传送门!
树链剖分+线段树算是基操了趴,,,
就无脑码码码,没有任何含金量,不需要动脑子,然后码量其实也不大,就很爽
比树剖的板子还要板子一些hhhhh
放下代码就欧克了QwQ
#include<bits/stdc++.h> using namespace std; #define il inline #define int long long #define gc getchar() #define ls(x) (x<<1) #define rs(x) ((x<<1)|1) #define t(i) edge[i].to #define w(i) edge[i].wei #define fy(i) edge[i].fy #define ri register int #define rb register bool #define rc register char #define rp(i,x,y) for(ri i=x;i<=y;++i) #define my(i,x,y) for(ri i=x;i>=y;--i) #define e(i,x) for(ri i=head[x];i;i=edge[i].nxt) +; int n,q,ed_cnt,head[N],fa[N],top[N],sz[N],sn[N],dfn[N],low[N],rk[N],dfn_cnt,val[N]; struct ed{int to,nxt;}edge[N]; struct node{int dat,tag;}tr[N]; il int read() { rc ch=gc;ri x=;rb y=; '))ch=gc; ; )+(x<<)+(ch^'),ch=gc; return y?x:-x; } il char rd(){rc ch=gc;while(ch!='C' && ch!='Q')ch=gc;return ch;} il void ad(ri x,ri y){edge[++ed_cnt]=(ed){x,head[y]};head[y]=ed_cnt;edge[++ed_cnt]=(ed){y,head[x]};head[x]=ed_cnt;} ;fa[x]=fat;e(i,x)if(t(i)^fat){dfs1(t(i),x),sz[x]+=sz[t(i)];if(sz[t(i)]>sz[sn[x]] || !sz[x])sn[x]=t(i);}} void dfs2(ri x,ri tp) { top[x]=tp;rk[dfn[x]=low[x]=++dfn_cnt]=x;if(sn[x])dfs2(sn[x],tp);low[x]=max(low[x],low[sn[x]]); e(i,x)if(t(i)^fa[x] && t(i)^sn[x])dfs2(t(i),t(i)),low[x]=low[t(i)]; } il void pushdown(ri x,ri l,ri r) { if(tr[x].tag) { ri mid=(l+r)>>; tr[ls(x)].tag+=tr[x].tag;tr[ls(x)].dat+=tr[x].tag*(mid-l+); tr[rs(x)].tag+=tr[x].tag;tr[rs(x)].dat+=tr[x].tag*(r-mid); tr[x].tag=; } } il void pushup(ri x){tr[x].dat=tr[ls(x)].dat+tr[rs(x)].dat;} void build(ri x,ri l,ri r) { if(l==r){tr[x].dat=val[rk[l]];return;} ri mid=(l+r)>>; build(ls(x),l,mid);build(rs(x),mid+,r); pushup(x); } void modify(ri x,ri l,ri r,ri to_l,ri to_r,ri dat) { );return;} pushdown(x,l,r); ri mid=(l+r)>>; if(mid>=to_l)modify(ls(x),l,mid,to_l,to_r,dat); ,r,to_l,to_r,dat); pushup(x); } int query(ri x,ri l,ri r,ri to_l,ri to_r) { ; if(to_l<=l && r<=to_r)return tr[x].dat; pushdown(x,l,r); ri mid=(l+r)>>,ret=; if(mid>=to_l)ret+=query(ls(x),l,mid,to_l,to_r); ,r,to_l,to_r); return ret; } il ,,n,dfn[x],dfn[x],dat);} il ,,n,dfn[x],low[x],dat);} il ;,,n,dfn[top[x]],dfn[x]),x=fa[top[x]];return ret;} main() { // freopen("3178.in","r",stdin);freopen("3178.out","w",stdout); n=read();q=read();rp(i,,n)val[i]=read();rp(i,,n-){ri x=read(),y=read();ad(x,y);}dfs1(,);dfs2(,);build(,,n); while(q--) { ri op=read(); switch(op) { :{ri x=read(),a=read();modify_pre_sig(x,a);break;} :{ri x=read(),a=read();modify_pre(x,a);break;} :{ri x=read();printf("%lld\n",query_pre(x));break;} } } ; }
只会做做小水题安慰下自己了QAQ
洛谷P3178 树上操作 [HAOI2015] 树链剖分的更多相关文章
- Luogu P3178 树上操作(树链剖分+线段树)
题意 见原题 题解 重链剖分模板题 #include <cstdio> #include <algorithm> using std::swap; typedef long l ...
- 洛谷 P3384 【模板】树链剖分-树链剖分(点权)(路径节点更新、路径求和、子树节点更新、子树求和)模板-备注结合一下以前写的题目,懒得写很详细的注释
P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节 ...
- 洛谷p3384【模板】树链剖分题解
洛谷p3384 [模板]树链剖分错误记录 首先感谢\(lfd\)在课上调了出来\(Orz\) \(1\).以后少写全局变量 \(2\).线段树递归的时候最好把左右区间一起传 \(3\).写\(dfs\ ...
- 洛谷P3178 [HAOI2015]树上操作 题解 树链剖分+线段树
题目链接:https://www.luogu.org/problem/P3178 这道题目是一道树链剖分的模板题. 但是在解决这道问题的同事刷新了我的两个认识: 第一个认识是:树链剖分不光可以处理链, ...
- [HAOI2015]树上操作(树链剖分)
[HAOI2015]树上操作(luogu) Description 题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种: 操作 1 :把某个节点 x 的点权增 ...
- BZOJ_4034 [HAOI2015]树上操作 【树链剖分dfs序+线段树】
一 题目 [HAOI2015]树上操作 二 分析 树链剖分的题,这里主要用到了$dfs$序,这题比较简单的就是不用求$lca$. 1.和树链剖分一样,先用邻接链表建双向图. 2.跑两遍$dfs$,其实 ...
- 【HAOI2015】树上操作(树链剖分)
题面 Description 有一棵点数为N的树,以点1为根,且树点有边权.然后有M个操作,分为三种: 操作1:把某个节点x的点权增加a. 操作2:把某个节点x为根的子树中所有点的点权都增加a. 操作 ...
- BZOJ 4034 [HAOI2015]树上操作(树链剖分)
题目链接 BZOJ4034 这道题树链剖分其实就可以了. 单点更新没问题. 相当于更新 [f[x], f[x]]这个区间. f[x]表示树链剖分之后每个点的新的标号. 区间更新的话类似DFS序,求出 ...
- 洛谷 P3384 【模板】树链剖分
树链剖分 将一棵树的每个节点到它所有子节点中子树和(所包含的点的个数)最大的那个子节点的这条边标记为"重边". 将其他的边标记为"轻边". 若果一个非根节点的子 ...
随机推荐
- 伟哥对RTO & RPO的通俗理解
RTO (Recovery Time Objective,复原时间目标)是企业可容许服务中断的时间长度.比如说灾难发生后半天内便需要恢复,RTO值就是十二小时: RPO (Recovery Point ...
- 前端项目添加自定义icont图标步骤
文章转自https://blog.csdn.net/weixin_36185028/article/details/53416185 这里就用到了两个文件,一个是icontfont.css,另外一个是 ...
- Electron初探
H5开发桌面应用? 没错,H5现在也可以开发跨平台的桌面应用了,这意味着我们可以用网页来设计和制作桌面应用. 基于Node.js的Electron框架就可以实现桌面应用,比较有名的Electron框架 ...
- [MySQL Status] Queries,Questions,read/s区别,Com_Commit和handle_commit
Queries: 这个状态变量表示,mysql系统接收的查询的次数,包括存储过程内部的查询 Questions: 这个状态变量表示,mysql系统接收查询的次数,但是不包括存储过程内部的查询 ...
- 建站工具Hexo
$ npm install hexo-cli -g $ hexo init blog $ cd blog $ npm install $ hexo server
- 关于QQ邮箱有时候接受不到邮件的解决
1.很可能是被当作垃圾邮件拦截了,这时候就要自己找回 2.首先点击邮箱首页 3.在最后一行倒数第三个选择自助查询 4.一般在收信查询或者删信查询里面,找到被删的邮件,添加到白名单就好了
- 04Hadoop中的setPartitionerClass/SortComparator/GroupingComparator问题
map阶段 1. 使用job.setInputFormatClass(TextInputFormat)做为输入格式.注意输出应该符合自定义Map中定义的输出. 2. 进入Mapper的map()方法, ...
- Linux使用命令修改默认启动为图形或字符界面
因为要在Linux系统上装NVIDIA显卡驱动,默认重启必须是字符界面,因此把这块所需命令记录下来. 1,先查看当前系统默认启动的界面 systemctl get-default 2,修改默认启动界面 ...
- Windows 性能监视器的基本指标说明(CPU,内存,硬盘参数)
[转]Windows 性能监视器的基本指标说明(CPU,内存,硬盘参数) 作为一个系统工程师来说,要看懂监控的数据至关重要,关系着优化和分析出现的问题.我是在运维过程中要用到的.因此,今天给出Wind ...
- 使用RecyclerView设置自定义分割线
在安卓开发中,RecyclerView控件来做一些列表是非常方便的,如何使用在网上很多文章,这次着重来说一下怎么设置自定义分割线: 首先,我们来看一下怎么设置默认的分割线 RecyclerView m ...