P2590 [ZJOI2008]树的统计

I. CHANGE u t : 把结点u的权值改为t

II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值

III. QSUM u v: 询问从点u到点v的路径上的节点的权值和

(博主)神蒟本蒻,又A了一道树链剖分的模板题,还是太颓废了。。。

调了我一个小时。。。

dfs+线段树维护区间和和最大值。

自带大常常数

#include<iostream>
#include<cstdio>
#include<cmath>#define LL long long
#define IL inline
#define RE register
#define N 1000000
using namespace std;int head[N],tot,n,m,val[N],val_w[N];
struct node{int to,next;
}e[N];void add(int u,int v){e[++tot].to=v,e[tot].next=head[u],head[u]=tot;
}int f[N],siz[N],son[N],top[N],dep[N],id[N],item;IL void dfs1(int u,int fa){f[u]=fa,siz[u]=1,dep[u]=dep[fa]+1;int maxson=-1;for(int i=head[u];i;i=e[i].next){int v=e[i].to;if(v==fa) continue;dfs1(v,u);siz[u]+=siz[v];if(siz[v]>maxson) maxson=siz[v],son[u]=v;}
}IL void dfs2(int u,int topf){id[u]=++item,top[u]=topf,val_w[item]=val[u];if(!son[u]) return;dfs2(son[u],topf);for(int i=head[u];i;i=e[i].next){int v=e[i].to;if(v==f[u]||v==son[u]) continue;dfs2(v,v);}
}
struct Segment{int l,r,w,w_max;
}tr[N];IL void push_up(int k){tr[k].w_max=max(tr[k<<1].w_max,tr[k<<1|1].w_max);tr[k].w=tr[k<<1].w+tr[k<<1|1].w;
}IL void build(int k,int l,int r){tr[k].l=l,tr[k].r=r;if(l==r){tr[k].w=tr[k].w_max=val_w[l];return;}int mid=(l+r)>>1;build(k<<1,l,mid);build(k<<1|1,mid+1,r);push_up(k);
}IL void change(int k,int X,int val_V){int l=tr[k].l,r=tr[k].r,mid=(l+r)>>1;if(l==r) {tr[k].w_max=tr[k].w=val_V;return;}if(X<=mid) change(k<<1,X,val_V);else change(k<<1|1,X,val_V);push_up(k);
}IL int ask_max(int k,int ql,int qr){int l=tr[k].l,r=tr[k].r,mid=(l+r)>>1;if(l>=ql&&r<=qr) return tr[k].w_max;int ans=-0x7fffffff;if(ql<=mid) ans=ask_max(k<<1,ql,qr);if(qr>mid) ans=max(ans,ask_max(k<<1|1,ql,qr));return ans;
}IL int ask_sum(int k,int ql,int qr){int l=tr[k].l,r=tr[k].r,mid=(l+r)>>1;if(l>=ql&&r<=qr) return tr[k].w;int ans=0;if(ql<=mid) ans+=ask_sum(k<<1,ql,qr);if(qr>mid) ans+=ask_sum(k<<1|1,ql,qr);return ans;
}IL int q_max(int u,int v){int ans=-0x7fffffff;while(top[u]!=top[v]){if(dep[top[u]]<dep[top[v]]) swap(u,v);ans=max(ans,ask_max(1,id[top[u]],id[u]));u=f[top[u]];}if(dep[u]<dep[v]) swap(u,v);ans=max(ans,ask_max(1,id[v],id[u]));return ans;
}IL int q_sum(int u,int v){int ans=0;while(top[u]!=top[v]){if(dep[top[u]]<dep[top[v]]) swap(u,v);ans+=ask_sum(1,id[top[u]],id[u]);u=f[top[u]];}if(dep[u]<dep[v]) swap(u,v);ans+=ask_sum(1,id[v],id[u]);return ans;
}string s;int main()
{scanf("%d",&n);for(int u,v,i=1;i<n;i++){scanf("%d%d",&u,&v);add(u,v),add(v,u);}for(int i=1;i<=n;i++) scanf("%d",&val[i]);dfs1(1,1);dfs2(1,1);build(1,1,n);scanf("%d",&m);    for(int u,v,i=1;i<=m;i++){cin>>s;scanf("%d%d",&u,&v);if(s=="CHANGE")change(1,id[u],v);else if(s=="QMAX") printf("%d\n",q_max(u,v));else printf("%d\n",q_sum(u,v));}return 0;
}

转载于:https://www.cnblogs.com/song-/p/9777724.html

