很久之前写过 count on the tree。

然后一直不懂树状数组是怎么套上这个主席树的。

看了两小时发现它套的就是个权值线段树,

看不出来可持久化在哪里。

因为动态开点所以空间nlog2n。

树状数组维护dfs序,每个节点挂个线段树。

为了省空间拿原树建了个主席树。

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 80005
using namespace std;
int n,q;
int t[N];
int head[N],ver[N*],nxt[N*],tot;
int li[N*],now[N*],cnt;
void add(int a,int b)
{
tot++;nxt[tot]=head[a];head[a]=tot;ver[tot]=b;return ;
}
struct node
{
int k,a,b;
}qq[N];
int zz,st[N],ed[N];
int dep[N];
int fa[N][];
void lca()
{
for(int i=;i<=;i++)
for(int j=;j<=n;j++)
fa[j][i]=fa[fa[j][i-]][i-];
}
int lca(int x,int y)
{
if(dep[x]<dep[y])swap(x,y);
for(int i=;i>=;i--)if(dep[fa[x][i]]>=dep[y])x=fa[x][i];
if(x==y)return x;
for(int i=;i>=;i--)
{
if(fa[x][i]!=fa[y][i])
{
x=fa[x][i];y=fa[y][i];
}
}
return fa[x][];
}
void dfs(int x,int f)
{
st[x]=++zz;
for(int i=head[x];i;i=nxt[i])
{
if(ver[i]==f)continue;
fa[ver[i]][]=x;
dep[ver[i]]=dep[x]+;
dfs(ver[i],x);
}
ed[x]=zz;
}
int root[N],rot[N];
struct Node
{
int l,r,sum;
}a[N*];
int num; void inrt(int x,int y,int l,int r,int pos)
{
if(l==r)
{
a[x].sum=a[y].sum+;
return ;
}
int mid=(l+r)>>;
if(pos<=mid)
{
if(!a[x].l)a[x].l=++num;
a[x].r=a[y].r;
inrt(a[x].l,a[y].l,l,mid,pos);
}
else
{
if(!a[x].r)a[x].r=++num;
a[x].l=a[y].l;
inrt(a[x].r,a[y].r,mid+,r,pos);
}
a[x].sum=a[a[x].l].sum+a[a[x].r].sum;
}
void build()
{
for(int i=;i<=n;i++)
{
if(!rot[i])rot[i]=++num;
inrt(rot[i],rot[fa[i][]],,cnt,now[i]);
}
}
void insert(int x,int l,int r,int pos,int z)
{
if(l==r)
{
a[x].sum+=z;return ;
}
int mid=(l+r)>>;
if(pos<=mid)
{
if(!a[x].l)a[x].l=++num;
insert(a[x].l,l,mid,pos,z);
}
else
{
if(!a[x].r)a[x].r=++num;
insert(a[x].r,mid+,r,pos,z);
}
a[x].sum=a[a[x].l].sum+a[a[x].r].sum;
}
void ad(int x,int z,int la)
{
for(int i=x;i<=n;i+=(i&(-i)))
{
if(!root[i])root[i]=++num;
insert(root[i],,cnt,z,la);
}
return ;
}
int no[N][];
int t1,t2,t3,t4;
int qur(int x,int y)
{
int as=;
for(int i=x;i;i-=(i&(-i)))
{
as+=a[a[no[i][y]].l].sum;
}
return as;
}
int qur(int l,int r,int kk,int r1,int r2,int r3,int r4)
{
if(l==r)
{
return l;
}
int mid=(l+r)>>;
int xx=a[a[r3].l].sum+a[a[r4].l].sum-a[a[r1].l].sum-a[a[r2].l].sum;
xx+=qur(st[t1],);xx+=qur(st[t2],);
xx-=qur(st[t3],);xx-=qur(st[t4],);
if(xx>=kk)
{
for(int i=st[t1];i;i-=(i&(-i)))no[i][]=a[no[i][]].l;
for(int i=st[t2];i;i-=(i&(-i)))no[i][]=a[no[i][]].l;
for(int i=st[t3];i;i-=(i&(-i)))no[i][]=a[no[i][]].l;
for(int i=st[t4];i;i-=(i&(-i)))no[i][]=a[no[i][]].l;
return qur(l,mid,kk,a[r1].l,a[r2].l,a[r3].l,a[r4].l);
}
else
{
for(int i=st[t1];i;i-=(i&(-i)))no[i][]=a[no[i][]].r;
for(int i=st[t2];i;i-=(i&(-i)))no[i][]=a[no[i][]].r;
for(int i=st[t3];i;i-=(i&(-i)))no[i][]=a[no[i][]].r;
for(int i=st[t4];i;i-=(i&(-i)))no[i][]=a[no[i][]].r;
return qur(mid+,r,kk-xx,a[r1].r,a[r2].r,a[r3].r,a[r4].r);
}
}
int main()
{
scanf("%d%d",&n,&q);
for(int i=;i<=n;i++)scanf("%d",&t[i]),li[++cnt]=t[i];
for(int i=;i<n;i++)
{
scanf("%d%d",&t1,&t2);
add(t1,t2);add(t2,t1);
}
for(int i=;i<=q;i++)
{
scanf("%d%d%d",&qq[i].k,&qq[i].a,&qq[i].b);
if(!qq[i].k)li[++cnt]=qq[i].b;
}
sort(li+,li+cnt+);
cnt=unique(li+,li+cnt+)-li-;
for(int i=;i<=n;i++)now[i]=lower_bound(li+,li+cnt+,t[i])-li;
dep[]=;dfs(,-);
lca();
build();
for(int i=;i<=q;i++)
{
if(!qq[i].k)
{
ad(st[qq[i].a],now[qq[i].a],-);
if(ed[qq[i].a]!=zz)ad(ed[qq[i].a]+,now[qq[i].a],);
now[qq[i].a]=lower_bound(li+,li+cnt+,qq[i].b)-li;
ad(st[qq[i].a],now[qq[i].a],);
if(ed[qq[i].a]!=zz)ad(ed[qq[i].a]+,now[qq[i].a],-);
}
else
{
int tmp=lca(qq[i].a,qq[i].b);
int yy=dep[qq[i].a]+dep[qq[i].b]-dep[tmp]*+;
if(yy<qq[i].k)
{
puts("invalid request!");
continue;
}
else
{
yy=yy-qq[i].k+;
for(int j=st[qq[i].a];j;j-=(j&(-j)))no[j][]=root[j];
for(int j=st[qq[i].b];j;j-=(j&(-j)))no[j][]=root[j];
for(int j=st[tmp];j;j-=(j&(-j)))no[j][]=root[j];
for(int j=st[fa[tmp][]];j;j-=(j&(-j)))no[j][]=root[j];
t1=qq[i].a;t2=qq[i].b;t3=tmp;t4=fa[tmp][];
int tp=qur(,cnt,yy,rot[tmp],rot[fa[tmp][]],rot[qq[i].a],rot[qq[i].b]);
printf("%d\n",li[tp]);
}
}
}
return ;
}

