题目描述:

M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门。为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络。该网络的结构由N个路由器和N-1条高速光缆组成。每个部门都有一个专属的路由器,部门局域网内的所有机器都联向这个路由器,然后再通过这个通信子网与其他部门进行通信联络。该网络结构保证网络中的任意两个路由器之间都存在一条直接或间接路径以进行通信。 高速光缆的数据传输速度非常快,以至于利用光缆传输的延迟时间可以忽略。但是由于路由器老化,在这些路由器上进行数据交换会带来很大的延迟。而两个路由器之间的通信延迟时间则与这两个路由器通信路径上所有路由器中最大的交换延迟时间有关。作为M公司网络部门的一名实习员工,现在要求你编写一个简单的程序来监视公司的网络状况。该程序能够随时更新网络状况的变化信息(路由器数据交换延迟时间的变化),并且根据询问给出两个路由器通信路径上延迟第k大的路由器的延迟时间。【任务】 你的程序从输入文件中读入N个路由器和N-1条光缆的连接信息,每个路由器初始的数据交换延迟时间Ti,以及Q条询问(或状态改变)的信息。并依次处理这Q条询问信息,它们可能是: 1. 由于更新了设备,或者设备出现新的故障,使得某个路由器的数据交换延迟时间发生了变化。 2. 查询某两个路由器a和b之间的路径上延迟第k大的路由器的延迟时间。

输入:

第一行为两个整数N和Q,分别表示路由器总数和询问的总数。第二行有N个整数,第i个数表示编号为i的路由器初始的数据延迟时间Ti。紧接着N-1行,每行包含两个整数x和y。表示有一条光缆连接路由器x和路由器y。紧接着是Q行,每行三个整数k、a、b。如果k=0,则表示路由器a的状态发生了变化,它的数据交换延迟时间由Ta变为b。如果k>0,则表示询问a到b的路径上所经过的所有路由器(包括a和b)中延迟第k大的路由器的延迟时间。注意a可以等于b,此时路径上只有一个路由器。

输出:

对于每一个第二种询问(k>0),输出一行。包含一个整数为相应的延迟时间。如果路径上的路由器不足k个,则输出信息“invalid request!”(全部小写不包含引号,两个单词之间有一个空格)。

样例输入:

5 5
5 1 2 3 4
3 1
2 1
4 3
5 3
2 4 5
0 1 2
2 2 3
2 1 4
3 3 5

样例输出:

3
2
2
invalid request!

题解:

带修改的求树上路径点权第K大。我写这道题的时候傻逼了,第K大求成第K小(居然样例还过了),没离散化被卡内存,然后二分了一下数组规模才过=。=

