[CTSC2008]网络管理Network
题意
M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门。为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络。该网络的结构由N个路由器和N-1条高速光缆组成。每个部门都有一个专属的路由器,部门局域网内的所有机器都联向这个路由器,然后再通过这个通信子网与其他部门进行通信联络。该网络结构保证网络中的任意两个路由器之间都存在一条直接或间接路径以进行通信。 高速光缆的数据传输速度非常快,以至于利用光缆传输的延迟时间可以忽略。但是由于路由器老化,在这些路由器上进行数据交换会带来很大的延迟。而两个路由器之间的通信延迟时间则与这两个路由器通信路径上所有路由器中最大的交换延迟时间有关。作为M公司网络部门的一名实习员工,现在要求你编写一个简单的程序来监视公司的网络状况。该程序能够随时更新网络状况的变化信息(路由器数据交换延迟时间的变化),并且根据询问给出两个路由器通信路径上延迟第k大的路由器的延迟时间。
【任务】 你的程序从输入文件中读入N个路由器和N-1条光缆的连接信息,每个路由器初始的数据交换延迟时间Ti,以及Q条询问(或状态改变)的信息。并依次处理这Q条询问信息,它们可能是:
- 由于更新了设备,或者设备出现新的故障,使得某个路由器的数据交换延迟时间发生了变化。
- 查询某两个路由器a和b之间的路径上延迟第k大的路由器的延迟时间。
N,Q<=80000
分析
一道很裸的题。
树上差分+树状数组套权值线段树,时空复杂度\(O(N \log^2 N + Q \log^2 N)\)。
细节又多又烦,写一下,调一年,入坑不花一分钱,等你来玩哦!
之前一直不知道这个继承怎么写,原来不是写继承,而是直接考虑对子树的贡献,维护前缀和加到dfs序上,查询的时候差分一下。
代码
#include<bits/stdc++.h>
#define rg register
#define il inline
#define co const
#define lowbit(x) (x&-x)
template<class T>il T read(){
rg T data=0,w=1;
rg char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') w=-1;
ch=getchar();
}
while(isdigit(ch))
data=data*10+ch-'0',ch=getchar();
return data*w;
}
template<class T>il T read(rg T&x){
return x=read<T>();
}
typedef long long ll;
co int N=8e4+1,LG=120; // log_2(1e8)->30
int n,q;
std::vector<int>vs;
// Tree Tao Tree
namespace T{
// Interval Tree
int L[N*LG],R[N*LG],sum[N*LG];
int tot,root[N];
void change(int&x,int l,int r,int p,int d){
if(!x) x=++tot;
sum[x]+=d;
if(l==r) return;
int m=(l+r)/2;
if(p<=m) change(L[x],l,m,p,d);
else change(R[x],m+1,r,p,d);
}
int query(std::vector<int>&x,int l,int r,int k){
if(l==r) return l;
int s=0;
for(int i=0;i<x.size();++i)
x[i]<0?s-=sum[R[-x[i]]]:s+=sum[R[x[i]]];
int m=(l+r)/2;
if(s>=k){
for(int i=0;i<x.size();++i)
x[i]=x[i]<0?-R[-x[i]]:R[x[i]];
return query(x,m+1,r,k);
}
else{
for(int i=0;i<x.size();++i)
x[i]=x[i]<0?-L[-x[i]]:L[x[i]];
return query(x,l,m,k-s);
}
}
// Binary Index Tree
void change(int x,int p,int d){
for(int i=x;i<=n;i+=lowbit(i))
change(root[i],1,vs.size(),p,d);
}
}
int t[N];
std::vector<int>g[N];
int fa[N],dep[N],siz[N],son[N],pos[N],dfn,top[N];
void dfs1(int x,int fa){
::fa[x]=fa,dep[x]=dep[fa]+1,siz[x]=1;
for(int i=0;i<g[x].size();++i){
int y=g[x][i];
if(y==fa) continue;
dfs1(y,x);
siz[x]+=siz[y];
if(siz[y]>siz[son[x]]) son[x]=y;
}
}
void dfs2(int x,int top){
pos[x]=++dfn,::top[x]=top;
if(!son[x]) return;
dfs2(son[x],top);
for(int i=0;i<g[x].size();++i){
int y=g[x][i];
if(y==son[x]||y==fa[x]) continue;
dfs2(y,y);
}
}
int lca(int x,int y){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) std::swap(x,y);
x=fa[top[x]];
}
return dep[x]<dep[y]?x:y;
}
void change(int x,int v){
T::change(pos[x],t[x],-1);
T::change(pos[x]+siz[x],t[x],1);
t[x]=v;
T::change(pos[x],v,1);
T::change(pos[x]+siz[x],v,-1);
}
void query(int x,int y,int k){
int f=lca(x,y);
if(dep[x]-dep[f]+dep[y]-dep[f]+1<k){
puts("invalid request!");
return;
}
std::vector<int> roots;
for(int i=pos[x];i;i-=lowbit(i))
roots.push_back(T::root[i]); // edit 2: root
for(int i=pos[y];i;i-=lowbit(i))
roots.push_back(T::root[i]);
for(int i=pos[f];i;i-=lowbit(i))
roots.push_back(-T::root[i]);
for(int i=pos[fa[f]];i;i-=lowbit(i))
roots.push_back(-T::root[i]);
printf("%d\n",vs[T::query(roots,1,vs.size(),k)-1]); // edit 3: back
}
struct quiz{
int k,a,b;
}Q[N];
int main(){
// freopen("BZOJ1146.in","r",stdin);
// freopen(".out","w",stdout);
read(n),read(q);
for(int i=1;i<=n;++i)
vs.push_back(read(t[i]));
for(int i=1;i<n;++i){
int x=read<int>(),y=read<int>();
g[x].push_back(y),g[y].push_back(x);
}
for(int i=1;i<=q;++i){
read(Q[i].k),read(Q[i].a),read(Q[i].b);
if(!Q[i].k) vs.push_back(Q[i].b);
}
sort(vs.begin(),vs.end()),vs.erase(unique(vs.begin(),vs.end()),vs.end());
for(int i=1;i<=n;++i)
t[i]=lower_bound(vs.begin(),vs.end(),t[i])-vs.begin()+1; // edit 1: +1
for(int i=1;i<=q;++i)if(!Q[i].k)
Q[i].b=lower_bound(vs.begin(),vs.end(),Q[i].b)-vs.begin()+1;
dfs1(1,0),dfs2(1,1);
for(int i=1;i<=n;++i){
T::change(pos[i],t[i],1);
T::change(pos[i]+siz[i],t[i],-1);
}
for(int i=1;i<=q;++i){
if(!Q[i].k) change(Q[i].a,Q[i].b);
else query(Q[i].a,Q[i].b,Q[i].k);
}
return 0;
}
[CTSC2008]网络管理Network的更多相关文章
- BZOJ 1146: [CTSC2008]网络管理Network [树上带修改主席树]
1146: [CTSC2008]网络管理Network Time Limit: 50 Sec Memory Limit: 162 MBSubmit: 3522 Solved: 1041[Submi ...
- [BZOJ1146][CTSC2008]网络管理Network
[BZOJ1146][CTSC2008]网络管理Network 试题描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个 部门之间协同工作,公司搭建 ...
- BZOJ 1146: [CTSC2008]网络管理Network 树链剖分+线段树+平衡树
1146: [CTSC2008]网络管理Network Time Limit: 50 Sec Memory Limit: 162 MBSubmit: 870 Solved: 299[Submit] ...
- BZOJ 1146: [CTSC2008]网络管理Network( 树链剖分 + 树状数组套主席树 )
树链剖分完就成了一道主席树裸题了, 每次树链剖分找出相应区间然后用BIT+(可持久化)权值线段树就可以完成计数. 但是空间问题很严重....在修改时不必要的就不要新建, 直接修改原来的..详见代码. ...
- Luogu4175:[CTSC2008]网络管理Network
题面 Luogu4175:[CTSC2008]网络管理Network Sol 路径第\(k\)大 无解直接判断就好了 然后整体二分,加上树链剖分+树状数组统计 # include <bits/s ...
- 【BZOJ1146】[CTSC2008]网络管理Network 树状数组+DFS序+主席树
[BZOJ1146][CTSC2008]网络管理Network Description M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工 ...
- bzoj 1146 [CTSC2008]网络管理Network
很久之前写过 count on the tree. 然后一直不懂树状数组是怎么套上这个主席树的. 看了两小时发现它套的就是个权值线段树, 看不出来可持久化在哪里. 因为动态开点所以空间nlog2n. ...
- BZOJ1146——[CTSC2008]网络管理Network
1.题目大意:就是在动态的树上路径权值第k大. 2.分析:这个就是树链剖分+树套树 #include <cstdio> #include <cstdlib> #include ...
- 【BZOJ】1146: [CTSC2008]网络管理Network(树链剖分+线段树套平衡树+二分 / dfs序+树状数组+主席树)
http://www.lydsy.com/JudgeOnline/problem.php?id=1146 第一种做法(时间太感人): 第二种做法(rank5,好开心) ================ ...
- [Luogu4175][CTSC2008]网络管理Network
又是权限题qwq 一句话题意:带修改树上路径第k大 sol 数据结构?还是再见吧.学一手合格的整体二分,只有思维强大,才能见题拆题. 如果你做过整体二分的动态区间第k大就会发现这是一样的题. 无非是区 ...
随机推荐
- 利用Python进行数据分析 第7章 数据清洗和准备(1)
学习时间:2019/10/25 周五晚上22点半开始. 学习目标:Page188-Page217,共30页,目标6天学完,每天5页,预期1029学完. 实际反馈:集中学习1.5小时,学习6页:集中学习 ...
- Python--列表中字符串按照某种规则排序的方法
作者:禅在心中 出处:http://www.cnblogs.com/pinking/ 本文版权归作者和博客园共有,欢迎批评指正及转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接, ...
- SPI时序
1.串行外围接口 高速.全双工的同步通信总线 一主多从 一般速度几十MHZ,最高可以工作在上百MHZ 2.连接图 3.工作模式
- BZOJ4400 TJOI2012桥(最短路+线段树)
首先找出任意一条1-n的最短路径.显然删除的边只有在该最短路上才会对最短路长度产生影响. 不会证明地给出一个找不到反例的结论:删除一条边后,新图中一定有一条1-n的最短路径上存在一条边x->y, ...
- IDEA使用技巧--将本地项目和git远程项目关联
之前开发没有从头儿搭建过新项目,都是从IDEA配置下项目的git地址,pull代码之后进行开发,提交.这次需要将本地新建的项目push到在git上同样是新建的空项目上去(git上的项目只有工程名和re ...
- VS2015功能介绍
1.New Web Site新网站 Recent 系统文件夹,里面存放最近使用的文档的快捷方式,以便再次访问(可删除) Installed 安装 Templates 样板,模板 Online 联网 . ...
- 2..net core 和.net framework 版本
同一台机器上可以安装多个版本的.net core runtime.比如: 每个.net core项目都可以指定自己所用的版本,所以改变某个项目的target version不会影响到其他的.安装新的r ...
- springboot下@webfilter的使用
启动类加了@ServletComponentScan,无论过滤器类加不加@Componment urlPatterns = {"/test/*"}都可以生效 单使用@Compone ...
- Windows下编译 Hadoop
Windows下编译 Hadoop-2.9.2 系统环境 系统: Windows 10 10.0_x64 maven: Apache Maven 3.6.0 jdk: jdk_1.8.0_201 Pr ...
- Java 之 ObjectInputStream 类
ObjectInputStream 类 1.概述 java.io.ObjectInputStream extends InputStream ObjectInputStream 反序列化流,将之前使用 ...