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,后来发现是因为使用了全局变量. /************************************************************ ...
随机推荐
- 引用 qsort与sort的比较
引用 linpder 的 qsort与sort的比较 在C/C++标准库中提供了快速排序的函数qsort():在STL中也提供了sort()排序函数,那么这两个函数哪个快呢?之前与代码-> ...
- <%!%>声明的变量和在<%%>中声明的变量的区别
通过写一个demo,查看Jsp_Servlet源码可知: <%!%>声明的变量是类似类的成员变量,<%%>中的变量是方法中的变量. 参考博客: http://www.cnblo ...
- jauery改变inout的type属性报错type property can’t be changed
uncaught exception type property can’t be changed 使用代码$("#pwd").attr("type",&quo ...
- codeforces 558A A. Lala Land and Apple Trees(水题)
题目链接: A. Lala Land and Apple Trees time limit per test 1 second memory limit per test 256 megabytes ...
- Python: Neural Networks
这是用Python实现的Neural Networks, 基于Python 2.7.9, numpy, matplotlib. 代码来源于斯坦福大学的课程: http://cs231n.github. ...
- 查看linux连接进程占用的实时流量 -nethogs
1.安装nethogs yum -y install nethogs 2.安装完成后,就可以执行命令 nethogs 3.实时查看进程流量,来个图显示 图中会显示当前的nginx产生的流量有多少都会清 ...
- 如何卸载ubuntu软件
你的硬盘空间已经不太足够了?如果你使用的是Ubuntu操作系统,你可能想知道如何能够卸载过时.无用的程序.有几种方法可以卸载程序,包括图形化方法和命令行方法.参考本指南,采用最适合你的方法卸载程序. ...
- bzoj 3522: Hotel dfs
题目大意 在无边权树上求三个点,使两两点的距离等.求方案数\((n\leq 5000)\) 题解 我们知道三个点在树上的关系只有两种 三点共链 三点不共连 (这不是废话吗) 我们发现三点共链肯定不满足 ...
- window下的hosts
存放在windows系统目录中的\system32\drivers\etc下面. hosts文件是用来记录主机ip地址和主机名的对应关系,建立后就可以用主机名来访问主机,而不必记ip地址了.hosts ...
- C++与UnrealScript脚本交互
转自:http://m.blog.csdn.net/blog/qweewqpkn/39932499 一.c++调用uc脚本中的函数 举例: 1. 在脚本MenuManager.uc文件中实现函数: e ...