【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> ...
随机推荐
- Java DecimalFormat 用法
Java 提供 DecimalFormat 类,帮你用最快的速度将数字格式化为你需要的样子.下面是一个例子: importjava.text.DecimalFormat; publicclassTes ...
- [Python Study Notes]with的使用
在 Python 2.5 中, with 关键字被加入.它将常用的 try ... except ... finally ... 模式很方便的被复用.看一个最经典的例子: with open('fil ...
- 关于CSS的外边距合并问题
首先,需要明确的是只有普通文档流中块框的垂直外边距才会发生外边距合并.行内框.浮动框或绝对定位之间的外边距不会合并. 而在普通文档流中,这又分两种情况,分别是父子元素之间和相邻元素之间. <!D ...
- How to install tcpping on Linux.md
To install tcptraceroute on Debian/Ubuntu: $ sudo apt-get install tcptraceroute To install tcptracer ...
- 在OS X系统中php访问sftp时需要ssh2扩展的安装
php -v brew install homebrew/php/php55-ssh2 [实现方式] <?php $connection = ssh2_connect('192.168.0.14 ...
- 织梦使用if判断某个字段是否为空
织梦如何使用if判断某个字段是否为空呢?我们以文章页调用文章摘要为例: 使用if语句判断摘要是否为空,如果有摘要就显示摘要模块,如果没有就不显示 {dede:field.description run ...
- PHP如何防止XSS攻击
PHP防止XSS跨站脚本攻击的方法:是针对非法的HTML代码包括单双引号等,使用htmlspecialchars()函数 . 在使用htmlspecialchars()函数的时候注意第二个参数, 直接 ...
- pep 8 规范的一些记录
一.pep8起源 龟叔创立Python的初衷里就有创立一个容易阅读的编程语言,所以亲自操刀写了pep8 代码规范,每个项目开始前都要有一个共识,就是自己的代码规范,pep8 就是一个很好的范本. 二. ...
- hdu1006 Tick and Tick
原题链接 Tick and Tick 题意 计算时针.分针.秒针24小时之内三个指针之间相差大于等于n度一天内所占百分比. 思路 每隔12小时时针.分针.秒针全部指向0,那么只需要计算12小时内的百分 ...
- nyoj1246 逃离妖洞 BFS
逃离妖洞 描述 唐僧不小心又掉入妖怪的迷宫了.这个迷宫有n行m列,共n*m个方格.有的方格是空的,唐僧可以站在上面,有些是有障碍物的不能站.每次唐僧可以移动到相邻的8个空方格上.但是有些情况不 ...