[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…

centos 安装 git

centos自带的git版本很低&#xff0c;在日常使用中&#xff0c;我们需要安装新版本的。操作如下&#xff1a; 1、先删除原来的 yum remove git 2、安装依赖包 yum install -y zlib-devel bzip2-devel openssl-devel ncurses-devel gcc perl-ExtUtils-MakeMaker package 3…

$python数据分析基础——初识numpy库

numpy库是python的一个著名的科学计算库&#xff0c;本文是一个quickstart。 引入&#xff1a;计算BMI BMI 体重&#xff08;kg&#xff09;/身高&#xff08;m&#xff09;^2 假如有如下几组体重和身高数据&#xff0c;让求每组数据的BMI值&#xff1a; weight [65.4,59.2,6…

npm run build 报错 versionRequirement: packageConfig.engines.node 'node' of undefined

我在拿以前写的项目进行改造后&#xff0c;使用npm run build准备打包部署&#xff0c;然而确报了一个小错&#xff1a; versionRequirement: packageConfig.engines.node ... TypeError: Cannot read property node of undefined 根据提示&#xff0c;我们可以定位到是在pac…

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

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

struts基础配置

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

判断浏览器是否为手机端 is mobile

一个网站&#xff0c;我做了PC端和手机端&#xff0c;我的需求是用户默认打开网站是PC端&#xff0c;PC端在业务功能代码加载之前&#xff0c;立马判断是否为手机浏览器&#xff0c;若是手机浏览器则立马跳转到手机端页面。 其实&#xff0c;我们只需要一个npm包来解决这个问题…

qt银行排队系统服务器代码,QT银行叫号排队系统

【实例简介】这个项目是基于windows下开发的&#xff0c;与sqlite数据库的结合使用&#xff0c;实现模拟银行的叫号排队机【实例截图】【核心代码】xiangmu└── xiangmu├── banksystem│ ├── banksystem.pro│ ├── banksystem.pro.user│ ├── banksystem.p…

list基本运用

1 #include<iostream>2 #include<list>3 using namespace std;4 list<int>list1,list2;5 void Creat_List(){6 // 空链表 7 list<int> L0; 8 9 // 建一个含个默认值是的元素的链表 10 list<int> L1(9); 11 12 …

支付宝 PEM routines:PEM_read_bio:no start line

今天在做支付宝开发&#xff0c;将密钥赋给变量&#xff0c;然在在签名的时候就直接报错&#xff0c;PEM routines:PEM_read_bio:no start line。 Error: error:0906D06C:PEM routines:PEM_read_bio:no start lineat Sign.sign (internal/crypto/sig.js:85:26)at signWithPriv…

加密服务器显示到期,注册加密卡成功了,打开软件还是提示演示到期了,怎么解决?...

期间,费用 期间,费用亦称期间成本&#xff0c;与一定期间相联系&#xff0c;直接从企业当期销售收入中扣除的费用。从企业的损益确定来看&#xff0c;期间费用与产品销售成本、产品销售税金及附加一起从产品销售收入中扣除后作为企业当期的营业利润。当期的期间费用是全额从当期…

支付宝 错误代码 insufficient-isv-permissions 错误原因: ISV权限不足,建议在开发者中心检查签约是否已经生效

我刚申请完&#xff0c;就进行测试&#xff0c;发现报错insufficient-isv-permissions。 排查一下&#xff0c;发现我在测试的时候&#xff0c;直接使用了支付宝正式请求地址&#xff1a;https://openapi.alipay.com/gateway.do。 我们需要做的&#xff0c;是把正式地址换成测…

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

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

pm2常用的命令

这里只列举了我常用的命令&#xff1a; 1、启动server.js应用程序 pm2 start app.js 2、 启动server.js并设置程序名称为hehe-api pm2 start server.js --name"hehe-api" 3、当文件变化时自动重启应用 pm2 start app.js --watch 4、查看pm2启动的所有的应用程…