[CTSC2008]网络管理 [整体二分]
题面
所有事件按时间排序
按值划分下放
把每一个修改
改成一个删除一个插入
对于一个查询
直接查这个段区间有多少合法点
如果查询值大于等于目标值 进入左区间
如果一个查询无解
那么它要求第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]网络管理 [整体二分]的更多相关文章
- 【BZOJ1146】【CTSC2008】网络管理 [整体二分]
网络管理 Time Limit: 50 Sec Memory Limit: 162 MB[Submit][Status][Discuss] Description M公司是一个非常庞大的跨国公司,在 ...
- [BZOJ1146][CTSC2008]网络管理Network(二分+树链剖分+线段树套平衡树)
题意:树上单点修改,询问链上k大值. 思路: 1.DFS序+树状数组套主席树 首先按照套路,关于k大值的问题,肯定要上主席树,每个点维护一棵权值线段树记录它到根的信息. 关于询问,就是Que(u)+Q ...
- 2019.01.13 bzoj1146: [CTSC2008]网络管理Network(整体二分+树剖)
传送门 题意简述:给一棵树,支持单点修改,询问路径上两点间第kkk大值. 思路: 读懂题之后立马可以想到序列上带修区间kkk大数的整体二分做法,就是用一个bitbitbit来支持查值. 那么这个题把树 ...
- [CTSC2008]网络管理(整体二分+树剖+树状数组)
一道经典的带修改树链第 \(k\) 大的问题. 我只想出三个 \(\log\) 的解法... 整体二分+树剖+树状数组. 那不是暴力随便踩的吗??? 不过跑得挺快的. \(Code\ Below:\) ...
- [CTSC2008]网络管理 [树剖+整体二分]
这题的复杂度可以到达惊人的\(\log^4\)据说还能跑过去(差点没吓死我 直接二分+树剖树套树(\(n \log^4 n\)) 一个\(\log\)也不少的4\(\log\) 但是我有个\(\log ...
- 【BZOJ1146】网络管理(整体二分)
[BZOJ1146]网络管理(整体二分) 题面 良心洛谷,有BZOJ权限题 题解 要看树套树的戳这里 毕竟是:智商不够数据结构来补 所以, 我们来当一回智商够的选手 听说主席树的题目大部分都可以整体二 ...
- bzoj 1146 网络管理Network (CDQ 整体二分 + 树刨)
题目传送门 题意:求树上路径可修改的第k大值是多少. 题解:CDQ整体二分+树刨. 每一个位置上的数都会有一段持续区间 根据CDQ拆的思维,可以将这个数拆成出现的时间点和消失的时间点. 然后通过整体二 ...
- Luogu4175:[CTSC2008]网络管理Network
题面 Luogu4175:[CTSC2008]网络管理Network Sol 路径第\(k\)大 无解直接判断就好了 然后整体二分,加上树链剖分+树状数组统计 # include <bits/s ...
- 洛谷 P4175 [CTSC2008]网络管理 解题报告
P4175 [CTSC2008]网络管理 题目描述 带修改树上链的第\(k\)大 输入输出格式 输入格式: 第一行为两个整数\(N\)和\(Q\),分别表示路由器总数和询问的总数. 第二行有\(N\) ...
随机推荐
- Java实现栈数据结构
栈(英语:stack)又称为栈或堆叠,是计算机科学中一种特殊的串列形式的抽象数据类型,其特殊之处在于只能允许在链表或数组的一端(称为堆栈顶端指针,英语:top)进行加入数据(英语:push)和输出数据 ...
- Go 语言笔记
Go 语言笔记 基本概念 综述 Go 语言将静态语言的安全性和高效性与动态语言的易开发性进行有机结合,达到完美平衡. 设计者通过 goroutine 这种轻量级线程的概念来实现这个目标,然后通过 ch ...
- SSH鞋贸商城的设计与实现
目录 应用技术 需求分析 总体设计 项目UI展示 一.应用技术 ①SSH SSH是 struts+spring+hibernate的一个集成框架,是目前比较流行的一种Web应用程序开源框架.区别于 S ...
- LeetCode算法题-Repeated String Match(Java实现)
这是悦乐书的第289次更新,第307篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第156题(顺位题号是686).给定两个字符串A和B,找到A必须重复的最小次数,使得B是 ...
- 交替方向乘子法(ADMM)
交替方向乘子法(ADMM) 参考1 参考2 经典的ADMM算法适用于求解如下2-block的凸优化问题( 是最优值,令 表示一组最优解): Block指我们可以将决策域分块,分成两组变量, 这里面 都 ...
- configparser_配置解析器
configparser:配置解析器 import configparser config = configparser.ConfigParser() #配置文件 config[', 'Compres ...
- Redis学习笔记(2)——Redis的下载安装部署
一.下载Redis Redis的官网下载页上有各种各样的版本,如图 但是官网下载的Redis项目不正式支持Windows.如果需要再windows系统上部署,要去GitHub上下载.我下载的是Redi ...
- org.springframework.web.context.support.XmlWebApplicationContext.refresh Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreatio
错误异常: 11-Apr-2019 18:07:14.006 警告 [RMI TCP Connection(5)-127.0.0.1] org.springframework.web.context. ...
- 需求规格说明书(SRS)特点
需求说明书的7大特征: 完整性 正确性 可行性 必要性 划分优先级 无二义性 可验证性 每条需求规格说明书的4大特点: 完整性 一致性 可修改性 可跟踪性 需求管理就是一种获取.组织并记录系统需求的系 ...
- c++11の条件变量
一.条件变量的引入 std::condition_variable 解决了死锁并且控制的资源的访问顺序二避免不必要的等待.当互斥操作不够用而引入的.比如,线程可能需要等待某个条件为真才能继续执行,而一 ...