[bzoj1036]树的统计

链剖好难调啊~调了半个小时,终于发现线段树写挂了233

唉,我真是个假人~

Description

  一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w。我们将以下面的形式来要求你对这棵树完成
一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值 I
II. QSUM u v: 询问从点u到点v的路径上的节点的权值和 注意:从点u到点v的路径上的节点包括u和v本身

Input

  输入的第一行为一个整数n,表示节点的个数。接下来n – 1行,每行2个整数a和b,表示节点a和节点b之间有
一条边相连。接下来n行,每行一个整数,第i行的整数wi表示节点i的权值。接下来1行,为一个整数q,表示操作
的总数。接下来q行,每行一个操作,以“CHANGE u t”或者“QMAX u v”或者“QSUM u v”的形式给出。 
对于100%的数据,保证1<=n<=30000,0<=q<=200000;中途操作中保证每个节点的权值w在-30000到30000之间。

Output

  对于每个“QMAX”或者“QSUM”的操作,每行输出一个整数表示要求输出的结果。

Sample Input

4
1 2
2 3
4 1
4 2 1 3
12
QMAX 3 4
QMAX 3 3
QMAX 3 2
QMAX 2 3
QSUM 3 4
QSUM 2 1
CHANGE 1 5
QMAX 3 4
CHANGE 3 6
QMAX 3 4
QMAX 2 4
QSUM 3 4

Sample Output

4
1
2
2
10
6
5
6
5
16

妥妥的链剖啊,虽然我这种蒟蒻还是打挂了n次。链剖入门题,用线段树维护,对树剖不太理解的同学可以找蒋一瑶神犇的PPT理解一下(伪代码真难读)
代码:
#include<cstdio>
#include<cstring>
#define N 30005 
#define M 60005
#define max(a,b) (a>b?a:b)
inline int swap(int &a,int &b){a^=b;b^=a;a^=b;}//Edge List
int cnt;
int head[N];
struct data{int to,next;}e[M];
void ins(int u,int v){e[++cnt].to=v;e[cnt].next=head[u];head[u]=cnt;e[++cnt].to=u;e[cnt].next=head[v];head[v]=cnt;
}//Segment Tree
#define mid ((l+r)>>1)
#define ls (k<<1)
#define rs (k<<1|1)
struct AriM{int l,r,mx,sum;}t[100005];
void build(int k,int l,int r){t[k].l=l;t[k].r=r;if(l==r)return;build(ls,l,mid);build(rs,mid+1,r);
}
void change(int k,int x,int y){int l=t[k].l,r=t[k].r;if(l==r){t[k].sum=t[k].mx=y;return;}if(x<=mid)change(ls,x,y);else change(rs,x,y);t[k].sum=t[ls].sum+t[rs].sum;t[k].mx=max(t[ls].mx,t[rs].mx);
}
int qsum(int k,int x,int y){int l=t[k].l,r=t[k].r;if(l==x&&y==r)return t[k].sum;if(y<=mid)return qsum(ls,x,y);if(x>mid)return qsum(rs,x,y);return qsum(ls,x,mid)+qsum(rs,mid+1,y);
}
int qmax(int k,int x,int y){    int l=t[k].l,r=t[k].r;if(l==x&&y==r)return t[k].mx;if(y<=mid)return qmax(ls,x,y);if(x>mid)return qmax(rs,x,y);return max(qmax(ls,x,mid),qmax(rs,mid+1,y));
}//树剖
#define inf 0x7fffffff
int sz;
int dep[N],size[N],fa[N],pos[N],bl[N];
void dfs1(int x){size[x]=1;for(int i=head[x];i;i=e[i].next){if(e[i].to==fa[x])continue;dep[e[i].to]=dep[x]+1;fa[e[i].to]=x;dfs1(e[i].to);size[x]+=size[e[i].to];}
}
void dfs2(int x,int chain){int k=0;sz++;pos[x]=sz;bl[x]=chain;for(int i=head[x];i;i=e[i].next)if(dep[e[i].to]>dep[x]&&size[e[i].to]>size[k])k=e[i].to;if(k==0)return;dfs2(k,chain);for(int i=head[x];i;i=e[i].next)if(dep[e[i].to]>dep[x]&&k!=e[i].to)dfs2(e[i].to,e[i].to);
}
int solvesum(int x,int y){int sum=0;while(bl[x]!=bl[y]){if(dep[bl[x]]<dep[bl[y]])swap(x,y);sum+=qsum(1,pos[bl[x]],pos[x]);x=fa[bl[x]];}if(pos[x]>pos[y])swap(x,y);sum+=qsum(1,pos[x],pos[y]);return sum;
}
int solvemx(int x,int y){int mx=-inf;while(bl[x]!=bl[y]){if(dep[bl[x]]<dep[bl[y]])swap(x,y);mx=max(mx,qmax(1,pos[bl[x]],pos[x]));x=fa[bl[x]];}if(pos[x]>pos[y])swap(x,y);mx=max(mx,qmax(1,pos[x],pos[y]));return mx;
}//main code
int n,q;
int v[N];
void solve(){build(1,1,n);for(int i=1;i<=n;i++)change(1,pos[i],v[i]);scanf("%d",&q);char ch[10];for(int i=1;i<=q;i++){int x,y;scanf("%s%d%d",ch,&x,&y);if(ch[0]=='C'){v[x]=y;change(1,pos[x],y);}elseif(ch[1]=='M')printf("%d\n",solvemx(x,y));else printf("%d\n",solvesum(x,y));}
}
int main(){scanf("%d",&n);for(int i=1;i<n;i++){int x,y;scanf("%d%d",&x,&y);ins(x,y);}for(int i=1;i<=n;i++)scanf("%d",&v[i]);dfs1(1);dfs2(1,1);solve();return 0;
}
View Code

 

