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,好开心) ================ ...
随机推荐
- Java基础点滴
1. 关于interface的定义 [修饰符] interface 接口名 [extends 父接口名列表]{ [public] [static] [final] 常量;[public] [abstr ...
- PHP中cookies跨目录无法调用解决办法
localhost/a/test.php 中写入: <?php setcookie("user","zhangsan",time()+3600); ?&g ...
- Nginx:413 Request Entity Too Large解决
最近在做给博客添加上传PDF的功能,但是在测试上传文件的过程中遇到了413 Request Entity Too Large错误.不过这个无错误是很好解决的,这个错误的出现是因为上传的文件大小超过了N ...
- 提高SQL查询效率
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- [SCOI2009][bzoj1025]游戏
[SCOI2009][bzoj1025]游戏 标签: DP 置换 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1025 题解 很套路的题目 ...
- [Uva10294]Arif in Dhaka
[Uva10294]Arif in Dhaka 标签: 置换 Burnside引理 题目链接 题意 有很多个珠子穿成环形首饰,手镯可以翻转和旋转,项链只能旋转.(翻转过的手镯相同,而项链不同) 有n个 ...
- 【JavaWeb】客户关系管理系统
前言 为了巩固开发的流程,我们再拿一个客户关系管理系统来练手...! 成果图 我们完成的就是下面的项目! 搭建配置环境 配置Tomcat 导入开发包 建立开发用到的程序包 在数据库创建相对应的表 CR ...
- CSS预处理器之Less详解
本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. CSS 预处理器 为什么要有 CSS 预处理器 CSS基本上是设计师的工 ...
- 进入Docker容器
在进入Docker容器之前,首先要运行对应的Docker容器,先使用命令docker ps查看正在运行的容器. docker inspect --format='{{.NetworkSettings. ...
- java字符串以及字符类型基础
介绍一下java字符集和字符的编码方式, 首先要区分一下字符集和字符编码.所谓的字符集 类似于unicode,GB2312,GBK,ASCII等等.因为一开始只有26个英文字母需要 编一下号.所有用下 ...