【LG4175】[CTSC2008]网络管理
【LG4175】[CTSC2008]网络管理
题面
题解
感觉就和普通的整体二分差不太多啊。。。
树上修改就按时间添加,用树状数组维护一下即可
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
namespace IO {
const int BUFSIZE = 1 << 20;
char ibuf[BUFSIZE], *is = ibuf, *it = ibuf;
inline char gc() {
if (is == it) it = (is = ibuf) + fread(ibuf, 1, BUFSIZE, stdin);
return *is++;
}
}
inline int gi() {
register int data = 0, w = 1;
register char ch = 0;
while (!isdigit(ch) && ch != '-') ch = IO::gc();
if (ch == '-') w = -1, ch = IO::gc();
while (isdigit(ch)) data = 10 * data + ch - '0', ch = IO::gc();
return w * data;
}
const int MAX_N = 80005;
struct Node { int u, v, k, id; } q[MAX_N << 1], lq[MAX_N << 1], rq[MAX_N << 1];
int N, Q, a[MAX_N], cnt, ans[MAX_N];
struct Graph { int to, next; } e[MAX_N << 1]; int fir[MAX_N], e_cnt;
void clearGraph() { memset(fir, -1, sizeof(fir)); e_cnt = 0; }
void Add_Edge(int u, int v) { e[e_cnt] = (Graph){v, fir[u]}; fir[u] = e_cnt++; }
int dep[MAX_N], fa[MAX_N], top[MAX_N], size[MAX_N], son[MAX_N], L[MAX_N], tim;
void dfs1(int x) {
dep[x] = dep[fa[x]] + 1; size[x] = 1;
for (int i = fir[x]; ~i; i = e[i].next) {
int v = e[i].to; if (v == fa[x]) continue;
fa[v] = x; dfs1(v);
size[x] += size[v];
if (size[v] > size[son[x]]) son[x] = v;
}
}
void dfs2(int x, int tp) {
top[x] = tp, L[x] = ++tim;
if (son[x]) dfs2(son[x], tp);
for (int i = fir[x]; ~i; i = e[i].next) {
int v = e[i].to;
if (v == son[x] || v == fa[x]) continue;
dfs2(v, v);
}
}
int c[MAX_N];
inline int lb(int x) { return x & -x; }
void Add(int x, int v) { while (x <= N) c[x] += v, x += lb(x); }
int sum(int x) { int res = 0; while (x > 0) res += c[x], x -= lb(x); return res; }
int Sum(int u, int v) {
int res = 0;
while (top[u] != top[v]) {
if (dep[top[u]] < dep[top[v]]) swap(u, v);
res += sum(L[u]) - sum(L[top[u]] - 1);
u = fa[top[u]];
}
if (dep[u] < dep[v]) swap(u, v);
return res + sum(L[u]) - sum(L[v] - 1);
}
void Div(int lval, int rval, int st, int ed) {
if (st > ed) return ;
if (lval == rval) {
for (int i = st; i <= ed; i++) if (q[i].id) ans[q[i].id] = lval;
return ;
}
int mid = (lval + rval) >> 1, lt = 0, rt = 0;
for (int i = st; i <= ed; i++) {
if (q[i].id == 0) {
if (q[i].k > 0 && q[i].k > mid) Add(L[q[i].u], 1), rq[++rt] = q[i];
else if (q[i].k < 0 && -q[i].k > mid) Add(L[q[i].u], -1), rq[++rt] = q[i];
else lq[++lt] = q[i];
} else {
int res = Sum(q[i].u, q[i].v);
if (res < q[i].k) q[i].k -= res, lq[++lt] = q[i];
else rq[++rt] = q[i];
}
}
for (int i = st; i <= ed; i++)
if (q[i].id == 0) {
if (q[i].k > 0 && q[i].k > mid) Add(L[q[i].u], -1);
else if (q[i].k < 0 && -q[i].k > mid) Add(L[q[i].u], 1);
}
for (int i = 1; i <= lt; i++) q[st + i - 1] = lq[i];
for (int i = 1; i <= rt; i++) q[st + lt + i - 1] = rq[i];
Div(lval, mid, st, st + lt - 1);
Div(mid + 1, rval, st + lt, ed);
}
int main () {
clearGraph();
N = gi(), Q = gi();
fill(&ans[1], &ans[N + 1], 1e9);
for (cnt = 1; cnt <= N; cnt++) q[cnt] = (Node){cnt, cnt, a[cnt] = gi(), 0};
for (int i = 1; i < N; i++) {
int u = gi(), v = gi();
Add_Edge(u, v), Add_Edge(v, u);
}
int q_cnt = 0;
for (int i = 1; i <= N; i++) Add(i, 1);
dfs1(1); dfs2(1, 1);
while (Q--) {
int k = gi(), u = gi(), v = gi();
if (k == 0) {
q[++cnt] = (Node){u, u, -a[u], 0};
q[++cnt] = (Node){u, u, a[u] = v, 0};
} else {
q_cnt++;
if (Sum(u, v) < k) continue;
q[++cnt] = (Node){u, v, k, q_cnt};
}
}
for (int i = 1; i <= N; i++) Add(i, -1);
Div(1, 1e8, 1, cnt);
for (int i = 1; i <= q_cnt; i++) (ans[i] != 1e9) ? printf("%d\n", ans[i]) : puts("invalid request!");
return 0;
}
【LG4175】[CTSC2008]网络管理的更多相关文章
- 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 ...
- BZOJ_1146_[CTSC2008]网络管理Network_主席树+树状数组
BZOJ_1146_[CTSC2008]网络管理Network_主席树 Description M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个 部门 ...
- 洛谷 P4175 [CTSC2008]网络管理 解题报告
P4175 [CTSC2008]网络管理 题目描述 带修改树上链的第\(k\)大 输入输出格式 输入格式: 第一行为两个整数\(N\)和\(Q\),分别表示路由器总数和询问的总数. 第二行有\(N\) ...
- 【BZOJ1146】[CTSC2008]网络管理Network 树状数组+DFS序+主席树
[BZOJ1146][CTSC2008]网络管理Network Description M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工 ...
- 洛谷P4175 - [CTSC2008]网络管理
Portal Description 给出一棵\(n(n\leq8\times10^4)\)个点的带点权的树,进行\(m(m\leq8\times10^4)\)次操作,操作有两种: 修改一个点的点权. ...
随机推荐
- bzoj 2111: [ZJOI2010]Perm 排列计数 (dp+卢卡斯定理)
bzoj 2111: [ZJOI2010]Perm 排列计数 1 ≤ N ≤ 10^6, P≤ 10^9 题意:求1~N的排列有多少种小根堆 1: #include<cstdio> 2: ...
- 在Go语言中记录log:seelog包
前两周调bug调的吐血,虽然解决了但是还是挺浪费时间的.跟同事聊了聊,觉得我们现在项目中的日志记录太少了,导致出了问题不知道怎么下手,还得自己改代码记录日志,然后排查问题.这样如果将来还有bug的话还 ...
- JavaScript 初学备忘录
JavaScript 是脚本语言 JavaScript 是一种轻量级的编程语言. JavaScript 是可插入 HTML 页面的编程代码. JavaScript 插入 HTML 页面后,可由所有的现 ...
- python中__init__.py与def __init__(self)的使用
一直对__init__的使用很迷茫,这里系统的学习了解下 1.__init__.py文件-package的标识 python中每个package实际上是一个目录(Directory),程序运行时如何识 ...
- MVC 实现下拉框
MVC动态实现下拉框的方式有很多种,但是方便快捷的却是很少,现在记录一种常用的下拉框实现方式: 1.先看看视图代码是怎么写的 <div class="form-group col-xs ...
- 【题解】洛谷P1315 [NOIP2011TG] 观光公交(前缀和+贪心)
次元传送门:洛谷P1315 思路 思路大概想到了 可是代码实现却没想到 所以参考题解了 D2T3的贪心果然有难度 我们考虑在每次用加速器有两种情况 到下一个点还需要等待:以后的时间就不再影响了 到下一 ...
- 第27章 LTDC/DMA2D—液晶显示
本章参考资料:<STM32F76xxx参考手册2>.<STM32F7xx规格书>.库帮助文档<STM32F779xx_User_Manual.chm>. 关于开发板 ...
- ubuntu上建立本地git 和 网络 github的上传与下载
github工具是一个很好用的工具,可以在本地建立一个git仓库,存储当前写的程序或者数据,然后通过ssh与github建立联系.具体怎么实现,下面进行介绍. 1.首先要安装git 软件 在Linux ...
- Oracle 缓存命中率问题一则(里面有个问题咨询大佬们)
近日,核心数据库频繁抱出数据库缓存命中率过低,于是开始进行排查. 1.监控软件告警信息 2.抓取告警时间段内的awr报告进行分析 3.execute与parse命中率过低,说明分析(硬解析与软解析)的 ...
- IF()判断变量是否为空
一 变量是字符串,判断为空 第一种:strs == null string strs = "test"; if (strs == null) { //这里是为空的字符串,返回你指定 ...