bzoj_1036

★★★★   输入文件:bzoj_1036.in   输出文件:bzoj_1036.out   简单对比
时间限制:1 s   内存限制:162 MB

目描述】

一棵树上有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本身

入格式】

输入的第一行为一个整数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之间。

出格式】

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

入】

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

出】

4

1

2

2

10

6

5

6

5

16

#include<bits/stdc++.h>
#define maxn 30005
#define ls (rt<<1)
#define rs (rt<<1|1)
#define mid (l+r>>1)
#define lson ls,l,mid
#define rson rs,mid+1,r
using namespace std;
int n,q;
vector<int> v[maxn];int a[maxn];
int size[maxn],son[maxn],fa[maxn],top[maxn],dep[maxn],dfn[maxn],pos[maxn],cnt;
int sum[maxn<<],mx[maxn<<];
void Dfs(int rt){
size[rt]=;
for(int i=;i<v[rt].size();i++){
int to=v[rt][i];
if(!size[to]){
fa[to]=rt;
dep[to]=dep[rt]+;
Dfs(to);
size[rt]+=size[to];
if(size[to]>size[son[rt]]) son[rt]=to;
}
}
}
void Dfs(int rt,int tp){
top[rt]=tp;
dfn[++cnt]=rt;
pos[rt]=cnt;
if(son[rt]) Dfs(son[rt],tp);
for(int i=;i<v[rt].size();i++)
if(!top[v[rt][i]]) Dfs(v[rt][i],v[rt][i]);
}
void Build(int rt,int l,int r){
if(l==r){
sum[rt]=mx[rt]=a[dfn[l]];
return;
}
Build(lson);Build(rson);
sum[rt]=sum[ls]+sum[rs];mx[rt]=max(mx[ls],mx[rs]);
}
void Add(int rt,int l,int r,int posx,int qx){
if(l==r){
sum[rt]=qx;
mx[rt]=qx;
return;
}
if(posx<=mid) Add(lson,posx,qx);
else Add(rson,posx,qx);
sum[rt]=sum[ls]+sum[rs];mx[rt]=max(mx[ls],mx[rs]);
}
int Sum(int rt,int l,int r,int s,int t){
if(s>r||t<l) return ;
if(s<=l&&r<=t) return sum[rt];
return Sum(lson,s,t)+Sum(rson,s,t);
}
int Max(int rt,int l,int r,int s,int t){
if(s>r||t<l) return -maxn;
if(s<=l&&r<=t) return mx[rt];
return max(Max(lson,s,t),Max(rson,s,t));
}
int lca(int x,int y,bool opt){
int res;
if(opt) res=;
else res=-maxn;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
if(opt) res+=Sum(,,n,pos[top[x]],pos[x]);
else res=max(res,Max(,,n,pos[top[x]],pos[x]));
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
if(opt) res+=Sum(,,n,pos[x],pos[y]);
else res=max(res,Max(,,n,pos[x],pos[y]));
return res;
}
int main()
{
freopen("bzoj_1036.in","r",stdin);
freopen("bzoj_1036.out","w",stdout);
scanf("%d",&n);
for(int i=;i<n;i++){
int x,y;scanf("%d%d",&x,&y);
v[x].push_back(y);v[y].push_back(x);
}
for(int i=;i<=n;i++) scanf("%d",&a[i]);
Dfs();Dfs(,);Build(,,n);
scanf("%d",&q);
while(q--){
string s;cin>>s;
if(s[]=='C'){
int x,v;
scanf("%d%d",&x,&v);
Add(,,n,pos[x],v);
}
if(s[]=='M'){
int x,y;scanf("%d%d",&x,&y);
printf("%d\n",lca(x,y,));
}
if(s[]=='S'){
int x,y;scanf("%d%d",&x,&y);
printf("%d\n",lca(x,y,));
}
}
return ;
}

唉 编程不易啊

考试的时候就写错了两行就爆0了!!!!

那个dfn数组  和  pos数组

在从外面进入线段树的时候要用pos

从线段树里调用外面的时候要用dfn

千万要记住!!

还有一个地方  就是那个Max函数  如果越界 返回值一定要是一个负无穷   否则万一本来最大值就是一个负数  而你越界了反而返回了一个0 那不就出bug了吗    还是要灵活变通啊!

加油 多练练就好了

ヾ(◍°∇°◍)ノ゙

