题意:有一棵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. cocos2d-x的基本动作2

    1.基本动作 Cocos2d提供的基本动作:瞬时动作.延时动作.运作速度. 瞬时动作:就是不需要时间,马上就完成的动作.瞬时动作的共同基类是 InstantAction. Cocos2d提供以下瞬时动 ...

  2. 【原】基于matlab的蓝色车牌定位与识别---绪论

    本着对车牌比较感兴趣,自己在课余时间摸索关于车牌的定位与识别,现将自己所做的一些内容整理下,也方便和大家交流. 考虑到车牌的定位涉及到许多外界的因素,因此有必要对车牌照的获取条件进行一些限定: 一.大 ...

  3. PAT 乙级 1045

    题目 题目地址:PAT 乙级 1045 题解 本题的解法比较巧妙,刚开始的试着用暴力求解,果不其然时间超限…… 变换思路,既然对于每个元素来说满足的条件是前小后大,那么对数组排序,对应的位置相等的即为 ...

  4. php 计算当天凌晨时间戳 以及获取其他常用时间戳

    php 计算当日凌晨时间戳 以及获取其他常用时间戳(持续补充中...) 获取当天凌晨时间戳: echo strtotime(date('Y-m-d')); 以下再列举一些获取其他常用时间戳的方法 获取 ...

  5. 【全面】Linux基础知识和基本操作语句大全(一)

    接触Linux已经有一段时间了,由于实际需要,三三两两地掌握了一些基本语法和实用语句,主要都是在日常开发中用得比较多的,条理不是特别清晰,请见谅!下面开始上硬货!! 基本操作: 关闭Linux系统的命 ...

  6. MongoDB之Replica Sets环境搭建

    最近学习MongoDB,这两天在搭建复制集的时候碰到了不少问题,也踩了好多坑,现在在这里记录下来,以供自己和他人参考 (因为本人是初学者,所以遇到的问题也会比较初级,所以本文也比较适合初学者查阅) 背 ...

  7. 制作iso文件

     genisoimage -o fusionstor-yi-2017-03-08.iso(镜像名称) -v -cache-inodes -joliet-long -R -J -T -V ZS  -c  ...

  8. 00018_流程控制语句switch

    1.选择结构switch switch 条件语句也是一种很常用的选择语句,它和if条件语句不同,它只能针对某个表达式的值作出判断,从而决定程序执行哪一段代码. 2.switch语句的语法格式 swit ...

  9. Linux性能查看

    1.TOP top  登录后默认按进程的CPU使用情况排序,  按M则按内存使用排序 2. vmstat 2 2 显示系统负载 3. free  -m 查看内存使用情况 4.抓包 tcpdump -i ...

  10. WebApp开发入门

    web app 的技术平台很多,如adobe phonegap.sencha touch.appcan(国产).dcloud(国产)平台.我选择了dcloud平台,原因:简单,容易上手. web ap ...