链剖裸题。。。你值得一做~

用线段树多维护一个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]树的统计 树链剖分的更多相关文章

  1. BZOJ 1036: [ZJOI2008]树的统计Count-树链剖分(点权)(单点更新、路径节点最值、路径求和)模板,超级认真写了注释啊啊啊

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 23015  Solved: 9336[Submit ...

  2. 树的统计Count---树链剖分

    NEFU专项训练十和十一——树链剖分 Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t ...

  3. luoguP2590 [ZJOI2008]树的统计(树链剖分)

    luogu P2590 [ZJOI2008]树的统计 题目 #include<iostream> #include<cstdlib> #include<cstdio> ...

  4. [BZOJ 3295] [luogu 3157] [CQOI2011]动态逆序对(树状数组套权值线段树)

    [BZOJ 3295] [luogu 3157] [CQOI2011] 动态逆序对 (树状数组套权值线段树) 题面 给出一个长度为n的排列,每次操作删除一个数,求每次操作前排列逆序对的个数 分析 每次 ...

  5. Luogu P2590 [ZJOI2008]树的统计

    最近在学树剖,看到了这题就做了 [ZJOI2008]树的统计 思路 从题面可以知道,这题是树剖题(要求的和模板没什么区别呀喂 就是在普通的树剖上加了一个最大值 所以可以知道就是树剖+特殊的线段树 线段 ...

  6. [luogu P2590 ZJOI2008] 树的统计 (树链剖分)

    题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u ...

  7. BZOJ 1036 树的统计-树链剖分

    [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 12904 Solved: 5191[Submit][Status ...

  8. 洛谷P2590 [ZJOI2008] 树的统计 [树链剖分]

    题目传送门 树的统计 题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t ...

  9. [ZJOI2008]树的统计——树链剖分

    本题是一个树链剖分裸题,由于比较菜,老是RE,后来发现是因为使用了全局变量. /************************************************************ ...

随机推荐

  1. Oracle约束的使用

    --5个约束,主键约束.外键约束.唯一约束.检查约束.非空约束. --添加主键约束 Alter table table_name Add constraints constraint_name Pri ...

  2. Maven项目中使用JUnit进行单元测试

    1.打开maven项目中的pom.xml,添加JUnit 的jar包 2.在src/test/java下右键新建JUnit Test Cast

  3. 2018.2.27 RF module distance test part I

    Last week,we finish 20  pcs EP2 sample for RF module, Fistly,we need to test PCBA  performance test ...

  4. 学习 Shell —— 括号、引号

    shell中各种括号的作用().(()).[].[[]].{} shell中的括号(小括号,大括号/花括号) ${},大括号用于确定变量的范围: $(( 数学运算 )) 0. 引号 单引号.双引号.飘 ...

  5. Stamps

    链接 分析:dp[i][j]表示前i个数,组成j,最少需要多少个.dp[i][j]=min(dp[i-1][j],dp[i-1][j-k*v[i]]+k),则可以转化为完全背包问题,同样的方法进行降维 ...

  6. U盘安装CentOS的坑

    坑一:U盘安装盘配置的路径错误 采用UltraISO制作的CentOS7的安装光盘,但是在实体机安装的时候,发生了一些奇怪的失败,比如 dracut-initqueue timeout等,后来在网上搜 ...

  7. Adobe Flash Player 27 on Fedora 27/26, CentOS/RHEL 7.4/6.9

    This is guide, howto install Adobe Flash Player Plugin version 27 (32-bit and 64-bit) with YUM/DNF o ...

  8. 整理出来的一个windows关机、锁定、重启、注销 API调用

    using System.Runtime.InteropServices; namespace HookDemo { class WindowsExit { [StructLayout(LayoutK ...

  9. [poj3071]football概率dp

    题意:n支队伍两两进行比赛,求最有可能获得冠军的队伍. 解题关键:概率dp,转移方程:$dp[i][j] +  = dp[i][j]*dp[i][k]*p[j][k]$表示第$i$回合$j$获胜的概率 ...

  10. 计算机网络HTTP、TCP/IP包

    参考: TCP-IP数据包结构详解 HTTP报文格式详解 Http协议报文格式 HTTP请求/响应报文结构 [Java知识]GET和POST请求的区别