题面

bzoj

luogu

所有事件按时间排序

按值划分下放

把每一个修改

改成一个删除一个插入

对于一个查询

直接查这个段区间有多少合法点

如果查询值大于等于目标值 进入左区间

如果一个查询无解

那么它要求第k大无解

k > 路径长 用lca维护即可

#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <cstring>
#define Sqr(x) ((x)*(x))
using namespace std;
const int N = 8e4 + 5;
const int inf = 1e8 + 5;
struct Edge{
int v, next;
}edge[N << 1];
int head[N], esize;
inline void addedge(int x, int y){
edge[++esize] = (Edge){y, head[x]};
head[x] = esize;
}
struct Node{
int t, x, y, w, d;
bool type; //0是插入 1是查询
}node[N << 2], p1[N << 2], p2[N << 2];
int n, m, nsize, a[N], ans[N];
int tim, dfn[N], top[N], son[N], fa[N], size[N], rf[N], dep[N];
bool flag[N]; struct BIT{
int w[N];
void ins(int x, int d){while(x <= n){w[x] += d; x += x & -x;}}
int qry(int x){int res = 0; while(x){res += w[x]; x -= x & -x;} return res;}
}bit; inline void addnode(int x1, int x2, int x3, int x4, int x5, bool x6){
++nsize, node[nsize].t = x1, node[nsize].x = x2, node[nsize].y = x3,
node[nsize].w = x4, node[nsize].d = x5, node[nsize].type = x6;
} void dfs1(int x, int ff){
dep[x] = dep[ff] + 1, size[x] = 1, fa[x] = ff;
for(int i = head[x], vv; ~i; i = edge[i].next){
vv = edge[i].v; if(vv == ff) continue;
dfs1(vv, x);
size[x] += size[vv];
if(size[son[x]] < size[vv]) son[x] = vv;
}
} void dfs2(int x, int tp){
top[x] = tp, dfn[x] = ++tim, rf[tim] = x;
if(son[x]) dfs2(son[x], tp); else return;
for(int i = head[x], vv; ~i; i = edge[i].next){
vv = edge[i].v; if(vv == fa[x] || vv == son[x]) continue;
dfs2(vv, vv);
}
} int LCA(int x, int y){
while(top[x] != top[y]){
if(dep[top[x]] < dep[top[y]]) swap(x, y);
x = fa[top[x]];
}
return dep[x] < dep[y] ? x : y;
} int qry(int x, int y){
int res = 0;
while(top[x] != top[y]){
if(dep[top[x]] < dep[top[y]]) swap(x, y);
res += bit.qry(dfn[x]) - bit.qry(dfn[top[x]] - 1);
x = fa[top[x]];
}
if(dep[x] < dep[y]) swap(x, y); res += bit.qry(dfn[x]) - bit.qry(dfn[y] - 1);
return res;
} void erfn(int L, int R, int l, int r){
if(L > R) return;
if(l == r){
for(int i = L; i <= R; ++i)
if(node[i].type && ~ans[node[i].t]) ans[node[i].t] = l;
return ;
}
int mid = l + ((r - l) >> 1);
int t1 = 0, t2 = 0;
for(int i = L; i <= R; ++i){
if(node[i].type) {
int cnt = qry(node[i].x, node[i].y);
if(cnt >= node[i].w) p2[++t2] = node[i];
else node[i].w -= cnt, p1[++t1] = node[i];//第k大!!先减再复制!!
}
else {
if(node[i].w <= mid) p1[++t1] = node[i];
else p2[++t2] = node[i], bit.ins(dfn[node[i].x], node[i].d);
}
}
for(int i = L; i <= R; ++i)
if(!node[i].type && node[i].w > mid)
bit.ins(dfn[node[i].x], -node[i].d);
for(int i = 1; i <= t1; ++i) node[L + i - 1] = p1[i];
for(int i = 1; i <= t2; ++i) node[L + t1 + i - 1] = p2[i];
erfn(L, L + t1 - 1, l, mid); erfn(L + t1, R, mid + 1, r);
} int main() {
memset(head, -1, sizeof(head));
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++i){
scanf("%d", &a[i]);
addnode(0, i, 0, a[i], 1, 0);
}
for(int i = 1, x, y; i < n; ++i){
scanf("%d%d", &x, &y);
addedge(x, y); addedge(y, x);
} dfs1(1, 0); dfs2(1, 1);
for(int i = 1, x, y, z; i <= m; ++i){
scanf("%d%d%d", &x, &y, &z); flag[i] = (bool)x;
if(x){
int len = dep[y] + dep[z] - 2 * dep[LCA(y, z)] + 1;
if(x > len) ans[i] = -1;
else addnode(i, y, z, x, 0, 1);
}
else addnode(i, y, 0, a[y], -1, 0), addnode(i, y, 0, z, 1, 0), a[y] = z, ans[i] = -1;
}
erfn(1, nsize, 0, inf);
for(int i = 1; i <= m; ++i)
if(flag[i]){
if(ans[i] == -1) printf("invalid request!\n");
else printf("%d\n", ans[i]);
}
//system("PAUSE");
return 0;
}

