浅谈树状数组与线段树:https://www.cnblogs.com/AKMer/p/9946944.html

题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1146

在欧拉序上用树状数组套权值线段树搞事情。在进的时候加一,出去的时候减一。

从欧拉序第一位到当前点的\(L\)就是根到当前点的状态(因为其他的路径一进一出抵消掉了),然后你求出两个点的\(lca\)和\(lca\)的父亲减一减跑一跑就好了。

时间复杂度:\(O(nlog^2n)\)

空间复杂度:\(O(nlog^2n)\)

代码如下:

#include <cstdio>
#include <algorithm>
using namespace std;
#define low(i) ((i)&(-(i))) const int maxn=8e4+5; int n,m,tot,cnt,tim;
int opt[maxn],x[maxn],y[maxn];
int f[maxn][18],L[maxn],R[maxn];
int tmp[maxn<<1],a[maxn],dep[maxn];
int now[maxn],pre[maxn*2],son[maxn*2]; int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
} void add(int a,int b) {
pre[++tot]=now[a];
now[a]=tot,son[tot]=b;
} void init() {
cnt=n=read(),m=read();
for(int i=1;i<=n;i++)tmp[i]=a[i]=read();
for(int i=1;i<n;i++) {
int a=read(),b=read();
add(a,b),add(b,a);
}
for(int i=1;i<=m;i++) {
opt[i]=read(),x[i]=read(),y[i]=read();
if(!opt[i])tmp[++cnt]=y[i];
}tot=cnt;sort(tmp+1,tmp+tot+1);
cnt=unique(tmp+1,tmp+tot+1)-tmp-1;
for(int i=1;i<=n;i++)
a[i]=lower_bound(tmp+1,tmp+cnt+1,a[i])-tmp;
for(int i=1;i<=m;i++)
if(!opt[i])y[i]=lower_bound(tmp+1,tmp+cnt+1,y[i])-tmp;
} int sum[maxn*180],ls[maxn*180],rs[maxn*180]; struct segment_tree {
int fake; void change(int p,int l,int r,int pos,int v) {
while(1) {
sum[p]+=v;if(l==r)break;
int mid=(l+r)>>1;
if(pos<=mid) {
if(!ls[p])ls[p]=++fake;
p=ls[p],r=mid;
}
else {
if(!rs[p])rs[p]=++fake;
p=rs[p],l=mid+1;
}
}
}
}T; struct TreeArray {
int cnt1,cnt2,cnt3,cnt4;
int rt[maxn<<1],u1[maxn],u2[maxn],u3[maxn],u4[maxn]; void change(int pos,int v,int num) {
for(int i=pos;i<=2*n;i+=low(i)) {
if(!rt[i])rt[i]=++T.fake;
T.change(rt[i],1,cnt,v,num);
}
} void query(int fa1,int fa2,int u,int v,int k) {
int l=1,r=cnt,res=0;cnt1=cnt2=cnt3=cnt4=0;
if(fa1)for(int i=L[fa1];i;i-=low(i))u1[++cnt1]=rt[i],res-=sum[rt[i]];
for(int i=L[fa2];i;i-=low(i))u2[++cnt2]=rt[i],res-=sum[rt[i]];
for(int i=L[u];i;i-=low(i))u3[++cnt3]=rt[i],res+=sum[rt[i]];
for(int i=L[v];i;i-=low(i))u4[++cnt4]=rt[i],res+=sum[rt[i]];
if(res<k) {puts("invalid request!");return;}
while(l!=r) {
res=0;int mid=(l+r)>>1;
for(int i=1;i<=cnt1;i++)res-=sum[rs[u1[i]]];
for(int i=1;i<=cnt2;i++)res-=sum[rs[u2[i]]];
for(int i=1;i<=cnt3;i++)res+=sum[rs[u3[i]]];
for(int i=1;i<=cnt4;i++)res+=sum[rs[u4[i]]];
if(res>=k) {
l=mid+1;
for(int i=1;i<=cnt1;i++)u1[i]=rs[u1[i]];
for(int i=1;i<=cnt2;i++)u2[i]=rs[u2[i]];
for(int i=1;i<=cnt3;i++)u3[i]=rs[u3[i]];
for(int i=1;i<=cnt4;i++)u4[i]=rs[u4[i]];
}
else {
r=mid;k-=res;
for(int i=1;i<=cnt1;i++)u1[i]=ls[u1[i]];
for(int i=1;i<=cnt2;i++)u2[i]=ls[u2[i]];
for(int i=1;i<=cnt3;i++)u3[i]=ls[u3[i]];
for(int i=1;i<=cnt4;i++)u4[i]=ls[u4[i]];
}
}
printf("%d\n",tmp[l]);
}
}bit; void dfs(int fa,int u) {
L[u]=++tim,dep[u]=dep[fa]+1,f[u][0]=fa;
bit.change(tim,a[u],1);
for(int i=1;i<18;i++)
f[u][i]=f[f[u][i-1]][i-1];
for(int p=now[u],v=son[p];p;p=pre[p],v=son[p])
if(v!=fa)dfs(u,v);
R[u]=++tim;
bit.change(tim,a[u],-1);
} int lca(int u,int v) {
if(dep[u]<dep[v])swap(u,v);
for(int i=17;~i;i--)
if(dep[f[u][i]]>=dep[v])
u=f[u][i];
if(u==v)return u;
for(int i=17;~i;i--)
if(f[u][i]!=f[v][i])
u=f[u][i],v=f[v][i];
return f[u][0];
} void work() {
for(int i=1;i<=m;i++) {
int u=x[i],v=y[i];
if(opt[i]==0) {
bit.change(L[u],a[u],-1);
bit.change(R[u],a[u],1);
a[u]=v;
bit.change(L[u],a[u],1);
bit.change(R[u],a[u],-1);
}
else {
int tmp1=lca(u,v),tmp2=f[tmp1][0];
bit.query(tmp1,tmp2,u,v,opt[i]);
}
}
} int main() {
init();
dfs(0,1);
work();
return 0;
}

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

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

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

  2. BZOJ1146 [CTSC2008]网络管理Network 树链剖分 主席树 树状数组

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1146 题意概括 在一棵树上,每一个点一个权值. 有两种操作: 1.单点修改 2.询问两点之间的树链 ...

  3. [BZOJ1146][CTSC2008]网络管理Network(二分+树链剖分+线段树套平衡树)

    题意:树上单点修改,询问链上k大值. 思路: 1.DFS序+树状数组套主席树 首先按照套路,关于k大值的问题,肯定要上主席树,每个点维护一棵权值线段树记录它到根的信息. 关于询问,就是Que(u)+Q ...

  4. BZOJ1146——[CTSC2008]网络管理Network

    1.题目大意:就是在动态的树上路径权值第k大. 2.分析:这个就是树链剖分+树套树 #include <cstdio> #include <cstdlib> #include ...

  5. BZOJ1146[CTSC2008]网络管理——出栈入栈序+树状数组套主席树

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

  6. 2019.01.13 bzoj1146: [CTSC2008]网络管理Network(整体二分+树剖)

    传送门 题意简述:给一棵树,支持单点修改,询问路径上两点间第kkk大值. 思路: 读懂题之后立马可以想到序列上带修区间kkk大数的整体二分做法,就是用一个bitbitbit来支持查值. 那么这个题把树 ...

  7. 【树上莫队】【带修莫队】【权值分块】bzoj1146 [CTSC2008]网络管理Network

    #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using ...

  8. 【树链剖分】【函数式权值分块】bzoj1146 [CTSC2008]网络管理Network

    裸题,直接上.复杂度O(n*sqrt(n)*log(n)). //Num[i]表示树中的点i在函数式权值分块中对应的点 //Map[i]表示函数式权值分块中的点i在树中对应的点 #include< ...

  9. 【BZOJ1146】[CTSC2008]网络管理Network 树状数组+DFS序+主席树

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

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

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

