[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);elseif (m < x)modify(q, m + 1, r, x, y, z, opt);elsemodify(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));elsereturn 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我们这种只会乱搞的小蒟蒻啊这个乱搞的思路也挺精巧的

转载于:https://www.cnblogs.com/cj-chd/p/10453387.html

[HNOI2016]网络 树链剖分,堆相关推荐

  1. BZOJ 1146: [CTSC2008]网络管理Network( 树链剖分 + 树状数组套主席树 )

    树链剖分完就成了一道主席树裸题了, 每次树链剖分找出相应区间然后用BIT+(可持久化)权值线段树就可以完成计数. 但是空间问题很严重....在修改时不必要的就不要新建, 直接修改原来的..详见代码. ...

  2. 【bzoj1146】 [CTSC2008]网络管理Network【树链剖分+树套树+二分 线段树套Treap】

    1146: [CTSC2008]网络管理Network Description M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个 部门之间协同工作,公 ...

  3. 小清的树链剖分10题日志01 树链剖分种果子 有你好果子吃的

    声明:由于本人能力尚不优 故无法做出解释文章 此文仅为自己日记 感谢你的阅读 作为队里的数据结构选手 2019西安邀请赛的E题 竟然在有机时的情况下 想到了线段树log^2的拆位做法 但是题目路径把自 ...

  4. E. Tree(The 2019 ACM-ICPC China Shannxi Provincial Programming Contest)(树链剖分+线段树)

    4000ms 262144K judge:计蒜客 Description Ming and Hong are playing a simple game called nim game. They h ...

  5. 对LCA、树上倍增、树链剖分(重链剖分长链剖分)和LCT(Link-Cut Tree)的学习

    LCA what is LCA & what can LCA do LCA(Lowest Common Ancestors),即最近公共祖先 在一棵树上,两个节点的深度最浅的公共祖先就是 L ...

  6. 【ZJOI2008】树的统计(树链剖分)

    传送门 Solution: 就是树链剖分入门题啦~ // luogu-judger-enable-o2 #include<bits/stdc++.h> #define N 30005 #d ...

  7. 树链剖分+线段树 HDOJ 4897 Little Devil I(小恶魔)

    题目链接 题意: 给定一棵树,每条边有黑白两种颜色,初始都是白色,现在有三种操作: 1 u v:u到v路径(最短)上的边都取成相反的颜色 2 u v:u到v路径上相邻的边都取成相反的颜色(相邻即仅有一 ...

  8. P1505 [国家集训队]旅游 树链剖分

    题目链接 题意:树上更新某一点权值,更新两点简单路径权值,查询最大,最小,和 思路:思路应该比较简单,就是树链剖分后用线段树维护区间最大最小以及区间和. 但是本题比较特殊的是给的边权,转化为点权即可. ...

  9. 【模板】树链剖分 P3384

    题目链接 //部分转自:https://www.luogu.org/problemnew/solution/P3384 初学树链剖分,感觉这个模板题还是容易理解的,但是实在是码量很大的. 知识点: 重 ...

最新文章

  1. 一张图搞定SDF的概念
  2. redis基本类型以及优点特性
  3. element表格实现树形全选_vue+element UI实现树形表格带复选框的示例代码
  4. asp.net core 3.0 中使用 swagger
  5. [css] 为什么说不提倡用1px的小尺寸图片做背景平铺?
  6. CF 717A Festival Organization——斯特林数+递推求通项+扩域
  7. HttpClient连接池的连接保持、超时和失效机制
  8. ubuntu下安装code::blocks
  9. UVA11029 Leading and Trailing【快速模幂+数学】
  10. poi 拆分带图片的word_POI导出简单的带有图片的Word文档
  11. redis实现周边景点由近到远排序
  12. 老舍:有了小孩以后,才知道一切事情没那么简单
  13. python无限循环小数_如何把一个无限循环小数转换成一个分数(算法)
  14. mysql语句大全文档_mysql语句大全免费
  15. 作为技术人员,写博客对我们到底有什么好处?为什么要写博客?
  16. 7.中文句法依存分析
  17. php获取两个时间戳之间相隔多少天多少小时多少分多少秒
  18. 自定义Navigator切换fragment
  19. FluentData
  20. 5000词学英语——DAY8

热门文章

  1. day03 基本数据类型
  2. 为Activity设置特定权限才能启动
  3. 【代码真相】之 开篇
  4. Mule,目前综合状态最良好的开源ESB方案引文
  5. 雷军宣布红米 Redmi 品牌独立,这对小米意味着什么?
  6. [转]kafka介绍
  7. linux 查看用户上次修改密码的日期
  8. OpenStack nova-network 支持多vlan技术实现片段代码
  9. SQL Server 2008 - Cannot set a credential for principal 'sa'.
  10. XML 命名空间(XML Namespaces)