【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> ...
随机推荐
- 升级 phpStudy 中 MySQL 版本至 5.7.17
由于本地用的集成环境是 phpStudy 2016,没有找到升级 MySQL 版本的选项,所以自己升级一下. 从官网上下载高版本的 MySQL :https://dev.mysql.com/dow ...
- LeetCode - 596. Classes More Than 5 Students
There is a table courses with columns: student and class Please list out all classes which have more ...
- [Python Study Notes]列表操作
列表操作 a.切片 >>> names = ["Alex","Tenglan","Eric","Rain&quo ...
- ThinkPHP的基本操作
一.生成入口文件 1.打开服务器,在本地环境测试时在地址栏输入localhost/项目文件名/index.php 可以在Application下面生成一个home模块,记得在这之前,要建立一个项目文 ...
- Linux 快速执行历史命令,用 !编号
例如: history | grep mysql 使用 !914 可以快速执行上述命令:
- C控制语句:分支和跳转
小技巧:程序return前加个getchar();可以让程序停住.%%可以打印使printf()中打印出%号 #include<stdio.h>#define SPACE ''int ma ...
- wired-wireless_priority
有线网卡和无线网卡同时上网,优先级切换的设置方法 默认有线网卡优先权高 Q:如果你想改为无线高,How do? A: ①进入网络属性的有线网卡的连接属性,选择TCP/IP属性,点"高级... ...
- JavaScript面向对象入门
什么是JavaScript? 我们可以从几个方面去说JavaScript是什么: 基于对象 javaScript中内置了许多对象供我们使用[String.Date.Array]等等 javaScrip ...
- centos/linux下的安装Nginx
1.安装gcc编译器 先查看gcc编译器是否安装 在shell控制台输入gcc-v 如果没有安装请看下一步 使用yuma安装gcc yum intsall gcc 看到如下视图则说明安装成功 2.安装 ...
- PHP操作Redis队列的方法
入队: <?php $redis = new Redis(); $redis->connect('127.0.0.1',6379); while(True){ try{ $value = ...