题意:有一棵N个点的树,每个点有一个点权a[i],要求在线实现以下操作:

1:将X号点的点权修改为Y

2:查询X到Y的路径上第K大的点权

n,q<=80000 a[i]<=10^8

思路:此题明显地体现了我对主席树理解不深

树上路径K大可以直接用树剖+二分答案+树做

但DFS序+主席树也可以

对于点U,它能影响DFS序上的区间(st[u],ed[u])

所以维护方法就是类似序列K大一样 s[st[u]]++ s[ed[u]+1]--

对于路径(x,y),信息为s[x]+s[y]-s[lca(x,y)]-s[fa[lca(x,y)]]

但因为是在树上的操作,所以每个点是从它在树上的父亲继承下来的,并不是DFS序上的前一个继承的

所以在DFS时就可以建立一棵没有修改过的原树

对于询问,再建立一棵树只做更改,询问时加上原树的信息即可

不开两棵树可以,不过需要主席树合并

 var t:array[..]of record
l,r,s:longint;
end;
f:array[..,..]of longint;
head,vet,next,st,ed,dep,flag,hash,root1,root2,b:array[..]of longint;
d:array[..,..]of longint;
a:array[..]of longint;
q1,q2:array[..]of longint;
n,m,i,j,tot,time,up,la,lb,cnt,q,x,y,tmp,p,sum,z,f1,f2,f3,f4:longint; procedure add(a,b:longint);
begin
inc(tot);
next[tot]:=head[a];
vet[tot]:=b;
head[a]:=tot;
end; function max(x,y:longint):longint;
begin
if x>y then exit(x);
exit(y);
end; procedure swap(var x,y:longint);
var t:longint;
begin
t:=x; x:=y; y:=t;
end; function find(x:longint):longint;
var l,r,mid:longint;
begin
l:=; r:=up;
while l<=r do
begin
mid:=(l+r)>>;
if hash[mid]=x then exit(mid);
if hash[mid]<x then l:=mid+
else r:=mid-;
end;
end; procedure update(l,r:longint;var p:longint;v,x:longint);
var mid:longint;
begin
inc(cnt); t[cnt]:=t[p];
p:=cnt; t[p].s:=t[p].s+x;
if l=r then exit;
mid:=(l+r)>>;
if v<=mid then update(l,mid,t[p].l,v,x)
else update(mid+,r,t[p].r,v,x);
end; procedure dfs(u:longint);
var e,v,i,tmp:longint;
begin
for i:= to do
begin
if dep[u]<(<<i) then break;
f[u,i]:=f[f[u,i-],i-];
end;
tmp:=find(a[u]);
root1[u]:=root1[f[u,]];
update(,up,root1[u],tmp,);
inc(time); st[u]:=time; ed[u]:=time;
flag[u]:=;
e:=head[u];
while e<> do
begin
v:=vet[e];
if flag[v]= then
begin
f[v,]:=u;
dep[v]:=dep[u]+;
dfs(v);
ed[u]:=max(ed[u],ed[v]);
end;
e:=next[e];
end;
end; function lca(x,y:longint):longint;
var d,i:longint;
begin
if dep[x]<dep[y] then swap(x,y);
d:=dep[x]-dep[y];
for i:= to do
if d and (<<i)> then x:=f[x,i];
for i:= downto do
if f[x,i]<>f[y,i] then
begin
x:=f[x,i]; y:=f[y,i];
end;
if x=y then exit(x);
exit(f[x,]);
end; procedure qsort(l,r:longint);
var i,j,mid:longint;
begin
i:=l; j:=r; mid:=b[(l+r)>>];
repeat
while mid>b[i] do inc(i);
while mid<b[j] do dec(j);
if i<=j then
begin
swap(b[i],b[j]);
inc(i); dec(j);
end;
until i>j;
if l<j then qsort(l,j);
if i<r then qsort(i,r);
end; function lowbit(x:longint):longint;
begin
exit(x and (-x));
end; function query(l,r,k:longint):longint;
var s1,s2,i,mid:longint;
begin
if l=r then exit(l);
mid:=(l+r)>>;
s1:=; s2:=;
for i:= to la do s1:=s1+t[t[q1[i]].l].s;
for i:= to lb do s2:=s2+t[t[q2[i]].l].s;
s2:=s2+t[t[f1].l].s+t[t[f2].l].s;
s1:=s1+t[t[f3].l].s+t[t[f4].l].s;
if s2-s1>=k then
begin
f1:=t[f1].l; f2:=t[f2].l;
f3:=t[f3].l; f4:=t[f4].l;
for i:= to la do q1[i]:=t[q1[i]].l;
for i:= to lb do q2[i]:=t[q2[i]].l;
exit(query(l,mid,k));
end
else
begin
f1:=t[f1].r; f2:=t[f2].r;
f3:=t[f3].r; f4:=t[f4].r;
for i:= to la do q1[i]:=t[q1[i]].r;
for i:= to lb do q2[i]:=t[q2[i]].r;
exit(query(mid+,r,k-(s2-s1)));
end;
end; begin
assign(input,'data.in'); reset(input);
assign(output,'tyvj2133.out'); rewrite(output);
read(n,m);
for i:= to n do
begin
read(a[i]); b[i]:=a[i];
end;
q:=n;
for i:= to n- do
begin
read(x,y);
add(x,y);
add(y,x);
end; for i:= to m do
for j:= to do read(d[i,j]);
for i:= to m do
if d[i,]= then
begin
inc(q); b[q]:=d[i,];
end;
qsort(,q);
hash[]:=b[]; up:=;
for i:= to q do
if b[i]<>b[i-] then begin inc(up); hash[up]:=b[i]; end;
dfs(); for i:= to m do
if d[i,]= then
begin
tmp:=find(a[d[i,]]);
j:=st[d[i,]];
while j<=n do
begin
update(,up,root2[j],tmp,-);
j:=j+lowbit(j);
end;
j:=ed[d[i,]]+;
while j<=n do
begin
update(,up,root2[j],tmp,);
j:=j+lowbit(j);
end;
tmp:=find(d[i,]);
j:=st[d[i,]];
while j<=n do
begin
update(,up,root2[j],tmp,);
j:=j+lowbit(j);
end;
j:=ed[d[i,]]+;
while j<=n do
begin
update(,up,root2[j],tmp,-);
j:=j+lowbit(j);
end; a[d[i,]]:=d[i,];
end
else
begin
la:=; lb:=; p:=lca(d[i,],d[i,]);
j:=st[d[i,]];
while j> do
begin
inc(lb); q2[lb]:=root2[j];
j:=j-lowbit(j);
end; j:=st[d[i,]];
while j> do
begin
inc(lb); q2[lb]:=root2[j];
j:=j-lowbit(j);
end; j:=st[p];
while j> do
begin
inc(la); q1[la]:=root2[j];
j:=j-lowbit(j);
end; j:=st[f[p,]];
while j> do
begin
inc(la); q1[la]:=root2[j];
j:=j-lowbit(j);
end; f1:=root1[d[i,]]; f2:=root1[d[i,]];
f3:=root1[p]; f4:=root1[f[p,]];
sum:=dep[d[i,]]+dep[d[i,]]-dep[p]*+;
z:=sum-d[i,]+;
if sum<d[i,] then writeln('invalid request!')
else writeln(hash[query(,up,z)]);
end; close(input);
close(output);
end.

