[HNOI2016]网络

LG传送门

表示乱搞比正解难想。

整体二分很好想吧。

但是为了好写快乐,我们选择三个\(\log\)的乱搞。

先树剖,线段树套堆维护区间最大值。对于一次修改,如果是插入,就把树上除了这条链的地方加上这个重要度,如果是删除则反之。注意线段树可以标记永久化,这里用的堆是一种(可能)叫懒惰堆的东西,直接看代码都能理解。

//written by newbiechd
#include <cstdio>
#include <cctype>
#include <vector>
#include <queue>
#include <algorithm>
#define R register
#define I inline
#define B 1000000
using namespace std;
const int N = 100003, M = 200003;
char buf[B], *p1, *p2;
I char gc() { return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, B, stdin), p1 == p2) ? EOF : *p1++; }
I int rd() {
    R int f = 0;
    R char c = gc();
    while (c < 48 || c > 57)
        c = gc();
    while (c > 47 && c < 58)
        f = f * 10 + (c ^ 48), c = gc();
    return f;
}
int s[N], fa[N], dep[N], siz[N], son[N], dfn[N], top[N], n, tim;
struct road {
    int x, y;
    road() {}
    road(int x, int y) : x(x), y(y) {}
}sta[N];
I int operator < (road a, road b) { return a.x ^ b.x ? a.x < b.x : a.y < b.y; }
struct event {
    int x, y, z;
}q[M];
struct prique {
    priority_queue <int> q1, q2;
    I void push(int x) { q1.push(x); }
    I void pop(int x) { q2.push(x); }
    I int top() {
        while (!q2.empty() && q1.top() == q2.top())
            q1.pop(), q2.pop();
        return q1.empty() ? -1 : q1.top();
    }
}e[N << 2];
vector <int> g[N];
I int max(int x, int y) { return x > y ? x : y; }
I void swap(int &x, int &y) { x ^= y, y ^= x, x ^= y; }
void dfs1(int x, int f) {
    fa[x] = f, dep[x] = dep[f] + 1, siz[x] = 1;
    for (R int i = 0, y, m = 0; i < s[x]; ++i)
        if ((y = g[x][i]) ^ f) {
            dfs1(y, x), siz[x] += siz[y];
            if (siz[y] > m)
                m = siz[y], son[x] = y;
        }
}
void dfs2(int x, int t) {
    dfn[x] = ++tim, top[x] = t;
    if (son[x])
        dfs2(son[x], t);
    for (R int i = 0, y; i < s[x]; ++i)
        if (!dfn[y = g[x][i]])
            dfs2(y, y);
}
void modify(int k, int l, int r, int x, int y, int z, int opt) {
    if (x == l && y == r) {
        opt ? e[k].pop(z) : e[k].push(z);
        return ;
    }
    R int p = k << 1, q = p | 1, m = (l + r) >> 1;
    if (y <= m)
        modify(p, l, m, x, y, z, opt);
    else
        if (m < x)
            modify(q, m + 1, r, x, y, z, opt);
        else
            modify(p, l, m, x, m, z, opt),
                modify(q, m + 1, r, m + 1, y, z, opt);
}
int query(int k, int l, int r, int x) {
    if (l == r)
        return e[k].top();
    R int p = k << 1, q = p | 1, m = (l + r) >> 1, o = e[k].top();
    if (x <= m)
        return max(o, query(p, l, m, x));
    else
        return max(o, query(q, m + 1, r, x));
}
I void insert(int x, int y, int z, int opt) {
    R int t = 0, i, l = 0;
    while (top[x] ^ top[y]) {
        if (dep[top[x]] < dep[top[y]])
            swap(x, y);
        sta[++t] = road(dfn[top[x]], dfn[x]), x = fa[top[x]];
    }
    if (dep[x] > dep[y])
        swap(x, y);
    sta[++t] = road(dfn[x], dfn[y]), sort(sta + 1, sta + t + 1);
    for (i = 1; i <= t; l = max(l, sta[i++].y))
        if (l + 1 < sta[i].x)
            modify(1, 1, n, l + 1, sta[i].x - 1, z, opt);
    if (l < n)
        modify(1, 1, n, l + 1, n, z, opt);
}
int main() {
    R int m, i, x, y, z, opt;
    n = rd(), m = rd();
    for (i = 1; i < n; ++i)
        x = rd(), y = rd(), g[x].push_back(y), g[y].push_back(x);
    for (i = 1; i <= n; ++i)
        s[i] = g[i].size();
    dfs1(1, 0), dfs2(1, 1);
    for (i = 1; i <= m; ++i) {
        opt = rd(), x = rd();
        if (opt == 0)
            y = rd(), z = rd(), q[i] = (event){x, y, z}, insert(x, y, z, opt);
        if (opt == 1)
            insert(q[x].x, q[x].y, q[x].z, opt);
        if (opt == 2)
            printf("%d\n", query(1, 1, n, dfn[x]));
    }
    return 0;
}

其实我觉得写正解的大佬们没必要diss我们这种只会乱搞的小蒟蒻啊这个乱搞的思路也挺精巧的