bzoj 1146 [CTSC2008]网络管理Network的更多相关文章

  1. BZOJ 1146: [CTSC2008]网络管理Network [树上带修改主席树]

    1146: [CTSC2008]网络管理Network Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 3522  Solved: 1041[Submi ...

  2. BZOJ 1146: [CTSC2008]网络管理Network 树链剖分+线段树+平衡树

    1146: [CTSC2008]网络管理Network Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 870  Solved: 299[Submit] ...

  3. BZOJ 1146: [CTSC2008]网络管理Network( 树链剖分 + 树状数组套主席树 )

    树链剖分完就成了一道主席树裸题了, 每次树链剖分找出相应区间然后用BIT+(可持久化)权值线段树就可以完成计数. 但是空间问题很严重....在修改时不必要的就不要新建, 直接修改原来的..详见代码. ...

  4. BZOJ 1146: [CTSC2008]网络管理Network 带修改主席树_树套树_DFS序

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

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

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

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

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

  7. 洛谷 P4175: bzoj 1146: [CTSC2008]网络管理

    令人抓狂的整体二分题.根本原因还是我太菜了. 在学校写了一个下午写得头晕,回家里重写了一遍,一个小时就写完了--不过还是太慢. 题目传送门:洛谷P4175. 题意简述: 一棵 \(n\) 个结点的树, ...

  8. [BZOJ1146][CTSC2008]网络管理Network

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

  9. Luogu4175:[CTSC2008]网络管理Network

    题面 Luogu4175:[CTSC2008]网络管理Network Sol 路径第\(k\)大 无解直接判断就好了 然后整体二分,加上树链剖分+树状数组统计 # include <bits/s ...

随机推荐

  1. 浅谈为之奋斗过的Set接口

    Set接口 Set接口存储一组唯一,无序的对象 HashSet 是Set接口常用的实现类 HashSet允许集合元素值为null 操作数据的方法与List类似 Set接口不存在get()方法 set ...

  2. linux之cp/scp命令+scp命令详解

    名称:cp 使用权限:所有使用者 使用方式: cp [options] source dest cp [options] source... directory 说明:将一个档案拷贝至另一档案,或将数 ...

  3. iOS字体加载三种方式

    静态加载 动态加载 动态下载苹果提供的多种字体 其他 打印出当前所有可用的字体 检查某字体是否已经下载 这是一篇很简短的文章,介绍了 iOS 自定义字体加载的三种方式. 静态加载 这个可以说是最简单最 ...

  4. 浅谈Java的匿名类

    在实际的项目中看到一个很奇怪的现象,Java可以直接new一个接口,然后在new里面粗暴的加入实现代码.就像下面这样.那么问题来了,new出来的对象没有实际的类作为载体,这不是很奇怪吗? 思考以下代码 ...

  5. 利用sphinx为python项目生成API文档

    sphinx可以根据python的注释生成可以查找的api文档,简单记录了下步骤 1:安装 pip install -U Sphinx 2:在需要生成文档的.py文件目录下执行sphinx-apido ...

  6. js图片前端预览之 filereader 和 window.URL.createObjectURL

    //preview img : filereader方式 document.getElementById('imgFile').onchange = var ele = document.getEle ...

  7. asp.net mvc 各版本区别

    MVC 6 ASP.NET MVC and Web API has been merged in to one. Dependency injection is inbuilt and part of ...

  8. Oracle XMLTable 使用教程与实例

    从Oracle 10g开始,甲骨文公司新增了XQuery和XMLTable两个功能作为处理XML的武器. XMLQuery一样,您可以使用XQuery语言构造XML数据和查询XML和关系数据.你可以使 ...

  9. EF和MVC系列文章导航:EF Code First、DbContext、MVC

    对于之前一直使用webForm服务器控件.手写ado.net操作数据库的同学,突然来了EF和MVC,好多新概念泉涌而出,的确犹如当头一棒不知所措.本系列文章可以帮助新手入门并熟练使用EF和MVC,有了 ...

  10. python爬虫学习(8) —— 关于4399的一个小Demo

    堂弟喜欢各种游戏,在没有网络的情况下,上4399显得很无力. 另外,4399广告好多,,而且加载慢.. 怎么办,,写个爬虫吧,,把4399上的"好玩"游戏爬下来. 1. 分析阶段 ...