【BZOJ1146】网络管理(主席树,树状数组)

题面

BZOJ权限题,洛谷题面

题解

树上带修改主席树

貌似和\(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】网络管理(主席树,树状数组)的更多相关文章

  1. CodeForces -163E :e-Government (AC自动机+DFS序+树状数组)

    The best programmers of Embezzland compete to develop a part of the project called "e-Governmen ...

  2. 【BZOJ1146】[CTSC2008]网络管理Network 树状数组+DFS序+主席树

    [BZOJ1146][CTSC2008]网络管理Network Description M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工 ...

  3. BZOJ1146[CTSC2008]网络管理——出栈入栈序+树状数组套主席树

    题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个 部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条 ...

  4. 【bzoj1146】[CTSC2008]网络管理Network 倍增LCA+dfs序+树状数组+主席树

    题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条高 ...

  5. BZOJ_1146_[CTSC2008]网络管理Network_主席树+树状数组

    BZOJ_1146_[CTSC2008]网络管理Network_主席树 Description M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个 部门 ...

  6. 【BZOJ】1146: [CTSC2008]网络管理Network(树链剖分+线段树套平衡树+二分 / dfs序+树状数组+主席树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1146 第一种做法(时间太感人): 第二种做法(rank5,好开心) ================ ...

  7. [BZOJ 1146] [CTSC2008]网络管理Network(树状数组+主席树)

    题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条高 ...

  8. bzoj1901--树状数组套主席树

    树状数组套主席树模板题... 题目大意: 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[ ...

  9. BZOJ 3196 Tyvj 1730 二逼平衡树 ——树状数组套主席树

    [题目分析] 听说是树套树.(雾) 怒写树状数组套主席树,然后就Rank1了.23333 单点修改,区间查询+k大数查询=树状数组套主席树. [代码] #include <cstdio> ...

随机推荐

  1. arm-点亮led灯

    点亮指路灯:学习四环节:led原理图分析,芯片手册导读,思维导图设计,为什么要使用led:通常led是作为程序调试的重要手段.led原理图:led实质为发光二极管,当其两端电压一定时,即处于导通状态. ...

  2. html中meta标签及用法理解

    自己一直想成为高级前端开发工程师,而自学.奈何最近感觉自学收效甚微,一度迷茫. 不破不立,打算改变这样的状态. 春节后上班第一天,今年打算好好实现自己的前端梦想. 重新整理.总结前端技术. 废话,就不 ...

  3. Mybatis 动态使用update语句

    update pf_product_audio_t <trim prefix="set" suffixOverrides=","> <if t ...

  4. Java经典编程题50道之四十七

    读取7个数(1~50)的整数值,每读取一个值,程序打印出该值个数的*. public class Example47 {    public static void main(String[] arg ...

  5. Ubantu16.04 redis安装

    通过FTP方式将redis的安装包从windows上传到linux上 解压命令:$sudo tar -zxf ~/Downloads/redis-3.2.7.tar.gz -C /usr/local ...

  6. bzoj 2120 带修改莫队

    2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MBSubmit: 7340  Solved: 2982[Submit][Status][Discuss] ...

  7. java中public private protected default的区别

    1.public:public表明该数据成员.成员函数是对所有用户开放的,所有用户都可以直接进行调用 2.private:private表示私有,私有的意思就是除了class自己之外,任何人都不可以直 ...

  8. Nginx前端设置反向代理,后端Apache如何获取访客的真实IP,结合PHP

    nginx反向代理后,在应用中取得的ip都是反向代理服务器的ip,取得的域名也是反向代理配置的url的域名,解决该问题,需要在nginx反向代理配置中添加一些配置信息,目的将客户端的真实ip和域名传递 ...

  9. 1×1卷积的用途(Network in Network)

    1×1卷积,又称为Network in Network 如果卷积的输出输入都只是一个平面,那么1x1卷积核并没有什么意义,它是完全不考虑像素与周边其他像素关系. 但卷积的输出输入是长方体,所以1x1卷 ...

  10. 如何使用 window api 转换字符集?

    //宽字符转多字节 std::string W2A(const std::wstring& utf8) { int buffSize = WideCharToMultiByte(CP_ACP, ...