[CTSC2008]网络管理 [整体二分]的更多相关文章

  1. 【BZOJ1146】【CTSC2008】网络管理 [整体二分]

    网络管理 Time Limit: 50 Sec  Memory Limit: 162 MB[Submit][Status][Discuss] Description M公司是一个非常庞大的跨国公司,在 ...

  2. [BZOJ1146][CTSC2008]网络管理Network(二分+树链剖分+线段树套平衡树)

    题意:树上单点修改,询问链上k大值. 思路: 1.DFS序+树状数组套主席树 首先按照套路,关于k大值的问题,肯定要上主席树,每个点维护一棵权值线段树记录它到根的信息. 关于询问,就是Que(u)+Q ...

  3. 2019.01.13 bzoj1146: [CTSC2008]网络管理Network(整体二分+树剖)

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

  4. [CTSC2008]网络管理(整体二分+树剖+树状数组)

    一道经典的带修改树链第 \(k\) 大的问题. 我只想出三个 \(\log\) 的解法... 整体二分+树剖+树状数组. 那不是暴力随便踩的吗??? 不过跑得挺快的. \(Code\ Below:\) ...

  5. [CTSC2008]网络管理 [树剖+整体二分]

    这题的复杂度可以到达惊人的\(\log^4\)据说还能跑过去(差点没吓死我 直接二分+树剖树套树(\(n \log^4 n\)) 一个\(\log\)也不少的4\(\log\) 但是我有个\(\log ...

  6. 【BZOJ1146】网络管理(整体二分)

    [BZOJ1146]网络管理(整体二分) 题面 良心洛谷,有BZOJ权限题 题解 要看树套树的戳这里 毕竟是:智商不够数据结构来补 所以, 我们来当一回智商够的选手 听说主席树的题目大部分都可以整体二 ...

  7. bzoj 1146 网络管理Network (CDQ 整体二分 + 树刨)

    题目传送门 题意:求树上路径可修改的第k大值是多少. 题解:CDQ整体二分+树刨. 每一个位置上的数都会有一段持续区间 根据CDQ拆的思维,可以将这个数拆成出现的时间点和消失的时间点. 然后通过整体二 ...

  8. Luogu4175:[CTSC2008]网络管理Network

    题面 Luogu4175:[CTSC2008]网络管理Network Sol 路径第\(k\)大 无解直接判断就好了 然后整体二分,加上树链剖分+树状数组统计 # include <bits/s ...

  9. 洛谷 P4175 [CTSC2008]网络管理 解题报告

    P4175 [CTSC2008]网络管理 题目描述 带修改树上链的第\(k\)大 输入输出格式 输入格式: 第一行为两个整数\(N\)和\(Q\),分别表示路由器总数和询问的总数. 第二行有\(N\) ...

随机推荐

  1. 使用ArcGIS Earth矢量化高精度的数据(kml转图层转shp/要素类)

    大家好,这次来分享干货.做地理分析的同学,或者需要使用地图却不知道哪里有精度较高矢量数据(如校园图)的时候,怎么办呢? 我们知道ArcGIS提供了精度较高的全球影像图,基于此,可以自己进行矢量化,然后 ...

  2. Django的urls.py加载静态资源图片,TypeError: view must be a callable or a list/tuple in the case of include().

    Django的urls.py加载静态资源图片,TypeError: view must be a callable or a list/tuple in the case of include(). ...

  3. 德国慕尼黑.NET俱乐部VS2019发布活动

    就在广州.NET俱乐部紧锣密鼓的准备配合VS2019发布搞一场大Party的时候,德国慕尼黑.NET俱乐部早就已经对外宣布他们将会配合VS2019发布搞两场活动,注意,是两场哦,不是一场哦. 第一场是 ...

  4. AndroisStudio列选择模式

    今天敲代码的时候可能由于误开了“列选择模式”,在移动光标时,发现若光标所在列超过当前行的行尾列,不像一般情况应该跳到行尾,而变成了保持列的位置,停在了超过行尾的空白处, 如图:非一般情况 一般情况: ...

  5. 测者的性能测试手册:Web压力测试工具webbench

    webbench最多可以模拟3万个并发连接去测试网站的负载能力,个人感觉要比Apache自带的ab压力测试工具好,安装使用也特别方便. 1.适用系统:Linux 2.编译安装: wget http:/ ...

  6. Redis数据库云端最佳技术实践

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云数据库 TencentDB发表于云+社区专栏 邹鹏,腾讯高级工程师,腾讯云数据库Redis负责人,多年数据库.网络安全研发经验. ...

  7. Github上html页面(包括CSS样式和JS效果)如何显示出来

    在看Github上项目时,发现有的html页面效果能很好的展现出来,而有的则不能.对这个问题很好奇,因此研究了一下,最终做到了将页面展示出来的目的.下面以我的Github的开源项目bootstrap- ...

  8. 第二节 pandas 基础知识

    pandas 两种数据结构 Series和DataFrame 一  Series 一种类似与一维数组的对象 values:一组数据(ndarray类型) index:相关的数据索引标签 1.1  se ...

  9. Java多线程——中断机制

    前言:在Java多线程中,中断一直围绕着我们,当我们阅读各种关于Java多线程的资料.书籍时,“中断”一词总是会出现,笔者对其的理解也是朦朦胧胧,因此非常有必要搞清楚Java多线程的中断机制. 1.J ...

  10. Loj #3059. 「HNOI2019」序列

    Loj #3059. 「HNOI2019」序列 给定一个长度为 \(n\) 的序列 \(A_1, \ldots , A_n\),以及 \(m\) 个操作,每个操作将一个 \(A_i\) 修改为 \(k ...