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. servicemix-3.2.1 部署异常

    <jbi-task xmlns="http://java.sun.com/xml/ns/jbi/management-message" version="1.0&q ...

  2. linux的iptables和firewall的区别

    firewall是centos7里面的新的防火墙命令,它底层还是使用 iptables 对内核命令动态通信包过滤的,简单理解就是firewall是centos7下管理iptables的新命令 Linu ...

  3. 2019-9-3-win10-uwp-收集-DUMP-文件

    title author date CreateTime categories win10 uwp 收集 DUMP 文件 lindexi 2019-09-03 17:48:44 +0800 2018- ...

  4. vue权限控制菜单显示

    对于不同角色显示不同的菜单 思路1: 本地放一份完整的菜单数据,通过后台返回角色的菜单列表两者对比,筛选需要显示的菜单数据绑定,这里有个问题就是路由vue实例初始化就生成了,加载的全部,人为输入地址是 ...

  5. C# 匹配可空变量

    在 C# 7.0 的时候提供更好用的模式匹配方法,支持通过 is 直接转换对应的类,但是如果是尝试转换可空的对象,那么将会提示无法编译,或转换失败 在 C# 7.0 的 is 转换是十分好用的功能,例 ...

  6. XSS攻击及防范

    1.什么是XSS攻击 跨站脚本攻击(Cross Site Scripting),攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到 ...

  7. 云栖大会压轴好戏 阿里云发布视频云V5计划与系列新产品

    9月25 - 27日,2019云栖大会如期召开.在大会最后一天下午,阿里云智能视频云分论坛为今年的云栖大会献上了一场精彩的压轴好戏. 视频云V5计划发布 使能生态合作伙伴 会上,阿里云智能研究员金戈进 ...

  8. Python之end关键字使用

    关键字end可以用于将结果输出到同一行,或者在输出的末尾添加不同的字符,实例如下: a, b = 0, 1 while b < 1000: print(b, end=',') a, b = b, ...

  9. [译文] 为什么你在 C# 里总是应该使用 "var" 关键字

    [译文] Why You Should Always Use the 'var' Keyword in C# (为什么你总是应该在 C# 里使用 "var" 关键字) Using ...

  10. CSV 文件的存取

    CSV 文件介绍 CSV(Comma-Separated Values),中文通常叫做逗号分割值.CSV文件由任意数目的记录(行)组成,每条记录由一些字段(列)组成,字段之间通常以逗号分割,当然也可以 ...