[HNOI2016]网络 树链剖分,堆的更多相关文章

  1. BZOJ4538:[HNOI2016]网络(树链剖分,堆)

    Description 一个简单的网络系统可以被描述成一棵无根树.每个节点为一个服务器.连接服务器与服务器的数据线则看做 一条树边.两个服务器进行数据的交互时,数据会经过连接这两个服务器的路径上的所有 ...

  2. luoguP3250 [HNOI2016]网络 树链剖分 + 堆

    机房某大佬告诉我,一条链在全局线段树中的区间最多有$log$段 因此同样的,代表不在这条链上的区间同样只有$log$段 对这$log$段区间进行维护即可 为了能够删除,在线段树的每个节点暴力维护一个堆 ...

  3. [HNOI2016]网络 [树链剖分,可删除堆]

    考虑在 |不在| 这条链上的所有点上放上一个 \(x\),删除也是,然后用可删除堆就随便草掉了. // powered by c++11 // by Isaunoya #pragma GCC opti ...

  4. 【BZOJ4538】【HNOI2016】网络(树链剖分,线段树,堆)

    题目链接,我是真的懒得调题目的格式... 题解 树链剖分搞一下LCA 把线段树弄出来 这只是形式上的线段树 本质上是维护一段区间的一个堆 每次把堆插入节点, 询问的时候查询线段树上的堆的最大值就行了 ...

  5. 2019.01.13 bzoj4538: [Hnoi2016]网络(树链剖分)

    传送门 树链剖分一眼题. 题意简述: 给定一棵树,有三种操作: 加入一条路径 删除一条已加入的路径 询问不过一个点x的路径的最大值. 思路: 直接树链剖分维护答案. 因为询问的事不过点xxx的最大值, ...

  6. 【bzoj5210】最大连通子块和 树链剖分+线段树+可删除堆维护树形动态dp

    题目描述 给出一棵n个点.以1为根的有根树,点有点权.要求支持如下两种操作: M x y:将点x的点权改为y: Q x:求以x为根的子树的最大连通子块和. 其中,一棵子树的最大连通子块和指的是:该子树 ...

  7. 焦作网络赛E-JiuYuanWantstoEat【树链剖分】【线段树】

    You ye Jiu yuan is the daughter of the Great GOD Emancipator. And when she becomes an adult, she wil ...

  8. CF487E Tourists(圆方树+树链剖分+multiset/可删堆)

    CF487E Tourists(圆方树+树链剖分+multiset/可删堆) Luogu 给出一个带点权的无向图,两种操作: 1.修改某点点权. 2.询问x到y之间简单路径能走过的点的最小点权. 题解 ...

  9. 2019 icpc南昌全国邀请赛-网络选拔赛J题 树链剖分+离线询问

    链接:https://nanti.jisuanke.com/t/38229 题意: 给一棵树,多次查询,每次查询两点之间权值<=k的边个数 题解: 离线询问,树链剖分后bit维护有贡献的位置即可 ...

随机推荐

  1. TreeView控件概述、属性与方法

    1.作用:用于显示Node结点的分层列表.2.添加到控件箱菜单命令:工程 | 部件,在部件对话框中选择:Microsoft Windows Common Controls 6.03.TreeView控 ...

  2. Flask 参数简介

    我们都知道学习了Flask的时候它里面的参数是有很多种的参数  都是需要相互进行调用传递的  今天就简要分析一些常见的参数 首先导入Flask之后看 源码 from flask import Flas ...

  3. windows下安装Mysql(图文详解)

      博客园 | 首页 | 新随笔 | 联系 | 订阅 | 管理 mysql安装过程及注意事项: 1.1. 下载: 我下载的是64位系统的zip包: 下载地址:https://dev.mysql.com ...

  4. 一份非常完整的 MySQL 规范

    源自:https://www.cnblogs.com/huchong/p/10219318.html 一.数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割. 所有数据库对象名称禁止使用 ...

  5. 汽车学习---汽车知识大全【all】

    汽车驱动/发动机/大灯 侧方位停车和倒车入库技巧 手动挡车型 换档8大技巧 常见的掉头情况注意事项 最全的左转,右转,待转,掉头方法 开车技巧大汇总,尤其适合新手司机 汽车常识扫盲,不做“汽车小白”! ...

  6. Celery学习--- Celery 最佳实践之与django结合实现异步任务

    django 可以轻松跟celery结合实现异步任务,只需简单配置即可 同步执行和异步执行 注意:即使Celery的任务没有执行完成,但是已经创建了任务ID.可以利用前台的定时任务发送Ajax异步请求 ...

  7. Hybris阶段总结(2)hybris架构

    年前总结一下这两个星期在SAP实习学到的一些东西 先上图: ​ 从底往上总结,之后会有个小例子来解释一下 1.Persistence layer 就是作为hybris所连接的数据库这一层,其中hybr ...

  8. Session攻击

    1.简介 Session对于Web应用无疑是最重要的,也是最复杂的.对于web应用程序来说,加强安全性的第一条原则就是 – 不要信任来自客户端的数据,一定要进行数据验证以及过滤,才能在程序中使用,进而 ...

  9. 面对对象程序设计_task2_C++视频教程

    lessons about C++ 1月份的事情不该留到2月份来做,这几天看了几个地方的C++视频教程,不习惯于云课堂的话多等等,最终还是选择了慕课网上面的资源,也安下心来看了一些内容,下面附上课程详 ...

  10. mysql5.7.22的安装与配置(适用mysql5.7.20至mysql5.7.22版本)

    一.解压Mysql5.7.20安装包,刚解压是没有  data  这个文件夹的 二.配置mysql环境变量,创建MYSQL_HOME,然后在Path上添加%MYSQL_HOME%\bin; 三.配置m ...