求赞


大家好,我非常喜欢暴力数据结构,于是我用块状树过了这道题目

题目:

一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w。

我们将以下面的形式来要求你对这棵树完成一些操作:

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

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

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

注意:从点u到点v的路径上的节点包括u和v本身


我们可以将树大约划分为\(\sqrt{n}\)块,每个块内维护到块内根节点的路径长度以及点权最大值,而且,显然,我们可以通过寻找它们的\(LCA\)来找到他们路径上的有关信息,而这里我们已经对树进行了分块。

所以在同一个块内的暴跳时间复杂度最坏为\(O(\sqrt{n})\)

在块与块之间的暴跳的时间复杂度最坏为\(O(\sqrt{n})\)

轻松AC本题目

代码中有较详细注释,贴代码

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
struct cc{
int to,nex;
}e[maxn],dis[maxn];
int head[maxn],cnt1,h[maxn],cnt2;
void add1(int u,int v)//原树边
{
++cnt1;
e[cnt1].to=v;
e[cnt1].nex=head[u];
head[u]=cnt1;
}
void add2(int u,int v)//分块后块内树边
{
++cnt2;
dis[cnt2].to=v;
dis[cnt2].nex=h[u];
h[u]=cnt2;
}
int rt[maxn],mx[maxn],sum[maxn],siz[maxn];
int n,m,v[maxn],deep[maxn],len,fa[maxn];
void dfs(int u,int f,int dep)
{
deep[u]=dep;
int tmp=rt[u];
fa[u]=f;
for(int i=head[u];i;i=e[i].nex)
{
int v=e[i].to;
if(v!=f)
{
if(siz[tmp]+1<len)
{
add2(u,v);//块内树连边
rt[v]=tmp;
++siz[tmp];
}
dfs(v,u,dep+1);
}
}
}
void build(int u,int num,int vmx)//维护当前节点,到块内根节点的和,最大值
{
num+=v[u],sum[u]=num;
vmx=max(vmx,v[u]),mx[u]=vmx;
for(int i=h[u];i;i=dis[i].nex)
build(dis[i].to,num,vmx);
}
int query(int a,int b,int tag)
{
int ans1=0;//QSUM
int ans2=-(1<<30);//QMAX
while(a!=b)//类似于倍增,只不过这里的距离为sqrt(n)
{
if(deep[a]<deep[b]) swap(a,b);
if(rt[a]==rt[b])//若所属同一个块
{
ans1+=v[a];
ans2=max(ans2,v[a]);
a=fa[a];//由于在同一块内,暴力跳的复杂度只为O(sqrt(n))
}
else
{
if(deep[rt[a]]<deep[rt[b]]) swap(a,b);//块的深度更深
ans1+=sum[a];
ans2=max(ans2,mx[a]);
a=fa[rt[a]];//直接跳一个块
}
}
ans1+=v[a];
ans2=max(ans2,v[a]);//更新它们的LCA的值
if(tag==0) return ans2;
else return ans1;
}
void change(int u,int x)
{
v[u]=x;
if(u==rt[u]) build(u,0,-(1<<30));//如果是块内根节点就整个块更新
else build(u,sum[fa[u]],mx[fa[u]]);//如果不是,就从其父亲开始更新
}
int main()
{
int x,y;
scanf("%d",&n);
len=sqrt(n);
for(int i=1;i<n;++i)
scanf("%d%d",&x,&y),add1(x,y),add1(y,x);//原树边
for(int i=1;i<=n;++i)
scanf("%d",&v[i]),rt[i]=i;
dfs(1,0,0);
for(int i=1;i<=n;++i)
if(rt[i]==i)
build(i,0,-(1<<30));
scanf("%d",&m);
char opt[30];
for(int i=1;i<=m;++i)
{
scanf("%s%d%d",opt,&x,&y);
if(opt[1]=='M')//QMAX
printf("%d\n",query(x,y,0));//01维护询问问题
else if(opt[1]=='S')//QSUM
printf("%d\n",query(x,y,1));//01维护询问问题
else //CHANGE
change(x,y);
}
return 0;
}

