【BZOJ1146】网络管理(主席树,树状数组)
【BZOJ1146】网络管理(主席树,树状数组)
题面
题解
树上带修改主席树
貌似和\(Count\ On\ A\ Tree\)那题很相似呀
只需要套上一个树状数组来维护修改好就好了
但是记住是用\(dfs\)来记录主席树的标号
一定不要搞错了
每一次修改只会影响他子数的值
而在\(dfs\)序上就是连续的一段
美滋滋的做完了
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define MAX 161000
inline int read()
{
RG int x=0,t=1;RG char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
struct Line{int v,next;}e[MAX<<1];
int h[MAX],cnt=1;
inline void Add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;}
int dfn[MAX],low[MAX],fa[MAX],size[MAX],hson[MAX],dep[MAX],top[MAX];
int tim,n,Q;
int S[MAX<<1],Tot,TT[MAX];
int lowbit(int x){return x&(-x);}
struct Node{int ls,rs,v;}t[MAX<<8];
int rt[MAX],tot,ln[MAX];
int LCA(int u,int v)
{
while(top[u]!=top[v])
dep[top[u]]<dep[top[v]]?v=fa[top[v]]:u=fa[top[u]];
return dep[u]<dep[v]?u:v;
}
void Modify(int &now,int ff,int l,int r,int pos,int w)
{
t[now=++tot]=t[ff];t[now].v+=w;
if(l==r)return;
int mid=(l+r)>>1;
if(pos<=mid)Modify(t[now].ls,t[ff].ls,l,mid,pos,w);
else Modify(t[now].rs,t[ff].rs,mid+1,r,pos,w);
}
void PreModify(int K,int pos,int w){for(int i=K;i<=n;i+=lowbit(i))Modify(rt[i],rt[i],1,Tot,pos,w);}
int tmp1[MAX<<1],tmp2[MAX<<1],t1,t2;
int Query(int l,int r,int K)
{
if(l==r)return l;
int mid=(l+r)>>1,ss=0;
for(int i=1;i<=t1;++i)ss+=t[t[tmp1[i]].rs].v;
for(int i=1;i<=t2;++i)ss-=t[t[tmp2[i]].rs].v;
if(ss>=K)
{
for(int i=1;i<=t1;++i)tmp1[i]=t[tmp1[i]].rs;
for(int i=1;i<=t2;++i)tmp2[i]=t[tmp2[i]].rs;
return Query(mid+1,r,K);
}
else
{
for(int i=1;i<=t1;++i)tmp1[i]=t[tmp1[i]].ls;
for(int i=1;i<=t2;++i)tmp2[i]=t[tmp2[i]].ls;
return Query(l,mid,K-ss);
}
}
int preQuery(int u,int v,int K)
{
t1=t2=0;
for(int i=dfn[u];i;i-=lowbit(i))tmp1[++t1]=rt[i];
for(int i=dfn[v];i;i-=lowbit(i))tmp1[++t1]=rt[i];
int lca=LCA(u,v);
for(int i=dfn[lca];i;i-=lowbit(i))tmp2[++t2]=rt[i];
for(int i=dfn[fa[lca]];i;i-=lowbit(i))tmp2[++t2]=rt[i];
return Query(1,Tot,K);
}
void dfs1(int u,int ff)
{
size[u]=1;fa[u]=ff;dep[u]=dep[ff]+1;
for(int i=h[u];i;i=e[i].next)
{
if(e[i].v==ff)continue;
dfs1(e[i].v,u);
size[u]+=size[e[i].v];
if(size[e[i].v]>size[hson[u]])hson[u]=e[i].v;
}
}
void dfs2(int u,int tp)
{
top[u]=tp;dfn[u]=++tim;ln[tim]=u;
if(hson[u])dfs2(hson[u],tp);
for(int i=h[u];i;i=e[i].next)
{
if(e[i].v==fa[u]||e[i].v==hson[u])continue;
dfs2(e[i].v,e[i].v);
}
low[u]=tim;
}
void dfs3(int u,int ff)
{
PreModify(dfn[u],TT[u],1);
PreModify(low[u]+1,TT[u],-1);
for(int i=h[u];i;i=e[i].next)
if(e[i].v!=ff)dfs3(e[i].v,u);
}
struct Op{int k,a,b;}O[MAX];
int main()
{
n=read();Q=read();
for(int i=1;i<=n;++i)S[++Tot]=TT[i]=read();
for(int i=1;i<n;++i)
{
int u=read(),v=read();
Add(u,v);Add(v,u);
}
for(int i=1;i<=Q;++i)O[i].k=read(),O[i].a=read(),O[i].b=read();
for(int i=1;i<=Q;++i)if(O[i].k==0)S[++Tot]=O[i].b;
sort(&S[1],&S[Tot+1]);
Tot=unique(&S[1],&S[Tot+1])-S-1;
for(int i=1;i<=n;++i)TT[i]=lower_bound(&S[1],&S[Tot+1],TT[i])-S;
for(int i=1;i<=Q;++i)if(O[i].k==0)O[i].b=lower_bound(&S[1],&S[Tot+1],O[i].b)-S;
dfs1(1,0);dfs2(1,1);dfs3(1,1);
for(int i=1;i<=Q;++i)
{
if(O[i].k==0)
{
PreModify(dfn[O[i].a],TT[O[i].a],-1);
PreModify(low[O[i].a]+1,TT[O[i].a],1);
PreModify(dfn[O[i].a],O[i].b,1);
PreModify(low[O[i].a]+1,O[i].b,-1);
TT[O[i].a]=O[i].b;
}
else
{
int len=dep[O[i].a]+dep[O[i].b]-2*dep[LCA(O[i].a,O[i].b)]+1;
if(O[i].k>len){puts("invalid request!");continue;}
printf("%d\n",S[preQuery(O[i].a,O[i].b,O[i].k)]);
}
}
return 0;
}
【BZOJ1146】网络管理(主席树,树状数组)的更多相关文章
- CodeForces -163E :e-Government (AC自动机+DFS序+树状数组)
The best programmers of Embezzland compete to develop a part of the project called "e-Governmen ...
- 【BZOJ1146】[CTSC2008]网络管理Network 树状数组+DFS序+主席树
[BZOJ1146][CTSC2008]网络管理Network Description M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工 ...
- BZOJ1146[CTSC2008]网络管理——出栈入栈序+树状数组套主席树
题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个 部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条 ...
- 【bzoj1146】[CTSC2008]网络管理Network 倍增LCA+dfs序+树状数组+主席树
题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条高 ...
- BZOJ_1146_[CTSC2008]网络管理Network_主席树+树状数组
BZOJ_1146_[CTSC2008]网络管理Network_主席树 Description M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个 部门 ...
- 【BZOJ】1146: [CTSC2008]网络管理Network(树链剖分+线段树套平衡树+二分 / dfs序+树状数组+主席树)
http://www.lydsy.com/JudgeOnline/problem.php?id=1146 第一种做法(时间太感人): 第二种做法(rank5,好开心) ================ ...
- [BZOJ 1146] [CTSC2008]网络管理Network(树状数组+主席树)
题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条高 ...
- bzoj1901--树状数组套主席树
树状数组套主席树模板题... 题目大意: 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[ ...
- BZOJ 3196 Tyvj 1730 二逼平衡树 ——树状数组套主席树
[题目分析] 听说是树套树.(雾) 怒写树状数组套主席树,然后就Rank1了.23333 单点修改,区间查询+k大数查询=树状数组套主席树. [代码] #include <cstdio> ...
随机推荐
- SQL Server 文件操作
在master数据库中,SQL Server提供系统扩展的存储过程,其中有一些存储过程的命名以xp_开头,用于处理操作系统的文件. 一,判断文件是否存在 存储过程sys.xp_fileexist 用于 ...
- uboot之位置无关代码解析
在之前的话 新年过去了,那么久没有好好学习,感觉好颓废,现在就uboot的一些基础问题做一些笔记,顺便分享给大家,不过由于见识有限,如果有不足之处请多多指教. 位置无关?什么意思?我们先了解一些基础知 ...
- Qt滑动条设计与实现
没有找到Qt的滑动条控件,所以自己写了一个,能够实现亮度调节.音量调节等功能. 效果如下图: 主要设计思路: 有些调节功能如对比度是有负值的,所以需要能对滑动条的数值范围进行设置,不局限于0~100 ...
- Linux中7个用来浏览网页和下载文件的命令
上一篇文章中,我们提到了rTorrent.wget.cURL.w3m.Elinks等几个有用的工具,很多人回信说还有其它几个类似的工具也值得讨论,所以就有了这篇文章.如果错过了第一部分的讨论,可以通过 ...
- oracle 11.2.0.2以后对数据库用户名重命名
本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn [转自]http://www.xifenfei.com/2012/0 ...
- qt Multimedia 模块类如何使用?
qt 多媒体模块介绍 类名 英文描述 中文描述 QAudioBuffer Represents a collection of audio samples with a specific format ...
- qt 字符数组如何转换字符串?
char 字符数组如何转换成 QString? char source{1024} = {0}; QString des = QString::fromLocal8Bit(source);
- python语言基础语法笔记<note2--面向对象编程>
Python面向对象编程(OOP) 一.面向对象过程的优点特征: 封装 模型的特征和能力打包在一起 模型的改变由模型自身完成 隐藏模型的细节,外界只能使用,不能改变 继承 符合自然界分类规律 快速实现 ...
- Zookeeper笔记1-CAP/BASE理论
分布式系统八大谬论: 1.网络相当可靠 2.延迟为0 3.传输带宽是无限的 4.网络相当安全. 5.拓扑结构不会改变 6.必须要有一名管理员 7.传输成本为0 8.网络同质化. 分布式最常出现的问题: ...
- js中对一组数组进行求和
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...