洛谷——P2590 [ZJOI2008]树的统计(树链剖分模板练手)相关推荐

  1. 洛谷 P2590 [ZJOI2008]树的统计

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

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

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

  3. 信息学奥赛一本通 1365:FBI树(fbi) | 1928:【04NOIP普及组】FBI树 | 洛谷 P1087 [NOIP2004 普及组] FBI 树

    [题目链接] ybt 1365:FBI树(fbi) ybt 1928:[04NOIP普及组]FBI树 洛谷 P1087 [NOIP2004 普及组] FBI 树 [题目考点] 1. 二叉树 [解题思路 ...

  4. 洛谷P3384 - 树链剖分(树链剖分模板题)

    题目链接 https://www.luogu.org/problemnew/show/P3384 [描述] 树链剖分模板题,记一下板子 #include<bits/stdc++.h> #d ...

  5. 信息学奥赛一本通 1400:统计单词数 | 1954:【11NOIP普及组】统计单词数 | OpenJudge NOI 1.12 05 | 洛谷 P1308 [NOIP2011 普及组] 统计单词数

    [题目链接] ybt 1400:统计单词数 ybt 1954:[11NOIP普及组]统计单词数 OpenJudge NOI 1.12 05:统计单词数 洛谷 P1308 [NOIP2011 普及组] ...

  6. 信息学奥赛一本通 1239:统计数字 | 1847:【07NOIP提高组】统计数字 | OpenJudge NOI 2.4 7909 | 洛谷 P1097 [NOIP2007 提高组] 统计数字

    [题目链接] ybt 1239:统计数字 ybt 1847:[07NOIP提高组]统计数字 一本通中限制不许使用STL,那么引入头文件不能写<bits/stdc++.h>,只能写<i ...

  7. 洛谷P5069 [Ynoi2015]纵使日薄西山(树状数组,set)

    洛谷题目传送门 一血祭 向dllxl致敬! 算是YNOI中比较清新的吧,毕竟代码只有1.25k. 首先我们对着题意模拟,寻找一些思路. 每次选了一个最大的数后,它和它周围两个数都要减一.这样无论如何, ...

  8. 洛谷P5149——会议座位【字典树 + 逆序对】

    洛谷P5149--会议座位 大致思路:我们先用字典树把单词存起来,在每个单词的末尾节点给这个单词按照出现顺序标号,然后在查找的过程中,把其出现顺序用一个数组一次存起来,然后求这个数组的逆序对即可. # ...

  9. 洛谷 - P4755 Beautiful Pair(笛卡尔树+主席树)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数列 a,现在一个数对 ( i , j ) 如果满足 a[ i ] * a[ j ] <=max( a[ i ] ~ a[ j ] ),则称其 ...

最新文章

  1. 是时候对XSLT说“Goodbye”了吗?
  2. 对GC垃圾收集的一点整理
  3. [PHP] 现代化PHP之路:composer的镜像站设置
  4. 盘点:最值得托付终身的星座
  5. c 多线程map_Rust:一个不再有 C/C++ 的,实现安全实时软件的未来
  6. nginx访问本地目录一直不好使_Nginx跳转本地目录容易犯的错误
  7. 使用谷歌浏览器全文搜索资源文件中的关键词
  8. 和 Apple “较上劲”了?Google 解决 Cookie 隐私问题上拒绝“一刀切”
  9. 使用Maven开发Hadoop
  10. jQuery ajax post put 请求
  11. tensorflow之卷积神经网络
  12. void main(){char str[] = “\tab\n\014\\\“;printf(“%d“,strlen(str))}
  13. 华云数据:以信创云构筑自主创新长城之基
  14. tensorflow keras 构建神经网络、Alex net、VGG、CNN网络
  15. excel出入库采购库存管理系统
  16. 月薪过万是普遍现象吗?很抱歉,这事大部分人的错觉
  17. MATLAB批量改变图片大小
  18. 数据链路层——局域网扩展
  19. 【VUE项目实战】68、使用pm2管理项目
  20. 苹果超薄触摸显示技术专利曝光:重新定义轻薄

热门文章

  1. Fedora下网络配置及相关命令
  2. 计算机辅助药物合成投什么期刊,中国药物化学杂志审稿快吗
  3. java 无法找到ant_无法找到与ANT(mac)关联的文件
  4. Redis缓存穿透、击穿、雪崩及主从复制
  5. 数据集合 oracle,oracle集合
  6. 2019ug最新版本是多少_NX1847:2019年最新版本,从某种意义上来说,也将是终极版本...
  7. Tomcat的Classpath-常见问题以及如何解决
  8. 004_Vue按键修饰符
  9. 052_CSS3 appearance属性
  10. springboot中java泛型使用