(这种题如果叫我考场上写肯定写不出来)

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath> #ifdef WIN32
#define LL "%I64d"
#else
#define LL "%lld"
#endif #ifdef CT
#define debug(...) printf(__VA_ARGS__)
#define setfile()
#else
#define debug(...)
#define filename ""
#define setfile() freopen(filename".in","r",stdin);freopen(filename".out","w",stdout);
#endif #define R register
#define getc() (S==T&&(T=(S=B)+fread(B,1,1<<15,stdin),S==T)?EOF:*S++)
#define dmax(_a, _b) ((_a) > (_b) ? (_a) : (_b))
#define dmin(_a, _b) ((_a) < (_b) ? (_a) : (_b))
#define cmax(_a, _b) (_a < (_b) ? _a = (_b) : 0)
#define cmin(_a, _b) (_a > (_b) ? _a = (_b) : 0)
char B[1<<15],*S=B,*T=B;
inline int FastIn()
{
R char ch;R int cnt=0;R bool minus=0;
while (ch=getc(),(ch < '0' || ch > '9') && ch != '-') ;
ch == '-' ?minus=1:cnt=ch-'0';
while (ch=getc(),ch >= '0' && ch <= '9') cnt = cnt * 10 + ch - '0';
return minus?-cnt:cnt;
}
#define maxn 100000
#define maxm 200000
#define maxt 13250000
const int oo = 1e8;
int val[maxn], last[maxn], next[maxm], to[maxm], ecnt, pos[maxn], ncnt, spos[maxn], npos[maxn];
int ln[maxn], rn[maxn], lcan[maxn], flcan[maxn], lcnt, rcnt, lcacnt, flcacnt;
int fa[maxn], depth[maxn], size[maxn], son[maxn], top[maxn];
int root[maxn], tot, ls[maxt], rs[maxt], sum[maxt];
bool vis[maxn];
#define lowbit(_x) ((_x) & -(_x))
#define add_edge(_a, _b) (to[++ecnt] = (_b), next[ecnt] = last[_a], last[_a] = ecnt)
void dfs1(R int x)
{
size[x] = 1; depth[x] = depth[fa[x]] + 1; vis[x] = 1; pos[++ncnt] = x; npos[x] = ncnt;
for (R int i = last[x]; i; i = next[i])
{
R int t = to[i];
if (!vis[t])
{
fa[t] = x;
dfs1(t);
size[x] += size[t];
size[son[x]] < size[t] ? son[x] = t : 0;
}
}
spos[x] = ncnt;
}
void dfs2(R int x)
{
vis[x] = 0;son[fa[x]] == x ? top[x] = top[fa[x]] : top[x] = x;
for (R int i = last[x]; i; i = next[i]) if (vis[to[i]]) dfs2(to[i]);
}
inline int getlca(R int a, R int b)
{
while (top[a]!=top[b])
{
depth[top[a]] < depth[top[b]] ? b = fa[top[b]] : a = fa[top[a]] ;
}
return depth[a] < depth [b] ? a : b ;
}
int Insert (R int nw, R int l, R int r, R int x, R int c)
{
if(!nw) nw = ++tot;
R int mid = (l + r) >> 1;
sum[nw] += c;
if (l == r) return nw;
if (x > mid)
{
rs[nw] = Insert(rs[nw], mid + 1, r, x, c);
}
else
{
ls[nw] = Insert(ls[nw], l, mid, x, c);
}
return nw;
}
inline int Query(R int k)
{
R int l = 0, r = oo;
while (l < r)
{
R int mid = l + r >> 1, count = 0;
for (R int i = 1; i <= lcnt; ++i)
count += sum[rs[ln[i]]];
for (R int i = 1; i <= rcnt; ++i)
count += sum[rs[rn[i]]];
for (R int i = 1; i <= lcacnt; ++i)
count -= sum[rs[lcan[i]]];
for (R int i = 1; i <= flcacnt; ++i)
count -= sum[rs[flcan[i]]];
if (count >= k)
{
for (R int i = 1; i <= lcnt; ++i)
ln[i] = rs[ln[i]];
for (R int i = 1; i <= rcnt; ++i)
rn[i] = rs[rn[i]];
for (R int i = 1; i <= lcacnt; ++i)
lcan[i] = rs[lcan[i]];
for (R int i = 1; i <= flcacnt; ++i)
flcan[i] = rs[flcan[i]];
l = mid + 1;
}
else
{
for (R int i = 1; i <= lcnt; ++i)
ln[i] = ls[ln[i]];
for (R int i = 1; i <= rcnt; ++i)
rn[i] = ls[rn[i]];
for (R int i = 1; i <= lcacnt; ++i)
lcan[i] = ls[lcan[i]];
for (R int i = 1; i <= flcacnt; ++i)
flcan[i] = ls[flcan[i]];
r = mid ;
k -= count;
}
}
return l;
}
int main()
{
//setfile();
R int n = FastIn(), q = FastIn();
for (R int i = 1; i <= n; ++i) val[i] = FastIn();
for (R int i = 1; i < n; ++i)
{
R int a = FastIn(), b = FastIn();
add_edge(a, b);add_edge(b, a);
}
dfs1(1);
dfs2(1);
for (R int i = 1; i <= n; ++i)
{
R int x = pos[i];
for (R int j = i; j <= n; j += lowbit(j))
root[j] = Insert(root[j], 0, oo, val[x], 1) ;
for (R int j = spos[x] + 1; j <= n; j += lowbit(j))
root[j] = Insert(root[j], 0, oo, val[x], -1) ;
}
for (; q; --q )
{
R int k = FastIn(), a = FastIn(), b = FastIn() ;
if (k)
{
R int lca = getlca(a, b), flca = fa[lca], s = 0;
lcnt = rcnt = lcacnt = flcacnt = 0;
s = depth[a] + depth[b] - depth[flca] - depth[lca];
if (s < k) puts("invalid request!");
else
{
for (R int i = npos[a]; i; i -= lowbit(i))
ln[++lcnt] = root[i];
for (R int i = npos[b]; i; i -= lowbit(i))
rn[++rcnt] = root[i];
for (R int i = npos[lca]; i; i -= lowbit(i))
lcan[++lcacnt] = root[i];
for (R int i = npos[flca]; i; i -= lowbit(i))
flcan[++flcacnt] = root[i];
printf("%d\n",Query(k) );
}
}
else
{
R int x = npos[a], sx = spos[a];
for (R int i = x; i <= n; i += lowbit(i))
root[i] = Insert(root[i], 0, oo, val[a], -1 );
for (R int i = sx + 1; i <= n; i += lowbit(i))
root[i] = Insert(root[i], 0, oo, val[a], 1 );
val[a] = b;
for (R int i = x; i <= n; i += lowbit(i))
root[i] = Insert(root[i], 0, oo, b, 1);
for (R int i = sx + 1; i <= n; i += lowbit(i))
root[i] = Insert(root[i], 0, oo, b, -1);
}
}
return 0;
}

