Luogu4175:[CTSC2008]网络管理Network
题面
Luogu4175:[CTSC2008]网络管理Network
Sol
路径第\(k\)大
无解直接判断就好了
然后整体二分,加上树链剖分+树状数组统计
# include <bits/stdc++.h>
# define RG register
# define IL inline
# define Fill(a, b) memset(a, b, sizeof(a))
using namespace std;
typedef long long ll;
const int _(2e5 + 5);
IL ll Input(){
RG ll x = 0, z = 1; RG char c = getchar();
for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;
for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
return x * z;
}
int size[_], fa[_], deep[_], top[_], son[_], dfn[_], Index;
int fst[_], nxt[_], to[_], cnt, n, c[_];
IL void Modify(RG int x, RG int v){
for(; x <= n; x += x & -x) c[x] += v;
}
IL int Query(RG int x){
RG int ret = 0;
for(; x; x -= x & -x) ret += c[x];
return ret;
}
IL void Add(RG int u, RG int v){
nxt[cnt] = fst[u]; to[cnt] = v; fst[u] = cnt++;
}
IL void Dfs1(RG int u){
size[u] = 1;
for(RG int e = fst[u]; e != -1; e = nxt[e]){
if(size[to[e]]) continue;
fa[to[e]] = u; deep[to[e]] = deep[u] + 1;
Dfs1(to[e]);
size[u] += size[to[e]];
if(size[to[e]] > size[son[u]]) son[u] = to[e];
}
}
IL void Dfs2(RG int u, RG int Top){
dfn[u] = ++Index; top[u] = Top;
if(son[u]) Dfs2(son[u], Top);
for(RG int e = fst[u]; e != -1; e = nxt[e])
if(!dfn[to[e]]) Dfs2(to[e], to[e]);
}
IL int LCA(RG int u, RG int v){
while(top[u] ^ top[v]){
if(deep[top[u]] > deep[top[v]]) swap(u, v);
v = fa[top[v]];
}
return deep[u] > deep[v] ? v : u;
}
IL int Calc(RG int u, RG int v){
RG int ret = 0;
while(top[u] ^ top[v]){
if(deep[top[u]] > deep[top[v]]) swap(u, v);
ret += Query(dfn[v]) - Query(dfn[top[v]] - 1);
v = fa[top[v]];
}
if(deep[u] > deep[v]) swap(u, v);
ret += Query(dfn[v]) - Query(dfn[u] - 1);
return ret;
}
int m, tot, ans[_], Q, val[_];
struct Data{
int id, x, y, k, op;
} q[_], q1[_], q2[_];
IL void Solve(RG int l, RG int r, RG int L, RG int R){
if(L > R) return;
if(l == r){
for(RG int i = L; i <= R; ++i)
if(q[i].id && ans[q[i].id] != -1) ans[q[i].id] = l;
return;
}
RG int mid = (l + r) >> 1, t1 = 0, t2 = 0;
for(RG int i = L; i <= R; ++i)
if(q[i].id){
RG int s = Calc(q[i].x, q[i].y);
if(s >= q[i].k) q2[++t2] = q[i];
else q[i].k -= s, q1[++t1] = q[i];
}
else{
if(q[i].y > mid) q2[++t2] = q[i], Modify(dfn[q[i].x], q[i].op);
else q1[++t1] = q[i];
}
for(RG int i = L; i <= R; ++i)
if(!q[i].id && q[i].y > mid) Modify(dfn[q[i].x], -q[i].op);
for(RG int i = L, j = 1; j <= t1; ++i, ++j) q[i] = q1[j];
for(RG int i = L + t1, j = 1; j <= t2; ++i, ++j) q[i] = q2[j];
Solve(l, mid, L, L + t1 - 1); Solve(mid + 1, r, L + t1, R);
}
int main(RG int argc, RG char* argv[]){
tot = n = Input(); m = Input(); RG int mx = 0;
for(RG int i = 1; i <= n; ++i){
q[i].x = i, q[i].y = val[i] = Input(), q[i].op = 1;
fst[i] = -1; mx = max(mx, val[i]);
}
for(RG int i = 1, x, y; i < n; ++i)
x = Input(), y = Input(), Add(x, y), Add(y, x);
Dfs1(1); Dfs2(1, 1);
for(RG int i = 1; i <= m; ++i){
RG int tk = Input(), tx = Input(), ty = Input();
if(tk){
RG int lca = LCA(tx, ty); ++Q;
RG int len = deep[tx] + deep[ty] - 2 * deep[lca] + 1;
if(tk > len) ans[Q] = -1;
q[++tot] = (Data){Q, tx, ty, tk, 0};
}
else{
q[++tot] = (Data){0, tx, val[tx], 0, -1};
q[++tot] = (Data){0, tx, val[tx] = ty, 0, 1};
mx = max(mx, ty);
}
}
Solve(0, mx, 1, tot);
for(RG int i = 1; i <= Q; ++i)
if(ans[i] == -1) puts("invalid request!");
else printf("%d\n", ans[i]);
return 0;
}
Luogu4175:[CTSC2008]网络管理Network的更多相关文章
- [Luogu4175][CTSC2008]网络管理Network
又是权限题qwq 一句话题意:带修改树上路径第k大 sol 数据结构?还是再见吧.学一手合格的整体二分,只有思维强大,才能见题拆题. 如果你做过整体二分的动态区间第k大就会发现这是一样的题. 无非是区 ...
- 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+(可持久化)权值线段树就可以完成计数. 但是空间问题很严重....在修改时不必要的就不要新建, 直接修改原来的..详见代码. ...
- 【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,好开心) ================ ...
随机推荐
- JavaScript 中的对象深度复制(Object Deep Clone)
JavaScript中并没有直接提供对象复制(Object Clone)的方法. JavaScript中的赋值,其实并不是复制对象,而是类似`c/c++`中的引用(或指针),因此下面的代码中改变对象b ...
- 为何要部署IPV6
·IPv4的局限性: 1.地址空间的局限性:IP地址空间的危机由来已久,并正是升级到IPv6的主要动力. 2.安全性:IPv4在网络层没有安全性可言,安全性一直被认为是由网络层以上的层负责. ...
- css命名整理
.container { width: 720px; background: #fafafa; border: 2px dashed #999; padding: 10px; float: left ...
- [记录]Shell中的getopts和getopt用法
Shell中的getopts和getopt用法 1.getopts getopts(shell内置命令)不能直接处理长的选项(如:--prefix=/home等),getopts有两个参数,第一个参数 ...
- Oracle数据库中SCOTT用户下的默认表
①EMP(雇员表): ②DEPT(部门表): ③BONUS(奖金表): ④SALGRADE(工资等级表):
- python实现三级菜单
一.要求: 1.一开始打印出所有省份和提示 2.用户输入省份以此查询城市 3.在按照输出的城市名提示用户输入,最后输出用户所查询的区县名 4.随时输入"back"可以返回上一级菜单 ...
- 用Composer获取第三方资源总是失败咋办?
凉拌!!! 不不不,哥可是一个有追求的人,没那么容易放弃的! 所以我选择用中国全量镜像,https://pkg.phpcomposer.com/ 使用方法: 对,就是命令行方法,我最喜欢的方法!!! ...
- 高通ASOC中的codec驱动
ASOC的出现是为了让codec独立于CPU,减少和CPU之间的耦合,这样同一个codec驱动就无需修改就可以匹配任何一款平台. 在Machine中已经知道,snd_soc_dai_link结构就指明 ...
- LRU最近最少使用算法
最近最少使用算法有两种实现方式: (1)记时法:对于每一页增设一个访问时间计时器.每当一个页面被访问时,当时的绝对时钟内容被复制到对应的访问时间计时器中.这样系统就记录了内存中所有页面最后一次被访问的 ...
- 《python机器学习—预测分析核心算法》笔记1
参见原书 1.1-1.4节 一.惩罚线性回归模型 基本特性: 1.训练时间快,使用训练好的模型进行预测的时间也快2.应用于高速交易.互联网广告的植入等3.解决回归.分类问题 最重要的特性:能明确指出, ...