BZOJ1146 [CTSC2008]网络管理Network 树链剖分 主席树 树状数组
欢迎访问~原文出处——博客园-zhouzhendong
去博客园看该题解
题目传送门 - BZOJ1146
题意概括
在一棵树上,每一个点一个权值。
有两种操作:
1、单点修改
2、询问两点之间的树链上的第k大值
题解
水题。
就是烦了一点。
居然只调了3个小时?
树链剖分+带修主席树。
带修主席树:
BZOJ1901 Zju2112 Dynamic Rankings 主席树
代码
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <vector>
using namespace std;
const int N=80005;
struct Gragh{
int cnt,y[N*2],nxt[N*2],fst[N];
void clear(){
cnt=0;
memset(fst,0,sizeof fst);
}
void add(int a,int b){
y[++cnt]=b,nxt[cnt]=fst[a],fst[a]=cnt;
}
}g;
struct cz{
int k,a,b;
}q[N];
int n,Q,v[N],Ha[N*2],hs;
int fa[N],son[N],depth[N],size[N],top[N],p[N],ap[N],cnp=0;
const int S=N*2*2*20;
vector <int> val[N];
int ls[S],rs[S],root[N],Next[S],sum[S],pp[S],app[S],tot=0,tpp=0;
void LSH(){
sort(Ha+1,Ha+hs+1);
int hs_=1;
for (int i=2;i<=hs;i++)
if (Ha[i]!=Ha[i-1])
Ha[++hs_]=Ha[i];
hs=hs_;
}
void Get_Gen_Info(int rt,int pre,int d){
fa[rt]=pre,depth[rt]=d,size[rt]=1,son[rt]=-1;
for (int i=g.fst[rt];i;i=g.nxt[i])
if (g.y[i]!=pre){
int s=g.y[i];
Get_Gen_Info(s,rt,d+1);
size[rt]+=size[s];
if (son[rt]==-1||size[s]>size[son[rt]])
son[rt]=s;
}
}
void Get_Top(int rt,int tp){
top[rt]=tp;
ap[p[rt]=++cnp]=rt;
if (son[rt]==-1)
return;
Get_Top(son[rt],tp);
for (int i=g.fst[rt];i;i=g.nxt[i]){
int s=g.y[i];
if (s!=fa[rt]&&s!=son[rt])
Get_Top(s,s);
}
}
int find(int x){
return lower_bound(Ha+1,Ha+hs+1,x)-Ha;
}
void build(int &rt,int L,int R){
rt=++tot;
if (L==R){
ls[rt]=rs[rt]=0;
return;
}
int mid=(L+R)>>1;
build(ls[rt],L,mid);
build(rs[rt],mid+1,R);
}
void access(int prt,int &rt,int L,int R,int pos){
if (!rt||rt==prt)
rt=++tot;
Next[prt]=rt;
if (L==R)
return;
int mid=(L+R)>>1;
if (pos<=mid){
access(ls[prt],ls[rt],L,mid,pos);
if (!rs[rt])
rs[rt]=rs[prt];
}
else {
access(rs[prt],rs[rt],mid+1,R,pos);
if (!ls[rt])
ls[rt]=ls[prt];
}
}
void build_pp(int rt){
if (!rt)
return;
for (int i=rt;i;i=Next[i])
app[pp[i]=++tpp]=i;
build_pp(ls[rt]);
build_pp(rs[rt]);
}
int lowbit(int x){
return x&-x;
}
void add(int x,int d){
for (;x<=tpp;x+=lowbit(x))
sum[x]+=d;
}
int Sum(int x){
int ans=0;
for (;x>0;x-=lowbit(x))
ans+=sum[x];
return ans;
}
void update(int rt,int L,int R,int pos,int v){
add(pp[rt],v);
if (L==R)
return;
int mid=(L+R)>>1;
if (pos<=mid)
update(ls[rt],L,mid,pos,v);
else
update(rs[rt],mid+1,R,pos,v);
}
int query(int prt,int rt,int L,int R,int pos){
if (R<pos)
return 0;
if (L>=pos)
return Sum(pp[rt])-Sum(pp[prt]);
int mid=(L+R)>>1;
return query(ls[prt],ls[rt],L,mid,pos)+query(rs[prt],rs[rt],mid+1,R,pos);
}
int Tquery(int a,int b,int pos){
int f1=top[a],f2=top[b];
int total=0;
while (f1!=f2){
if (depth[f1]<depth[f2])
swap(f1,f2),swap(a,b);
total+=query(root[p[f1]-1],root[p[a]],1,hs,pos);
a=fa[f1],f1=top[a];
}
if (depth[a]>depth[b])
swap(a,b);
total+=query(root[p[a]-1],root[p[b]],1,hs,pos);
return total;
}
int main(){
scanf("%d%d",&n,&Q);
for (int i=1;i<=n;i++)
scanf("%d",&v[i]),Ha[i]=v[i];
hs=n;
g.clear();
for (int i=1,a,b;i<n;i++){
scanf("%d%d",&a,&b);
g.add(a,b);
g.add(b,a);
}
for (int i=1;i<=Q;i++){
scanf("%d%d%d",&q[i].k,&q[i].a,&q[i].b);
if (q[i].k==0)
Ha[++hs]=q[i].b;
}
LSH();
Get_Gen_Info(1,0,0);
Get_Top(1,1);
for (int i=1;i<=n;i++)
val[i].clear();
for (int i=1;i<=n;i++)
val[p[i]].push_back(find(v[i]));
for (int i=1;i<=Q;i++)
if (q[i].k==0)
val[p[q[i].a]].push_back(find(q[i].b));
build(root[0],1,hs);
memset(Next,0,sizeof Next);
for (int i=1;i<=n;i++)
for (int j=0;j<val[i].size();j++)
access(root[i-1],root[i],1,hs,val[i][j]);
build_pp(root[0]);
memset(sum,0,sizeof sum);
for (int i=1;i<=n;i++)
update(root[p[i]],1,hs,find(v[i]),1);
for (int i=1;i<=Q;i++){
if (q[i].k==0){
update(root[p[q[i].a]],1,hs,find(v[q[i].a]),-1);
update(root[p[q[i].a]],1,hs,find(v[q[i].a]=q[i].b),1);
}
else {
int L=1,R=hs,mid,ans=-1;
while (L<=R){
mid=(L+R)>>1;
if (Tquery(q[i].a,q[i].b,mid)>=q[i].k)
L=mid+1,ans=mid;
else
R=mid-1;
}
if (!~ans)
puts("invalid request!");
else
printf("%d\n",Ha[ans]);
}
}
return 0;
}
BZOJ1146 [CTSC2008]网络管理Network 树链剖分 主席树 树状数组的更多相关文章
- [BZOJ1146][CTSC2008]网络管理Network
[BZOJ1146][CTSC2008]网络管理Network 试题描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个 部门之间协同工作,公司搭建 ...
- dfs序+主席树 或者 树链剖分+主席树(没写) 或者 线段树套线段树 或者 线段树套splay 或者 线段树套树状数组 bzoj 4448
4448: [Scoi2015]情报传递 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 588 Solved: 308[Submit][Status ...
- bzoj 4034 [HAOI2015] T2(树链剖分,线段树)
4034: [HAOI2015]T2 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1536 Solved: 508[Submit][Status] ...
- bzoj 1036 [ZJOI2008]树的统计Count(树链剖分,线段树)
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 10677 Solved: 4313[Submit ...
- poj 3237 Tree(树链剖分,线段树)
Tree Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 7268 Accepted: 1969 Description ...
- bzoj 3626 [LNOI2014]LCA(离线处理+树链剖分,线段树)
3626: [LNOI2014]LCA Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1272 Solved: 451[Submit][Status ...
- bzoj 2243 [SDOI2011]染色(树链剖分,线段树)
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 4637 Solved: 1726[Submit][Status ...
- HDU 4366 Successor(树链剖分+zkw线段树+扫描线)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4366 [题目大意] 有一个公司,每个员工都有一个上司,所有的人呈树状关系,现在给出每个人的忠诚值和 ...
- 【BZOJ3531】旅行(树链剖分,线段树)
[BZOJ3531]旅行(树链剖分,线段树) 题面 Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足 从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教 ...
- 【BZOJ5507】[GXOI/GZOI2019]旧词(树链剖分,线段树)
[BZOJ5507][GXOI/GZOI2019]旧词(树链剖分,线段树) 题面 BZOJ 洛谷 题解 如果\(k=1\)就是链并裸题了... 其实\(k>1\)发现还是可以用类似链并的思想,这 ...
随机推荐
- OpenGIS 介绍(转)
值此FOSS4G大会即将召开之日,最近我会在Blog上依次介绍一些OpenGIS标准.架构及用于实现的软件.一方面给初涉此行的朋友一个快速入门的概览,另一方面也是对我接触OpenGIS近一年来的总结. ...
- 网络类型IPv4和IPv6什么意思?区别?
在windows 7以上系统中,在设置本地IP地址的时候经常会看到同事含有IPV4协议项与IPV6协议项,并不同于以往windows xp系统中仅有TCP/IP协议项,不少朋友都觉得比较奇怪,询问编辑 ...
- JavaScript之DOM等级概述
这两日对DOM等级的理解不是太通透,就进Mozilla官网去看了一下,然后进行了首次的对技术文档的翻译工作,虽然官网也有中文解释,但我想,自己翻译出来时,已经有了原汁原味的理解了吧,这边是做此次翻译的 ...
- UE4的AI学习(1)——基本概念
AI学习当中,不学习行为树基本概念就不能明白具体实例中的操作意义,但是没有经过具体实例实验,又觉得基本概念抽象难以理解.建议先泛读(1)(2)后再对具体的细节进行死磕,能较深的理解行为树的具体概念.第 ...
- ACM-ICPC 2018 南京赛区网络预赛 L题(分层图,堆优化)
题目链接: https://nanti.jisuanke.com/t/31001 超时代码: #include<bits/stdc++.h> using namespace std; # ...
- Python3实现从文件中读取指定行的方法
from:http://www.jb51.net/article/66580.htm 这篇文章主要介绍了Python3实现从文件中读取指定行的方法,涉及Python中linecache模块操作文件的使 ...
- JS判断页面是否出现滚动条
今天无聊,帮一个网友解决一个很无聊的问题,用JS判断页面是否出现滚动条,在网上看了一些代码,经过验证并不起作用,下面是在网上搜索到的代码: 当可视区域小于页面的实际高度时,判定为出现滚动条,即: if ...
- dubbo系列三、架构介绍及各模块关系
一.整体设计 图例说明: 图中左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口,位于中轴线上的为双方都用到的接口. 图中从下至上分为十层,各层均为单向依赖,右边的黑色箭头代 ...
- plsql developer无法识别32位oracle问题如何解决?
1.登录PL/SQL Developer这里省略Oracle数据库和PL/SQL Developer的安装步骤,注意在安装PL/SQL Developer软件时,不要安装在Program Files ...
- getOutputStream与getWriter方法
getOutputStream方法用于返回Servlet引擎创建的字节输出流对象,Servlet程序可以按字节形式输出响应正文.getWriter方法用于返回Servlet引擎创建的字符输出流对象,S ...