转载于:https://www.cnblogs.com/Marser/p/7349872.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/416168.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ajax 错误信息error,jquery ajax的error错误信息

项目开发中ajax的异常处理起来算是比较头疼的&#xff0c;因为是异步请求&#xff0c;所以即使ajax异常程序依然会继续执行&#xff0c;导致找ajax的异常比较麻烦。今天处理ajax异常时搜到一篇文章&#xff0c;提到error可以返回ajax异常信息。$.ajax({url: url,type: "po…

变频器服务器电路板维修,变频器电路板维修技巧

变频器电路板维修技巧电路板使电路迷你化、直观化&#xff0c;对于固定电路的批量生产和优化用电器布局起重要作用。下面来跟西欧阿布了解下变频器电路板的维修技巧吧。前市场上国产变频器主要以低压通用型变频器为主&#xff0c;为下文叙述方便&#xff0c;现简要介绍通用型变…

struts基础配置

struts2是针对MVC思想的具体实现&#xff0c;对应于MVC中的C即Controller控制器层&#xff0c;有以下优点&#xff1a; 通过简单、集中的配置来调度业务类&#xff0c;是的配置和修改都很容易。提供简单、统一的表达式语言来访问所有可访问的数据。提供标准、强大的验证框架和国…

施乐700彩机服务器显示c4,施乐彩色数码复印机故障代码大全

施乐彩色数码复印机是办公单位常用的设备之一&#xff0c;但是使用时间较长难免会出现故障&#xff0c;最常见的就是复印机代码报错&#xff0c;以下就是闪租闪修小编整理复印机代码报错含义&#xff0c;希望能对广大用户有所帮助。003-205机器序列号不一致004-415寿命已尽004-…

x3250m6系列服务器,IBM服务器X3250 M6 E3-1230v6 8GB 4x3.5 C110 300W 无驱

品牌&#xff1a; 联想(Lenovo)商品名称&#xff1a;联想(Lenovo) IBM X3250 M6 1U机架式服务器主机 E3-1230V6 标配 8G内存 无硬盘商品编号&#xff1a;1004823156店铺&#xff1a;广州德致商城商品产地&#xff1a;中国大陆内存 &#xff1a;1x8GB UDIMMRAID &#xff1a;标配…

jfinal项目部署服务器,jfinal undertow项目再集成JDK,一键安装系统服务,让部署再快一点...

经常由于本地的开发环境和服务器上的生产环境不同&#xff0c;导致项目部署过程中会遇到各种插曲&#xff0c;现在有了jfinal undertow&#xff0c;终于可以摆脱tomcat等各种配置&#xff0c;但是开发环境的JDK和服务器上的JDK版本不一定一致&#xff0c;比如我面临的情况是&am…

宝塔面板 mongodb 允许外网访问

需要修改一下配置。 将bindIp&#xff1a;127.0.0.1 修改为 0.0.0.0

jsp执行过程

JSP执行过程图解 第一次请求&#xff1a; 当服务器上的一个JSP页面被第一次请求执行时&#xff0c;服务器上的JSP引擎首先将JSP页面文件转译成一个.java文件&#xff0c;也就是servlet&#xff0c;并编译这个java文件生成.class的字节码文件&#xff0c;然后执行字节码文件响应…

前端学习(2537):vue源码解析2伪数组转换为真数组

/*1[].slice.call(lis)*//*伪数组 */const lisdocument.getElementsByTagName(li)/*判断数组 false*/console.log(lis instanceof Array)/*打印第一个信息 歌谣2*/console.log(lis instanceof Array,lis[1].innerHTML)/*for each undefine*/console.log(lis instanceof Array…

前端学习(2539):节点类型

/*1[].slice.call(lis)*//*伪数组 */const lisdocument.getElementsByTagName(li)/*判断数组 false*/console.log(lis instanceof Array)/*打印第一个信息 歌谣2*/console.log(lis instanceof Array,lis[1].innerHTML)/*for each undefine*/console.log(lis instanceof Array…

JZOJ 8.15 B组总结

NO.1 平台 Description   Alice要搭建平台&#xff0c;平台不能漂在空气中&#xff0c;必须要有两根柱子支撑&#xff0c;具体地说&#xff0c;每个平台的两端必须由一根柱子支撑&#xff0c;柱子的另一端在地板或另一个平台上。   给你平台的放置位置&#xff08;如下左…

宝塔面板 Windows 2012 R2 使用指南(在更新中)

第一次使用Windows系统服务器 1、安装宝塔Windows面板 For 2012 R2镜像。 从镜像市场选择 输入宝塔Windows面板 For 2012 R2进行选择&#xff0c;点击使用。 设置密码 2、使用windows电脑进行远程桌面连接

支付宝当面付接口如何计算优惠

支付宝当面付官方接口文档&#xff1a;https://docs.open.alipay.com/194/105170/ 在弄清楚如何计算优惠之前先了解下相关金额参数&#xff1a; 1、请求中金额参数total_amount&#xff1a;订单总金额&#xff0c;订单总金额&#xff0c;单位为元&#xff0c;精确到小数点后两位…