bzoj_1036 树链剖分套线段树的更多相关文章

  1. cogs 1583. [POJ 3237] 树的维护 树链剖分套线段树

    1583. [POJ 3237] 树的维护 ★★★★   输入文件:maintaintree.in   输出文件:maintaintree.out   简单对比时间限制:5 s   内存限制:128 ...

  2. bzoj 4034 [HAOI2015] T2(树链剖分,线段树)

    4034: [HAOI2015]T2 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1536  Solved: 508[Submit][Status] ...

  3. bzoj 1036 [ZJOI2008]树的统计Count(树链剖分,线段树)

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 10677  Solved: 4313[Submit ...

  4. poj 3237 Tree(树链剖分,线段树)

    Tree Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 7268   Accepted: 1969 Description ...

  5. bzoj 3626 [LNOI2014]LCA(离线处理+树链剖分,线段树)

    3626: [LNOI2014]LCA Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1272  Solved: 451[Submit][Status ...

  6. bzoj 2243 [SDOI2011]染色(树链剖分,线段树)

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 4637  Solved: 1726[Submit][Status ...

  7. HDU 4366 Successor(树链剖分+zkw线段树+扫描线)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4366 [题目大意] 有一个公司,每个员工都有一个上司,所有的人呈树状关系,现在给出每个人的忠诚值和 ...

  8. 【BZOJ3531】旅行(树链剖分,线段树)

    [BZOJ3531]旅行(树链剖分,线段树) 题面 Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足 从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教 ...

  9. 【BZOJ5507】[GXOI/GZOI2019]旧词(树链剖分,线段树)

    [BZOJ5507][GXOI/GZOI2019]旧词(树链剖分,线段树) 题面 BZOJ 洛谷 题解 如果\(k=1\)就是链并裸题了... 其实\(k>1\)发现还是可以用类似链并的思想,这 ...

随机推荐

  1. mysql ”Invalid use of null value“ 解决方法

    1.问题描述 因为要更改"information"表中的"编号"列为非空,使用数据库查询语句“alter table information modify '编 ...

  2. 如何理解springMVC?

    springMVC 工作原理? 简单理解:客户端发送请求-->前端控制器接受客户端的请求DispathServelt-->找到处理器映射HandMapping-->找到处理器hand ...

  3. P1016 高精度除法

    题目描述 给你两个很大的正整数A和B,你需要计算A除以B的商和余数. 输入格式 输入一行包含两个正整数A和B,以一个空格分隔(A和B的位数都不超过 \(10^5\)) 输出格式 输出一行包含两个整数, ...

  4. ioctl 命令的实现

    ioctl 的 scull 实现只传递设备的配置参数, 并且象下面这样容易: switch(cmd) { case SCULL_IOCRESET: scull_quantum = SCULL_QUAN ...

  5. Linux 内核 低级 sysfs 操作

    kobject 是在 sysfs 虚拟文件系统之后的机制. 对每个在 sysfs 中发现的目录, 有一个 kobject 潜伏在内核某处. 每个感兴趣的 kobject 也输出一个或多个属性, 它出现 ...

  6. es6笔记 day3---Promise

    作用:解决异步回调问题 先知道它的大概语法就好了,这个东西需要平时用到才知道它的用处 语法: let promise= new Promise(function(resolve,reject){ // ...

  7. vue权限篇

    前言 在一个项目中,一些功能会涉及到重要的数据管理,为了确保数据的安全,我们会在项目中加入权限来限制每个用户的操作.作为前端,我们要做的是配合后端给到的权限数据,做页面上的各种各样的限制. 需求 因为 ...

  8. ie6 ie7下,Li不能自动换行,出现竖排文字现象(PS:li不固定宽度,所有li同一行显示),在ie8却可以

    好久没写CSS,今天又发现一个ie兼容问题. 我需要所有的li在同一行显示,不固定Li的宽度,如果一行排不下,需要自动换行.当然Li的内容长度不同. 必须在li加white-space:nowrap; ...

  9. codeforces 1194F (组合数学)

    Codeforces 11194F (组合数学) 传送门:https://codeforces.com/contest/1194/problem/F 题意: 你有n个事件,你需要按照1~n的顺序完成这 ...

  10. 37.html

    转载:https://www.cnblogs.com/yuanchenqi/articles/5976755.html 前端概述 import socket def main(): sock = so ...