[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大就会发现这是一样的题. 无非是区 ...
随机推荐
- lua . 命令收集
io.popen()## 原型:io.popen ([prog [, mode]]) 解释:在额外的进程中启动程序prog,并返回用于prog的文件句柄.通俗的来说就是使用这个函数可以调用一个命令(程 ...
- 服务注册与发现—Eureka
一:Eureka简介 Eureka的意思是(因找到某物,尤指问题的答案而高兴) 我发现了,我找到了,作为一个服务注册和发现中心的名字确实很贴切啊. Eureka包含两个组件,Eureka Server ...
- MySQL基础操作(一)
MySQL操作 一.创建数据库 # utf CREATE DATABASE 数据库名称 DEFAULT CHARSET utf8 COLLATE utf8_general_ci; # gbk CREA ...
- Python17之函数、类、模块、包、库
一.函数 一个拥有名称.参数和返回值的代码块. 需要主动调用,否则不会执行,可以通过参数和返回值与其它程序进行交互 二.类 用来描述具有相同的属性和方法的对象集合.它定义了该集合中每个对象所共有的属性 ...
- Python【变量和赋值】
name = '千变万化' #把“千变万化”赋值给了“name”这个[变量] >>> name = '一'>>> name = '二'>>> pr ...
- Python进阶:metaclass谈
metaclass 的超越变形特性有什么用? 来看yaml的实例: import yaml class Monster(yaml.YAMLObject): yaml_tag = u'!Monster' ...
- WUSTOJ 1339: 土豪fcbruce(Java)
题目链接:1339: 土豪fcbruce Description 10年后,就职于Google的fcbruce赞助了武汉科技大学好多钱,学校因此决定扩建.第一步是新建宿舍楼,为了整洁美观,fcbruc ...
- WUSTOJ 1324: Base64 Coding(Java)未解决,求题解
题目链接:1324: Base64 Coding 资料:ASCII码表 原文是英文,而且篇幅较长.因此下面不粘贴原文,只写中文大意. Description Base64是一种编码算法.它的工作原理是 ...
- IIS不能下载config配置文件的解决方法
之前作程序升级的时候,需要从服务端下载后缀为config的配置文件,结果程序抛出404异常.后来百度才知道,是IIS禁止下载config文件的原因.在这里记录一下解决方法. 在我的电脑,右键管理,打开 ...
- ubuntu配置fastdfs+Nginx
全程参考主线来自:https://blog.csdn.net/xiaoxie762457/article/details/80690841(文中图片失效不造成影响) Nginx安装主要参考:https ...