骗分过样例,暴力出奇迹!!!

洛谷 P2590 [ZJOI2008]树的统计的更多相关文章

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

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

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

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

  3. 洛谷P2590 [ZJOI2008]树的统计 题解 树链剖分+线段树

    题目链接:https://www.luogu.org/problem/P2590 树链剖分模板题. 剖分过程要用到如下7个值: fa[u]:u的父节点编号: dep[u]:u的深度: size[u]: ...

  4. 洛谷 P2590 [ZJOI2008]树的统计(树链剖分)

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

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

    题目大意:一棵树,支持三个操作, $CHANGE\;u\;t:$ 把结点$u$的权值改为$t$ $QMAX\;u\;v:$ 询问从点$u$到点$v$的路径上的节点的最大权值 $QSUM\;u\;v:$ ...

  6. 洛谷——P2590 [ZJOI2008]树的统计

    https://www.luogu.org/problem/show?pid=2590#sub 题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这 ...

  7. 洛谷.2590.[ZJOI2008]树的统计(树分块)

    题目链接 Update:这种分块写法...可以被卡掉啊... 好像没有靠谱的树分块写法... /* 对树上节点进行分块,每个点记录dep,fa,val,Max,Sum,Max,Sum表示当前点在该块内 ...

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

    P2590 [ZJOI2008]树的统计 虽然是入门树剖模板 但是我终于1A了(大哭) 懒得写啥了(逃 #include<iostream> #include<cstdio> ...

  9. P2590 [ZJOI2008]树的统计(LCT)

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

随机推荐

  1. 04 入门 - ASP.NET MVC应用程序的结构

    目录索引:<ASP.NET MVC 5 高级编程>学习笔记 用Visual Studio创建了一个新的ASP.NET MVC应用程序后,将自动向这个项目中添加一些文件和目录. 如图所示: ...

  2. [总结]CSS/CSS3常用样式与web移动端资源

    CSS/CSS3常用样式与知识点 IE条件注释 条件注释简介 IE中的条件注释(Conditional comments)对IE的版本和IE非IE有优秀的区分能力,是WEB设计中常用的hack方法.条 ...

  3. 【设计模式】简单工厂模式 Simple Factory Pattern

    简单工厂模式Simple Factory Pattern[Simple Factory Pattern]是设计模式里最简单的一个模式,又叫静态工厂模式[Static Factory Pattern], ...

  4. Android视频录制从不入门到入门系列教程(一)————简介

    一.WHY Android SDK提供了MediaRecorder帮助开发者进行视频的录制,不过这个类很鸡肋,实际项目中应该很少用到它,最大的原因我觉得莫过于其输出的视频分辨率太有限了,满足不了项目的 ...

  5. linux/shell/bash 自动输入密码或文本

    linux有些命令需要输入密码,比如ssh或su,又不能通过参数指定,正常只能手动输入.这让人多少有些懊恼,尽管这样很安全! 破解:expect 默认没这个东西,需要安装 apt/yum instal ...

  6. tomat 欢迎页面设置在WEB-INF目录下时不显示问题

    <?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://w ...

  7. 无限极分类(adjacency list)的三种方式(迭代、递归、引用)

    一般的分类树状结构有两种方式: 一种是adjacency list,也就是是id,parent id这中形式. 另一种是nested set,即左右值的形式. 左右值形式查询起来比较高效,无需递归等, ...

  8. 【导航】FPGA相关

    [博客索引] FPGA相关 数字电路实现上,较多的经验是基于Xilinx/Altera的FPGA,使用Verilog语言,实现光传输SDH.OTN通信协议,DDR3控制器应用,以及视频分割.合并.sc ...

  9. 怪事年年有,今天特别多!org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'empno' not found. Available parameters are [emp, deptno, param1, param

    错误: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.Binding ...

  10. 07 Django REST Framework 解析器与渲染器

    01-解析器 REST 框架包括一些内置的Parser类,允许你接受各种媒体类型的请求.还支持定义自己的自定义解析器,这使你可以灵活地设计API接受的媒体类型. 注意: 开发客户端应用程序时应该始终记 ...