如果没有修改就是简单主席树,有了修改的话因为主席树维护的是到根的一段路径,所以修改操作会修改子树,也就是连续的一段dfn

所以显然树套树一波就没了

极其好写

#include<bits/stdc++.h>
#define il inline
#define vd void
typedef long long ll;
il int gi(){
int x=0,f=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=-1;
ch=getchar();
}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
int n;
int W[80010],w[160010],m;
int K[80010],A[80010],B[80010],dep[80010];
int fir[80010],dis[160010],nxt[160010],id;
il vd link(int a,int b){nxt[++id]=fir[a],fir[a]=id,dis[id]=b;}
int dfn[80010],siz[80010];
int rt[80010],ls[10000010],rs[10000010],sum[10000010],cnt;
int st[17][80010];
il vd dfs(int x,int fa=-1){
dfn[x]=++dfn[0];siz[x]=1;
for(int i=fir[x];i;i=nxt[i]){
if(dis[i]==fa)continue;
st[0][dis[i]]=x;
dep[dis[i]]=dep[x]+1;
dfs(dis[i],x);
siz[x]+=siz[dis[i]];
}
}
#define mid ((l+r)>>1)
il vd update(int&x,int l,int r,const int&p,const int&d){
if(!x)x=++cnt;sum[x]+=d;if(l==r)return;
if(p<=mid)update(ls[x],l,mid,p,d);
else update(rs[x],mid+1,r,p,d);
}
#undef mid
il vd Update(int l,int r,int w,int d){
while(l<=n)update(rt[l],1,m,w,d),l+=l&-l;
while(r<=n)update(rt[r],1,m,w,-d),r+=r&-r;
}
il int LCA(int x,int y){
if(dep[x]<dep[y])std::swap(x,y);
int C=dep[x]-dep[y];
for(int i=16;~i;--i)if(C&(1<<i))x=st[i][x];
for(int i=16;~i;--i)if(st[i][x]^st[i][y])x=st[i][x],y=st[i][y];
if(x^y)x=st[0][x];return x;
}
int main(){
n=gi();
int q=gi(),x,y;
for(int i=1;i<=n;++i)W[i]=w[++m]=gi();
for(int i=1;i<n;++i)x=gi(),y=gi(),link(x,y),link(y,x);
for(int i=1;i<=q;++i){
K[i]=gi(),A[i]=gi(),B[i]=gi();
if(!K[i])w[++m]=B[i];
}
std::sort(w+1,w+m+1),m=std::unique(w+1,w+m+1)-w-1;
for(int i=1;i<=n;++i)W[i]=std::lower_bound(w+1,w+m+1,W[i])-w;
for(int i=1;i<=q;++i)if(!K[i])B[i]=std::lower_bound(w+1,w+m+1,B[i])-w;
dfs(1);
for(int i=1;i<17;++i)
for(int j=1;j<=n;++j)
st[i][j]=st[i-1][st[i-1][j]];
for(int i=1;i<=n;++i)Update(dfn[i],dfn[i]+siz[i],W[i],1);
for(int i=1;i<=q;++i)
if(K[i]){
x=A[i],y=B[i];int lca=LCA(x,y);
if(dep[x]+dep[y]-2*dep[lca]+1<K[i]){puts("invalid request!");continue;}
static int A[2333],B[2333],a,b;
a=b=0;
int l,r;
r=dfn[x];while(r)B[++b]=rt[r],r-=r&-r;
r=dfn[y];while(r)B[++b]=rt[r],r-=r&-r;
r=dfn[lca];while(r)A[++a]=rt[r],r-=r&-r;
if(lca!=1){r=dfn[st[0][lca]];while(r)A[++a]=rt[r],r-=r&-r;}
l=1,r=m;
while(l^r){
int tot=0;
for(int i=1;i<=a;++i)tot-=sum[rs[A[i]]];
for(int i=1;i<=b;++i)tot+=sum[rs[B[i]]];
if(K[i]>tot){
K[i]-=tot;
for(int i=1;i<=a;++i)A[i]=ls[A[i]];
for(int i=1;i<=b;++i)B[i]=ls[B[i]];
r=(l+r)>>1;
}else{
for(int i=1;i<=a;++i)A[i]=rs[A[i]];
for(int i=1;i<=b;++i)B[i]=rs[B[i]];
l=((l+r)>>1)+1;
}
}
printf("%d\n",w[l]);
}else Update(dfn[A[i]],dfn[A[i]]+siz[A[i]],W[A[i]],-1),Update(dfn[A[i]],dfn[A[i]]+siz[A[i]],W[A[i]]=B[i],1);
return 0;
}