【Tyvj2133&BZOJ1146】网络管理Network(树套树,DFS序,树状数组,主席树,树上差分)的更多相关文章

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

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

  2. zoj2112 树状数组+主席树 区间动第k大

    Dynamic Rankings Time Limit: 10000MS   Memory Limit: 32768KB   64bit IO Format: %lld & %llu Subm ...

  3. BZOJ_2120_数颜色_Set+树状数组+主席树

    BZOJ_2120_数颜色_Set+树状数组+主席树 Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L ...

  4. BZOJ_1901_Zju2112 Dynamic Rankings_树状数组+主席树

    BZOJ_1901_Zju2112 Dynamic Rankings_树状数组+主席树 题意: 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i, ...

  5. 【bzoj3744】Gty的妹子序列 分块+树状数组+主席树

    题目描述 我早已习惯你不在身边, 人间四月天 寂寞断了弦. 回望身后蓝天, 跟再见说再见…… 某天,蒟蒻Autumn发现了从 Gty的妹子树(bzoj3720) 上掉落下来了许多妹子,他发现 她们排成 ...

  6. P1972 [SDOI2009]HH的项链[离线+树状数组/主席树/分块/模拟]

    题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的贝壳,因此,他的项链 ...

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

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

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

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

  9. [luogu2617][bzoj1901][Zju2112]Dynamic Rankings【树套树+树状数组+主席树】

    题目网址 [传送门] 题目大意 请你设计一个数据结构,支持单点修改,区间查询排名k. 感想(以下省略脏话inf个字) 真的强力吹爆洛谷数据,一般的树套树还给我T了一般的点,加强的待修主席树还给我卡了几 ...

  10. hdu_5788_Level Up(树状数组+主席树)

    题目链接:hdu_5788_Level Up 题意: 有一棵树,n个节点,每个节点有个能力值A[i],mid[i],mid的值为第i节点的子树的中位数(包括本身),现在让你将其中的一个节点的A值改为1 ...

