数链剖分(树的统计Count )
题目链接:https://cn.vjudge.net/contest/279350#problem/C
具体思路:单点更新,区间查询,查询的时候有两种操作,查询区间最大值和区间和。
注意点:在查询的时候,我们应该直接将这个点进行查询,而不是荆这个点在树上的编号进行查询,只有在进入线段树的时候我们才用树上的编号,update的时候也就直接用树上的编号就可以了,注意这个题有点权值会有负值的情况。
AC代码:
#include<iostream>
#include<cstring>
#include<cmath>
#include<stack>
#include<iomanip>
#include<stdio.h>
#include<algorithm>
using namespace std;
# define ll long long
# define inf 0x3f3f3f3f
# define lson l,m,rt<<
# define rson m+,r,rt<<|
const int maxn = +;
int head[maxn],edgnum,sto[maxn],depth[maxn],Size[maxn],father[maxn];
int son[maxn],ord[maxn],dfsnum,cost[maxn],top[maxn];
int tree1[maxn<<],tree2[maxn<<];
int maxx;
struct node
{
int fr;
int to;
int nex;
} edge[maxn];
void addedge(int fr,int to)
{
edge[edgnum].fr=fr;
edge[edgnum].to=to;
edge[edgnum].nex=head[fr];
head[fr]=edgnum++;
}
void dfs1(int fr,int rt,int dep)
{
depth[fr]=dep;
father[fr]=rt;
son[fr]=-;
Size[fr]=;
for(int i=head[fr]; i!=-; i=edge[i].nex)
{
int to=edge[i].to;
if(to==rt)
continue;
dfs1(to,fr,dep+);
Size[fr]+=Size[to];
if(son[fr]==-||Size[son[fr]]<Size[to])
{
son[fr]=to;
}
}
}
void dfs2(int fr,int rt)
{
ord[fr]=++dfsnum;
top[fr]=rt;
cost[ord[fr]]=sto[fr];
if(son[fr]!=-)
{
dfs2(son[fr],rt);
}
for(int i=head[fr]; i!=-; i=edge[i].nex)
{
int to=edge[i].to;
if(son[fr]!=to&&father[fr]!=to)
{
dfs2(to,to);
}
}
}
void up1(int rt)
{
tree1[rt]=max(tree1[rt<<],tree1[rt<<|]);
}
void up2(int rt)
{
tree2[rt]=tree2[rt<<]+tree2[rt<<|];
}
void buildtree(int l,int r,int rt)
{
if(l==r)
{
tree1[rt]=cost[l];
tree2[rt]=cost[l];
return ;
}
int m=(l+r)>>;
buildtree(lson);
buildtree(rson);
up1(rt);
up2(rt);
}
void query1(int l,int r,int rt,int L,int R)
{
if(L<=l&&R>=r)
{
maxx=max(maxx,tree1[rt]);
return ;
}
int m=(l+r)>>;
if(L<=m)
query1(lson,L,R);
if(R>m)
query1(rson,L,R);
up1(rt);
}
void Query1(int n,int x,int y)
{
maxx=-inf;
int tx=top[x],ty=top[y];
while(tx!=ty)
{
if(depth[tx]<depth[ty])
{
swap(tx,ty);
swap(x,y);
}
query1(,n,,ord[tx],ord[x]);
x=father[tx],tx=top[x];
}
if(depth[x]<depth[y])
{
swap(x,y);
}
query1(,n,,ord[y],ord[x]);
}
int query2(int l,int r,int rt,int L,int R)
{
if(L<=l&&R>=r)
{
return tree2[rt];
}
int ans=;
int m=(l+r)>>;
if(L<=m)
ans+=query2(lson,L,R);
if(R>m)
ans+=query2(rson,L,R);
up2(rt);
return ans;
}
int Query2(int n,int x,int y)
{
int tx=top[x],ty=top[y];
int ans=;
while(tx!=ty)
{
if(depth[tx]<depth[ty])
{
swap(tx,ty);
swap(x,y);
}
ans+=query2(,n,,ord[tx],ord[x]);
x=father[tx],tx=top[x];
}
if(depth[x]<depth[y])
{
swap(x,y);
}
return ans+query2(,n,,ord[y],ord[x]);
}
void update(int l,int r,int rt,int pos,int p)
{
if(l==r)
{
tree1[rt]=p;
tree2[rt]=p;
return ;
}
int m=(l+r)>>;
if(pos<=m)
update(lson,pos,p);
if(pos>m)
update(rson,pos,p);
up1(rt);
up2(rt);
}
int main()
{
int n;
scanf("%d",&n);
for(int i=; i<=n; i++)
{
head[i]=-;
}
int t1,t2;
for(int i=; i<n; i++)
{
scanf("%d %d",&t1,&t2);
addedge(t1,t2);
addedge(t2,t1);
}
for(int i=; i<=n; i++)
{
scanf("%d",&sto[i]);
}
dfs1(,-,);
dfs2(,);
buildtree(,n,);
int q;
char str[];
scanf("%d",&q);
while(q--)
{
scanf("%s",str);
if(str[]=='Q'&&str[]=='M')
{
scanf("%d %d",&t1,&t2);
Query1(n,t1,t2);
printf("%d\n",maxx);
}
else if(str[]=='Q'&&str[]=='S')
{
scanf("%d %d",&t1,&t2);
int ans=Query2(n,t1,t2);
printf("%d\n",ans);
}
else if(str[]=='C')
{
scanf("%d %d",&t1,&t2);
update(,n,,ord[t1],t2);
}
}
return ;
}
数链剖分(树的统计Count )的更多相关文章
- 1036: [ZJOI2008]树的统计Count (树链剖分)
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3401 Solved: 1418[Submit] ...
- BZOJ 1036: [ZJOI2008]树的统计Count [树链剖分]【学习笔记】
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 14302 Solved: 5779[Submit ...
- bzoj1036 [ZJOI2008]树的统计Count 树链剖分模板题
[ZJOI2008]树的统计Count Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成 一些操作: I. CHANGE u ...
- BZOJ 1036: [ZJOI2008]树的统计Count (树链剖分模板题)
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 14982 Solved: 6081[Submit ...
- [BZOJ1036][ZJOI2008]树的统计Count 解题报告|树链剖分
树链剖分 简单来说就是数据结构在树上的应用.常用的为线段树splay等.(可现在splay还不会敲囧) 重链剖分: 将树上的边分成轻链和重链. 重边为每个节点到它子树最大的儿子的边,其余为轻边. 设( ...
- 【BZOJ1036】[ZJOI2008]树的统计Count 树链剖分
[BZOJ1036][ZJOI2008]树的统计Count Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. ...
- bzoj 1036 [ZJOI2008]树的统计Count(树链剖分,线段树)
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 10677 Solved: 4313[Submit ...
- Bzoj 1036: [ZJOI2008]树的统计Count 树链剖分,LCT
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 11102 Solved: 4490[Submit ...
- BZOJ 1036: [ZJOI2008]树的统计Count( 树链剖分 )
树链剖分... 不知道为什么跑这么慢 = = 调了一节课啊跪.. ------------------------------------------------------------------- ...
- Luogu 2590 [ZJOI2008]树的统计 / HYSBZ 1036 [ZJOI2008]树的统计Count (树链剖分,LCA,线段树)
Luogu 2590 [ZJOI2008]树的统计 / HYSBZ 1036 [ZJOI2008]树的统计Count (树链剖分,LCA,线段树) Description 一棵树上有n个节点,编号分别 ...
随机推荐
- PAT甲题题解-1125. Chain the Ropes (25)-贪心水题
贪心水题,每次取最短的两个绳子合并,长度缩减成一半 #include <iostream> #include <cstdio> #include <algorithm&g ...
- Final互评------《弹球学成语》---- 杨老师粉丝群
一.基于NABCD评论作品,及改进建议 1.根据(不限于)NABCD评论作品的选题; N(Need,需求):本产品面相青少年及小学生,基于这些用户数量再加上一些休闲玩家,需求量还是比较大的. A ...
- 关于给C盘扩容以及动态磁盘
2019.4.5 周五 磁盘分为基本磁盘和动态磁盘 基本磁盘转动态磁盘是很容易的 https://jingyan.baidu.com/article/59a015e3a3d504f7948865b1. ...
- beta圆桌 SUM UP
分工 黄家雄:基础页面 意见反馈 牛康文:基础页面 关于我们 姚志辉:登录注册页面修缮 魏璐炜:多界面修缮,用户使用调查,ppt制作 许斌:自动化测试 傅海涛:文件转换及列表,语音字幕,列表更新 徐明 ...
- hexo d 报错‘fatal: could not read Username for 'https://github.com': No error’
问题描述 今天早上,一如往常的往在github上创建的hexo博客上传文章,结果报错 'fatal: could not read Username for 'https://github.com': ...
- Java结束线程的三种方法(爱奇艺面试)
线程属于一次性消耗品,在执行完run()方法之后线程便会正常结束了,线程结束后便会销毁,不能再次start,只能重新建立新的线程对象,但有时run()方法是永远不会结束的.例如在程序中使用线程进行So ...
- KSOA单据保护表中Clientid解析为mac和ip
SELECT DISTINCT a.*,ISNULL(c.client_net_address,'') AS client_net_address FROM ( SELECT * ,),,) ) ), ...
- 【bzoj4771】七彩树 树链的并+STL-set+DFS序+可持久化线段树
题目描述 给定一棵n个点的有根树,编号依次为1到n,其中1号点是根节点.每个节点都被染上了某一种颜色,其中第i个节点的颜色为c[i].如果c[i]=c[j],那么我们认为点i和点j拥有相同的颜色.定义 ...
- 【模板】Floyd
int n; ][MAX_N + ]; void Floyd() { ; k <= n; ++k) { ; i <= n; ++i) { ; j <= n; ++j) { d[i][ ...
- gcc 与 glibc 的关系 glibc版本查看
glibc是什么,以及与gcc的关系?glibc是gnu发布的libc库,也即c运行库.glibc是linux 系统中最底层的api(应用程序开发接口),几乎其它任何的运行库都会倚赖于glibc.gl ...