【bzoj1146】[CTSC2008]网络管理Network的更多相关文章

  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. 2019.01.13 bzoj1146: [CTSC2008]网络管理Network(整体二分+树剖)

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

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

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

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

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

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

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

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

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

  10. 【BZOJ-1146】网络管理Network DFS序 + 带修主席树

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

随机推荐

  1. JS事件绑定的两种形式

    第一种: obj.on*=function(){} var btn=document.getElementById('myBtn'); btn.onclick=function(){ alert(1) ...

  2. oracle跟SQL Server 2005 的区别

    Oracle与Sql server的区别   一直搞不明白Oracle数据库和sql server的区别,今天我特意查资料把他们的区别整理出来 Oracle数据库:Oracle Database,又名 ...

  3. 多條件查詢SQL語句

    表结构如下: –1.学生表 Student(s_id,s_name,s_birth,s_sex) –学生编号,学生姓名, 出生年月,学生性别 –2.课程表 Course(c_id,c_name,t_i ...

  4. Redis持久化存储与主从复制

    4. redis持久化 Redis是一种内存型数据库,一旦服务器进程退出,数据库的数据就会丢失,为了解决这个问题,Redis提供了两种持久化的方案,将内存中的数据保存到磁盘中,避免数据的丢失. 4.1 ...

  5. P2505 [HAOI2012]道路

    传送门 统计每条边被最短路经过几次,点数不大,考虑计算以每个点为起点时对其他边的贡献 对于某个点 $S$ 为起点的贡献,首先跑一遍最短路,建出最短路的 $DAG$ 考虑 $DAG$ 上的某条边被以 $ ...

  6. 【论文解读】[目标检测]retinanet

    作为单阶段网络,retinanet兼具速度和精度(精度是没问题,速度我持疑问),是非常耐用的一个检测器,现在很多单阶段检测器也是以retinanet为baseline,进行各种改进,足见retinan ...

  7. Redis中的事务及乐观锁的实现

    介绍 Redis中的事务(transaction)是一组命令的集合.     事务同命令一样都是Redis最小的执行单位,一个事务中的命令要么都执行,要么都不执行.     Redis事务的实现需要用 ...

  8. 2014-04-27 南江滨大道 6KM 晴

    33分41秒,6.03公里,慢速跑,中间有停了几次拍照 天气不错,多云 人,不多 不知道这货叫啥 2个大人3个小孩,跳绳,小时候的回忆,啊哈 老中少三代,捡风筝也是一种幸福 一家三口,江滨散步,惬意至 ...

  9. 对Xcode菜单选项的详细探索(来自董铂然的微博http://www.cnblogs.com/dsxniubility/p/4983614.html)

    本文调研Xcode的版本是 7.1,基本是探索了菜单的每一个按钮.虽然从xcode4一直用到了xcode7,但是一般都只是用了一些基础的功能,说来也惭愧.在一次偶然的机遇突然发现了“显示调用层级”的选 ...

  10. CentOS7.6下设置mysql服务开机启动

    在centos7中所有对服务的管理都集中到了systemctl当中,所以服务的启动.关闭.重启.开机启动等等的操作都可以用systemctl. systemctl对服务的管理都是通过配置文件,配置文件 ...