随机推荐

  1. sessionStorage对象

    sessStorage对象是一个会话形式的数据存储,当用户关闭浏览器的窗口后,数据就会被删除. 实例: <!DOCTYPE html><html><head> &l ...

  2. 【转】VS2010下MFC的串口编程

    串口通信简介 一般来说,计算机都有一个或多个串行端口,这些串口提供了外部设备与PC进行数据传输和通信的通道,在CPU和外设之间充当解释器的角色.当字符数据从CPU发送给外设时,这些字符数据将被转换成串 ...

  3. 二叉搜索树详解(Java实现)

    1.二叉搜索树定义 二叉搜索树,是指一棵空树或者具有下列性质的二叉树: 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值: 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根 ...

  4. Linux Ptrace 详解

    转 https://blog.csdn.net/u012417380/article/details/60470075 Linux Ptrace 详解 2017年03月05日 18:59:58 阅读数 ...

  5. jquery图片切换插件jquery.cycle.js参数详解

    转自:国人的力量 blog.163.com/xz551@126/blog/static/821257972012101541835491/ 自从使用了jquery.cycle.js,我觉得再也不用自己 ...

  6. pandas按索引插入对应值的处理方法 - join

    在工作中遇到一个问题即,实时的车辆数据中,需要将车辆的vid(一个Series)对应上其通用名称,以及车辆用途等信息进行统计. 正常的小规模操作是利用一个循环,查找vid 在另一张vid对应车辆名称用 ...

  7. Java-framework-Vaadin

    安装vaadin: (1) 首先试了maven+vaadin. 安装maven: 1. unzip apache-maven-3.3.9-bin.zip 2. modify PATH environm ...

  8. CentOS 7.0 使用 yum 安装 MariaDB 及 简单配置

    1.安装MariaDB 安装命令 yum -y install MariaDB-server MariaDB-client 安装完成MariaDB,首先启动MariaDB 设置开机启动 接下来进行Ma ...

  9. Linux扩增卷组、逻辑卷以及缩减逻辑卷

    今天我们将了解怎样来扩展卷组,扩展和缩减逻辑卷.在这里,我们可以缩减或者扩展逻辑卷管理(LVM)中的分区,LVM也可称之为弹性卷文件系统. 前置需求使用LVM创建弹性磁盘存储——第一部分 什么时候我们 ...

  10. Linux网络文件系统NFS详解

    什么是文件系统,NFS文件系统又是什么? 简单的说,文件系统就是通过软件对磁盘上的数据进行组织和管理的一种机制,对其的一种封装或透视. 你女朋友拍了美美的暧昧照片,放一个文件夹里发送给了A服务器,当你 ...