Time limit 10000 ms//另外,BZOJ只算所有点的总时限,所以可能会放过一些原本会TLE的代码
Memory limit 165888 kB
OS Linux
SourceZJOI2008

吐槽

时隔两年再次写树剖,跟楞半岛,找bug找得想吐,被卡题惨烈程度堪比这次——[HAOI2015]树上操作。

这题被卡的地方在于,单点修改的时候,树上节点的老id没有变成新id,就拿到线段树上做修改了……卡了两天,拿lemon在本地一遍又一遍测试,没有去oj上交,不然有卡评测的嫌疑……

顺便,win10下栈空间好小,4号点、7号点、9号点树比较深,甚至是链,于是win10下跑dfs就给爆栈了,甚至加了#pragma comment(linker,"/STACK:1024000000,1024000000")也不行(权限不够?)。

这篇博客纯属纪念。

板子题没有解题思路

源代码

#include<cstdio>
#include<algorithm>int n,q;struct Edge{int nxt,to;
}e[60010];
int head[30010],cnt=1;
void add(int u,int v)
{e[cnt]={head[u],v};head[u]=cnt++;e[cnt]={head[v],u};head[v]=cnt++;
}
struct Tree{long long w;int fa,dep,sz,wson,top,id;
}t[30010];
void dfs1(int u,int fa)
{t[u].fa=fa;t[u].dep=t[fa].dep+1;t[u].sz=1;t[u].wson=0;int maxn=0;for(int i=head[u];i;i=e[i].nxt){int v=e[i].to;if(v==fa) continue;dfs1(v,u);int temp=t[v].sz;t[u].sz+=temp;if(temp>maxn){t[u].wson=v;maxn=temp;}}
}
int id=1;
long long a[30010];
void dfs2(int u,int top)
{t[u].top=top;t[u].id=id;a[id]=t[u].w;id++;if(!t[u].wson) return;dfs2(t[u].wson,top);for(int i=head[u];i;i=e[i].nxt){int v=e[i].to;if(v==t[u].fa||v==t[u].wson) continue;dfs2(v,v);}
}
struct SegTree{int l,r;long long sum,mx;
}s[120010];
inline void pushup(int x)
{s[x].sum=s[x<<1].sum+s[x<<1|1].sum;s[x].mx=std::max(s[x<<1].mx,s[x<<1|1].mx);
}
void build(int x,int l,int r)
{s[x].l=l;s[x].r=r;if(l==r){s[x].mx=s[x].sum=a[l];return;}int mid=l+r>>1;build(x<<1,l,mid);build(x<<1|1,mid+1,r);pushup(x);
}
void update(int x,int pos,long long k)
{if(s[x].l==s[x].r&&s[x].l==pos){s[x].mx=s[x].sum=k;return;}int mid=s[x].l+s[x].r>>1;if(pos<=mid) update(x<<1,pos,k);else update(x<<1|1,pos,k);pushup(x);
}
long long quemx(int x,int l,int r)
{if(l<=s[x].l&&s[x].r<=r) return s[x].mx;int mid=s[x].l+s[x].r>>1;long long ans=-1e9;if(l<=mid) ans=std::max(ans,quemx(x<<1,l,r));if(r>mid) ans=std::max(ans,quemx(x<<1|1,l,r));return ans;
}
long long quesum(int x,int l,int r)
{if(l<=s[x].l&&s[x].r<=r) return s[x].sum;int mid=s[x].l+s[x].r>>1;long long ans=0;if(l<=mid) ans+=quesum(x<<1,l,r);if(r>mid) ans+=quesum(x<<1|1,l,r);return ans;
}
inline void change(int pos,long long k)
{update(1,t[pos].id,k);//就是这里,我之前写成了update(1,pos,k);
}
long long qmax(int u,int v)
{long long ans=-99999999;while(t[u].top!=t[v].top){if(t[t[u].top].dep<t[t[v].top].dep) std::swap(u,v);ans=std::max(ans,quemx(1,t[t[u].top].id,t[u].id));u=t[t[u].top].fa;}if(t[u].id>t[v].id) std::swap(u,v);ans=std::max(ans,quemx(1,t[u].id,t[v].id));return ans;
}
long long qsum(int u,int v)
{long long ans=0;while(t[u].top!=t[v].top){if(t[t[u].top].dep<t[t[v].top].dep) std::swap(u,v);ans+=quesum(1,t[t[u].top].id,t[u].id);u=t[t[u].top].fa;}if(t[u].id>t[v].id) std::swap(u,v);ans+=quesum(1,t[u].id,t[v].id);return ans;
}int main()
{//freopen("test.in","r",stdin);scanf("%d",&n);for(int i=1,u,v;i<n;i++){scanf("%d%d",&u,&v);add(u,v);}for(int i=1;i<=n;i++) scanf("%lld",&t[i].w);dfs1(1,0);dfs2(1,1);build(1,1,n);scanf("%d",&q);while(q--){char opt[20]={0};int x,y;scanf("%s%d%d",opt,&x,&y);if(opt[1]=='H') change(x,(long long)y);else if(opt[1]=='M') printf("%lld\n",qmax(x,y));else printf("%lld\n",qsum(x,y));}
}