随机推荐

  1. Bootstrap学习速查表(一) 理论基础

    参考网站http://www.bootcss.com/ 第一步,起步,引入基本样式 <!-- 新 Bootstrap 核心 CSS 文件 --> <link rel="st ...

  2. iOS自己定义对象保存到本地文件

    我是将聊天记录存到本地,里边用到了自己定义的对象.把数据转成Data格式存到本地.在转Data格式的时候报错了.这时候须要先将自己定义对象进行归档才干够转Data格式. 方法例如以下: 一.在.h文件 ...

  3. RTSP转RTMP-HLS网页无插件视频直播-EasyNVR功能介绍-音频开启

    EasyNVR简介 EasyNVR能够通过简单的摄像机通道配置.存储配置.云平台对接配置.CDN配置等,将统监控行业里面的高清网络摄像机IP Camera.NVR.移动拍摄设备接入到EasyNVR,E ...

  4. HTML5(lufylegend.js练习)

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  5. 九度OJ 1148:Financial Management(财务管理) (平均数)

    与1141题相同. 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:843 解决:502 题目描述: Larry graduated this year and finally has a ...

  6. The connection between feature spaces and smoothness is not obvious, and is one of the things we’ll discuss in the course.

    http://www.gatsby.ucl.ac.uk/~gretton/coursefiles/lecture4_introToRKHS.pdf

  7. 我的Java开发学习之旅------>Java NIO 报java.nio.charset.MalformedInputException: Input length = 1异常

    今天在使用Java NIO的Channel和Buffer进行文件操作时候,报了java.nio.charset.MalformedInputException: Input length = 1异常, ...

  8. Linux C语言 网络编程(二) server模型

    前面介绍了关于连接linux服务端方式,可是服务端的资源是有限的,所以我们通常须要又一次思考,设计一套server模型来处理相应的client的请求. 第一种:并发server.通过主进程统一处理cl ...

  9. android 服务与多线程

    android服务是执行在UI主线程的.一下是代码demo: package com.example.testservice; import android.os.Bundle; import and ...

  10. 【zabbix】微信告警消息模版

    下面给出了一个zabbix微信告警消息的模版, 消息最后加上#号和短横线的设计有两个原因: 1,zabbix的微信告警消息总是被截断,比如最后一个告警时间,如果没有最后一行#号,在微信上看的时候时间不 ...