BZOJ 1036 && Luogu P2590 [ZJOI2008]树的统计 树链剖分
链剖裸题。。。你值得一做~
用线段树多维护一个mx,少写一个tag
#include<cstdio>
#include<iostream>
#define ll long long
#define R register ll
#define ls (tr<<1)
#define rs (tr<<1|1)
using namespace std;
const int N=;
inline ll g() {
R ret=,fix=; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-:fix;
do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret*fix;
}
int n,m,cnt,num,mod;
int vr[N<<],nxt[N<<],fir[N],dfn[N],pre[N],son[N],d[N],sz[N],top[N],rw[N],w[N];
ll sum[N<<],mx[N<<];
inline void add(int u,int v) {vr[++cnt]=v,nxt[cnt]=fir[u],fir[u]=cnt;}
void dfs(int u) { sz[u]=; R mx=;
for(R i=fir[u];i;i=nxt[i]) { R v=vr[i];
if(d[v]) continue; pre[v]=u; d[v]=d[u]+;
dfs(v); sz[u]+=sz[v]; if(sz[v]>mx) son[u]=v,mx=sz[v];
}
}
void dfs_(int u,int tp) {
top[u]=tp,dfn[u]=++num,rw[num]=u;
if(son[u]) dfs_(son[u],tp);
for(R i=fir[u];i;i=nxt[i]) { R v=vr[i];
if(v!=pre[u]&&v!=son[u]) dfs_(v,v);
}
}
inline void build(int tr,int l,int r) {
if(l==r) {mx[tr]=sum[tr]=w[rw[l]]; return ;}
R md=(l+r)>>; build(ls,l,md),build(rs,md+,r);
sum[tr]=sum[ls]+sum[rs],mx[tr]=max(mx[ls],mx[rs]);
}
inline ll queryS(int tr,int l,int r,int LL,int RR) {
if(LL<=l&&r<=RR) return sum[tr]; R md=(l+r)>>,ret=;
if(LL<=md) ret+=queryS(ls,l,md,LL,RR); if(RR>md) ret+=queryS(rs,md+,r,LL,RR);
return ret;
}
inline ll queryM(int tr,int l,int r,int LL,int RR) {
if(LL<=l&&r<=RR) return mx[tr]; R md=(l+r)>>,ret=-;
if(LL<=md) ret=max(queryM(ls,l,md,LL,RR),ret); if(RR>md) ret=max(queryM(rs,md+,r,LL,RR),ret);
return ret;
}
inline void update(int tr,int l,int r,int pos,ll inc) {
if(l==r) {mx[tr]=sum[tr]=inc; return ;}
R md=(l+r)>>; if(pos<=md) update(ls,l,md,pos,inc); else update(rs,md+,r,pos,inc);
sum[tr]=sum[ls]+sum[rs],mx[tr]=max(mx[ls],mx[rs]);
}
inline ll queryTS(int u,int v) { R ret=;
while(top[u]!=top[v]) {
if(d[top[u]]<d[top[v]]) swap(u,v);
ret+=queryS(,,n,dfn[top[u]],dfn[u]);
u=pre[top[u]];
} if(dfn[u]>dfn[v]) swap(u,v); ret+=queryS(,,n,dfn[u],dfn[v]);
return ret;
}
inline ll queryTM(int u,int v) { R ret=-;
while(top[u]!=top[v]) {
if(d[top[u]]<d[top[v]]) swap(u,v);
ret=max(queryM(,,n,dfn[top[u]],dfn[u]),ret);
u=pre[top[u]];
} if(dfn[u]>dfn[v]) swap(u,v); ret=max(queryM(,,n,dfn[u],dfn[v]),ret);
return ret;
}
inline void print(int tr,int l,int r) {
if(l==r) {printf("%lld %lld ",sum[tr],mx[tr]); return ;} R md=(l+r)>>;
print(ls,l,md),print(rs,md+,r);
}
signed main() {
n=g(); for(R i=,u,v;i<n;++i) u=g(),v=g(),add(u,v),add(v,u);
for(R i=;i<=n;++i) w[i]=g();
d[]=top[]=pre[]=; dfs(),dfs_(,); build(,,n); m=g();
for(R i=;i<=m;++i) { register char ch;
while(!isalpha(ch=getchar())); ch=getchar(); R u=g(),v=g();
if(ch=='H') update(,,n,dfn[u],v);
else if(ch=='M') printf("%lld\n",queryTM(u,v));
else printf("%lld\n",queryTS(u,v));
}
}
想想就有些后怕,自己调了一个半小时,结果发现update没有写dfn[u],而写的u。。。
2019.04.19
BZOJ 1036 && Luogu P2590 [ZJOI2008]树的统计 树链剖分的更多相关文章
- BZOJ 1036: [ZJOI2008]树的统计Count-树链剖分(点权)(单点更新、路径节点最值、路径求和)模板,超级认真写了注释啊啊啊
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 23015 Solved: 9336[Submit ...
- 树的统计Count---树链剖分
NEFU专项训练十和十一——树链剖分 Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t ...
- luoguP2590 [ZJOI2008]树的统计(树链剖分)
luogu P2590 [ZJOI2008]树的统计 题目 #include<iostream> #include<cstdlib> #include<cstdio> ...
- [BZOJ 3295] [luogu 3157] [CQOI2011]动态逆序对(树状数组套权值线段树)
[BZOJ 3295] [luogu 3157] [CQOI2011] 动态逆序对 (树状数组套权值线段树) 题面 给出一个长度为n的排列,每次操作删除一个数,求每次操作前排列逆序对的个数 分析 每次 ...
- Luogu P2590 [ZJOI2008]树的统计
最近在学树剖,看到了这题就做了 [ZJOI2008]树的统计 思路 从题面可以知道,这题是树剖题(要求的和模板没什么区别呀喂 就是在普通的树剖上加了一个最大值 所以可以知道就是树剖+特殊的线段树 线段 ...
- [luogu P2590 ZJOI2008] 树的统计 (树链剖分)
题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u ...
- BZOJ 1036 树的统计-树链剖分
[ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 12904 Solved: 5191[Submit][Status ...
- 洛谷P2590 [ZJOI2008] 树的统计 [树链剖分]
题目传送门 树的统计 题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t ...
- [ZJOI2008]树的统计——树链剖分
本题是一个树链剖分裸题,由于比较菜,老是RE,后来发现是因为使用了全局变量. /************************************************************ ...
随机推荐
- tkinter之canvas(画布)
画布的例子: from tkinter import * root=Tk() root.title('简易绘图') can=Canvas(root,width=400,height=300,bg='# ...
- html5--1.9 img元素嵌入图片
html5--1.9 img元素嵌入图片 学习要点: img元素嵌入图片学习一个新属性:title 1.img的属性 1.src:必要属性,制定图片来源的路径; 2.alt属性:当图片无法显示时的替代 ...
- 51nod1671【货物运输】
开始天真的我以为这道题和运输计划是一样的套路.于是写了一发,debug后发现过了第一个点,十分开心的交了一发,结果只过了第一个点.后来发现这个并不是一样的,因为修建黑洞之后路径法变了,而运输计划没有( ...
- HihoCoder1649 : 漏写的数字([Offer收割]编程练习赛38)(模拟题)
描述 小A今年刚上幼儿园,正在学习写100以内的数字.幼儿园的老师留了一项作业,要求小A从某个100以内的数X开始一直写到另一个100以内的数Y(Y - X > 1). 不过粗心的小A在作业中漏 ...
- 一般项目转为Maven项目所遇到的问题
最近搞CI,准备使用Maven,但以前的项目不是Maven项目,需要把项目转换为Maven项目.这遇到几个小问题,一是jar包的依赖,二是从本地仓库取出依赖jar包. 由于没有本地仓库,要手动添加ja ...
- js中变量声明提前
demo1: var a=10; function b(){alert(a); var a=20; alert(a)} b()//undefined 20 因为:js编译器在执行b这个函数时,会把函数 ...
- 希尔排序(java)
希尔排序是对直接插入排序的一种优化,基本思想是把待排序的数据元素分成若干个小组,对同一小组内的数据元素用直接插入法排序:小组的个数逐次缩小:当完成了所有数据元素都在一个组内的排序后排序过程结束.希尔排 ...
- [hdu6201]transaction transaction transaction(树形dp)
题意:某人在一棵树中在某处买物品,价格为i,在某处卖物品,价格为j,每单位距离花费价格1,求最大赚钱数. 解题关键:两次树形dp,分别求出每个点作为被减和被加情况下的最大值,最后取一下max即可. 该 ...
- git for eclipse 如何取消误操作的忽略(ignore)操作
直接删除ignore文件即可.如下显示: 原文引用:https://blog.csdn.net/exceptionss/article/details/79082601
- error: field has incomplete type
在头文件使用某一自定义的类的指针或引用时,只需要前置声明该类即可,然而如果该类中有静态成员时,必须包含该类的头文件,而不是使用前置声明.