转载于:https://www.cnblogs.com/wawcac-blog/p/11313643.html

洛谷 P2590 BZOJ 1036 [ZJOI2008]树的统计相关推荐

  1. BZOJ 1036: [ZJOI2008]树的统计Count

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 3427  Solved: 1429 [Submi ...

  2. 树链剖分(bzoj 1036: [ZJOI2008]树的统计Count)

    树链剖分: 把一棵树剖分为若干条链,然后利用数据结构(树状数组,SBT,Splay,线段树等等)去维护每一条链,复杂度 为O(logn),总体复杂度O(nlog²n) 步骤: ①将树的边分成重边和轻边 ...

  3. BZOJ 1036 [ZJOI2008]树的统计Count

    以前动态树写过这个题,今天尝试树链剖分解决~ 模板题,就声明一点,线段树维护的是点权 View Code 1 #include <iostream> 2 #include <cstd ...

  4. 树链剖分 - BZOJ 1036: [ZJOI2008]树的统计Count

    这是树链剖分的入门题,也是我学树链剖分的第一题. 树链剖分:就是把树中和线段树联系起来,求(u,v)路径中权值的最大值和其路径的权值和. 入门blog:http://blog.sina.com.cn/ ...

  5. 【BZOJ 1036】 树的统计count

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

  6. 1036: [ZJOI2008]树的统计Count

    链剖 1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 #include < ...

  7. 洛谷——P2590 [ZJOI2008]树的统计(树链剖分模板练手)

    P2590 [ZJOI2008]树的统计 I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值 III. QSUM u v: 询问 ...

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

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

  9. 洛谷 P3384 【模板】树链剖分-树链剖分(点权)(路径节点更新、路径求和、子树节点更新、子树求和)模板-备注结合一下以前写的题目,懒得写很详细的注释...

    P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节 ...

最新文章

  1. Devexpress 10.2.3 Demo 批量生成脚本
  2. Spring Boot 2.1之后如何在启动日志中打印请求路径列表
  3. c#启动EXE文件(简单的)
  4. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言—— 1059:求平均年龄
  5. python开发网页视频播放器_HTML5 VideoAPI,打造自己的Web视频播放器
  6. mysql启动提示 access denied for user root@localhost(using password:YES) 解决办法总结
  7. 程序路漫漫兮,上下而求索
  8. html叠加层,JavaScript实现多个重叠层点击切换效果的方法
  9. 联合索引会创建几个索引_【1033期】分别谈谈联合索引生效和失效的条件
  10. 如何为XAF设置默认属性值?
  11. C语言编程QQ管理系统,顺序表- QQ群名片信息管理系统设计(C语言实现)
  12. [高频电子线路]-避免从第一章开始懵逼
  13. H5抽奖十二宫格声音问题
  14. 系统管理员设置了系统策略禁止进行此安装怎么解决
  15. 高盛:云计算市场2021年将增至1160亿美元 四巨头成赢家
  16. 《寒江独钓 Windows内核安全》——串口的过滤
  17. C语言求sgn函数,sgnx(sgn函数)
  18. 软件单元测试要点的一些理解
  19. java返回一个布尔值_关于java:返回布尔值的方法
  20. JavaScript jQuery修改样式

热门文章

  1. 辰皇怎么过鸿蒙,诛仙3职业全面解析 各职业副本优缺点介绍
  2. php程序员试卷无答案,2019年最新PHP经典面试题及答案,PHP程序员必看
  3. 如何开启jvm日志_Java 从小白到大牛,JVM 不得不知的一些参数和配置
  4. mybatis SqlMapConfig.xml
  5. shell 循环控制语句
  6. shell 执行脚本
  7. Java字符串替换(replace)
  8. Linux多进程的应用
  9. VOICEBOX: Speech Processing Toolbox for MATLAB
  10. 基于VMware应用环境的备份恢复解决方案思路