P4175 [CTSC2008]网络管理的更多相关文章

  1. 洛谷 P4175 [CTSC2008]网络管理 解题报告

    P4175 [CTSC2008]网络管理 题目描述 带修改树上链的第\(k\)大 输入输出格式 输入格式: 第一行为两个整数\(N\)和\(Q\),分别表示路由器总数和询问的总数. 第二行有\(N\) ...

  2. 洛谷P4175 - [CTSC2008]网络管理

    Portal Description 给出一棵\(n(n\leq8\times10^4)\)个点的带点权的树,进行\(m(m\leq8\times10^4)\)次操作,操作有两种: 修改一个点的点权. ...

  3. P4175 [CTSC2008]网络管理 树剖+树套树

    $ \color{#0066ff}{ 题目描述 }$ M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通 ...

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

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

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

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

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

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

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

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

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

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

  9. BZOJ_1146_[CTSC2008]网络管理Network_主席树+树状数组

    BZOJ_1146_[CTSC2008]网络管理Network_主席树 Description M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个 部门 ...

随机推荐

  1. Spring Boot (#1 quick start)

    Spring Boot (#1 quick start) 官方文档 Spring Boot是为了简化Spring应用的创建.运行.调试.部署等而出现的,使用它可以做到专注于Spring应用的开发,而无 ...

  2. 在Docker Swarm上部署Apache Storm:第1部分

    [编者按]本文来自 Baqend Tech Blog,描述了如何在 Docker Swarm,而不是在虚拟机上部署和调配Apache Storm集群.文章系国内 ITOM 管理平台 OneAPM 编译 ...

  3. Hibernate 注释用法

    注释 到现在为止,你已经看到 Hibernate 如何使用 XML 映射文件来完成从 POJO 到数据库表的数据转换的,反之亦然.Hibernate 注释是无需使用 XML 文件来定义映射的最新方法. ...

  4. 推荐:Asp.Net MVC 多语言(html+js共用一套资源文件)

    此文主要是最近做多语言的工作的一个经验分享.文中的内容为参照多位大神的方案后,自己揉捏出来的一个新的方案,对于html和javascript部分的多语言的切换,共用一套资源文件.代码中主要是使用 IH ...

  5. HTTP学习---TCP三次握手和四次挥手

    IP协议 首先我们看 IP(Internet Protocol)协议.IP 协议提供了主机和主机间的通信. 为了完成不同主机的通信,我们需要某种方式来唯一标识一台主机,这个标识,就是著名的IP地址.通 ...

  6. JDK5 新特性之 可变参数的方法(2)---asList

    > Arrays.asList(T - a)方法的使用 >UnsupportedOperationException分析     Arrays.asList(T - a)方法的使用 pac ...

  7. Linux 出现 E325:ATTENTION swap

    当用vim打开一个文件的时候,系统提示:E325:ATTENTION Found a swap by the name ".a.swp" owned by:…… …… 这是由于在编 ...

  8. aspnet_regiis.exe -i 报 “此操作系统版本不支持此选项”

    解决方法: 控制面板 - 程序和功能 - 启动或关闭windows功能 - Internet Information services - 万维网服务 - 应用程序开发功能 勾选: 1.ASP.NET ...

  9. Google常用脚本

    1.Tampermonkey 可下载常用脚本:https://greasyfork.org/zh-CN 2.常用FQSetupVPN 3.百度药丸屏蔽广告 4.百度文档可粘贴,下载 5.VIP视频可看

  10. 阿里八八Alpha阶段Scrum(6/12)

    今日进度 叶文滔: 修复了无法正确判断拖曳与点击的BUG,并且成功连接添加界面. 会议内容 会议照片 明日安排 叶文滔: 继续完善按钮功能 王国超: 继续攻克日程界面显示存在的BUG 俞鋆: 继续进行 ...