考虑在 |不在| 这条链上的所有点上放上一个 \(x\),删除也是,然后用可删除堆就随便草掉了。

// powered by c++11
// by Isaunoya
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include <bits/stdc++.h>
#define rep(i, x, y) for (register int i = (x); i <= (y); ++i)
#define Rep(i, x, y) for (register int i = (x); i >= (y); --i)
using namespace std;
using db = double;
using ll = long long;
using uint = unsigned int;
using pii = pair<int, int>;
#define ve vector
#define Tp template
#define all(v) v.begin(), v.end()
#define sz(v) ((int)v.size())
#define pb emplace_back
#define fir first
#define sec second
// the cmin && cmax
Tp<class T> void cmax(T& x, const T& y) {
if (x < y) x = y;
}
Tp<class T> void cmin(T& x, const T& y) {
if (x > y) x = y;
}
// sort , unique , reverse
Tp<class T> void sort(ve<T>& v) { sort(all(v)); }
Tp<class T> void unique(ve<T>& v) {
sort(all(v));
v.erase(unique(all(v)), v.end());
}
Tp<class T> void reverse(ve<T>& v) { reverse(all(v)); }
const int SZ = 0x191981;
struct FILEIN {
char qwq[SZ], *S = qwq, *T = qwq, ch;
char GETC() { return (S == T) && (T = (S = qwq) + fread(qwq, 1, SZ, stdin), S == T) ? EOF : *S++; }
FILEIN& operator>>(char& c) {
while (isspace(c = GETC()))
;
return *this;
}
FILEIN& operator>>(string& s) {
while (isspace(ch = GETC()))
;
s = ch;
while (!isspace(ch = GETC())) s += ch;
return *this;
}
Tp<class T> void read(T& x) {
bool sign = 1;
while ((ch = GETC()) < 0x30)
if (ch == 0x2d) sign = 0;
x = (ch ^ 0x30);
while ((ch = GETC()) > 0x2f) x = x * 0xa + (ch ^ 0x30);
x = sign ? x : -x;
}
FILEIN& operator>>(int& x) { return read(x), *this; }
FILEIN& operator>>(unsigned& x) { return read(x), *this; }
} in;
struct FILEOUT {
const static int LIMIT = 0x114514;
char quq[SZ], ST[0x114];
signed sz, O;
~FILEOUT() { flush(); }
void flush() {
fwrite(quq, 1, O, stdout);
fflush(stdout);
O = 0;
}
FILEOUT& operator<<(char c) { return quq[O++] = c, *this; }
FILEOUT& operator<<(string str) {
if (O > LIMIT) flush();
for (char c : str) quq[O++] = c;
return *this;
}
Tp<class T> void write(T x) {
if (O > LIMIT) flush();
if (x < 0) {
quq[O++] = 0x2d;
x = -x;
}
do {
ST[++sz] = x % 0xa ^ 0x30;
x /= 0xa;
} while (x);
while (sz) quq[O++] = ST[sz--];
return;
}
FILEOUT& operator<<(int x) { return write(x), *this; }
FILEOUT& operator<<(unsigned x) { return write(x), *this; }
} out; int n, m;
struct P {
priority_queue<int> a, b;
inline void push(int x) { a.push(x); }
inline void erase(int x) { b.push(x); }
inline int top() {
while (!a.empty() && !b.empty() && a.top() == b.top()) a.pop(), b.pop();
if (a.empty()) return -1;
return a.top();
}
};
const int maxn = 1e5 + 51;
P s[maxn << 2];
void upd(int a, int b, int l, int r, int rt, int x) {
if (a <= l && r <= b) {
s[rt].push(x);
return;
}
int mid = l + r >> 1;
if (a <= mid) upd(a, b, l, mid, rt << 1, x);
if (b > mid) upd(a, b, mid + 1, r, rt << 1 | 1, x);
}
void erase(int a, int b, int l, int r, int rt, int x) {
if (a <= l && r <= b) {
s[rt].erase(x);
return;
}
int mid = l + r >> 1;
if (a <= mid) erase(a, b, l, mid, rt << 1, x);
if (b > mid) erase(a, b, mid + 1, r, rt << 1 | 1, x);
}
int ans = -1;
void qry(int l, int r, int x, int rt) {
cmax(ans, s[rt].top());
if (l == r) return;
int mid = l + r >> 1;
(x <= mid) ? qry(l, mid, x, rt << 1) : qry(mid + 1, r, x, rt << 1 | 1);
}
vector<int> g[maxn];
int sz[maxn], son[maxn], d[maxn], fa[maxn];
void dfs(int u) {
sz[u] = 1;
for (int v : g[u])
if (v ^ fa[u]) {
fa[v] = u, d[v] = d[u] + 1, dfs(v), sz[u] += sz[v];
if (sz[v] > sz[son[u]]) son[u] = v;
}
}
int top[maxn], dfn[maxn], idx = 0;
void dfs(int u, int t) {
dfn[u] = ++idx, top[u] = t;
if (son[u]) dfs(son[u], t);
for (int v : g[u])
if (v ^ fa[u] && v ^ son[u]) dfs(v, v);
}
vector<pii> v, vec;
void swap(int& x, int& y) { x ^= y ^= x ^= y; }
void upd(int x, int y, int c) {
v.clear(), vec.clear();
while (top[x] ^ top[y]) {
if (d[top[x]] < d[top[y]]) swap(x, y);
v.push_back({ dfn[top[x]], dfn[x] });
x = fa[top[x]];
}
if (d[x] > d[y]) swap(x, y);
v.push_back({ dfn[x], dfn[y] });
sort(v);
int las = 1;
for (pii x : v) {
if (x.first > las) vec.push_back({ las, x.first - 1 });
las = x.second + 1;
}
if (las <= n) vec.push_back({ las, n });
for (pii x : vec) upd(x.first, x.second, 1, n, 1, c);
}
void erase(int x, int y, int c) {
v.clear(), vec.clear();
while (top[x] ^ top[y]) {
if (d[top[x]] < d[top[y]]) swap(x, y);
v.push_back({ dfn[top[x]], dfn[x] });
x = fa[top[x]];
}
if (d[x] > d[y]) swap(x, y);
v.push_back({ dfn[x], dfn[y] });
sort(v);
int las = 1;
for (pii x : v) {
if (x.first > las) vec.push_back({ las, x.first - 1 });
las = x.second + 1;
}
if (las <= n) vec.push_back({ las, n });
for (pii x : vec) erase(x.first, x.second, 1, n, 1, c);
}
const int maxm = 2e5 + 52;
int A[maxm], B[maxm], V[maxm];
signed main() {
#ifdef _WIN64
freopen("testdata.in", "r", stdin);
#else
ios_base ::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
#endif
// code begin.
in >> n >> m;
rep(i, 2, n) {
int u, v;
in >> u >> v, g[u].pb(v), g[v].pb(u);
}
dfs(1), dfs(1, 1);
rep(i, 1, m) {
int op;
in >> op;
if (op == 0) {
int x, y, c;
in >> x >> y >> c;
upd(x, y, c);
A[i] = x, B[i] = y, V[i] = c;
}
if (op == 1) {
int t;
in >> t, erase(A[t], B[t], V[t]);
}
if (op == 2) {
int u;
in >> u, ans = -1, qry(1, n, dfn[u], 1);
out << ans << '\n';
}
}
return 0;
// code end.
}

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

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

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

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

    [HNOI2016]网络 LG传送门 表示乱搞比正解难想. 整体二分很好想吧. 但是为了好写快乐,我们选择三个\(\log\)的乱搞. 先树剖,线段树套堆维护区间最大值.对于一次修改,如果是插入,就把 ...

  3. uoj30【CF Round #278】Tourists(圆方树+树链剖分+可删除堆)

    - 学习了一波圆方树 学习了一波点分治 学习了一波可删除堆(巧用 ? STL) 传送门: Icefox_zhx 注意看代码看怎么构建圆方树的. tips:tips:tips:圆方树内存记得开两倍 CO ...

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

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

  5. BZOJ5210 最大连通子块和 【树链剖分】【堆】【动态DP】

    题目分析: 解决了上次提到的<切树游戏>后,这道题就是一道模板题. 注意我们需要用堆维护子重链的最大值.这样不会使得复杂度变坏,因为每个重链我们只考虑一个点. 时间复杂度$O(nlog^2 ...

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

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

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

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

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

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

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

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

随机推荐

  1. 2020 University Rankings US News(中国)

    2020 University Rankings US News(中国)

  2. 看完这篇文章,再次遇到Jedis「Redis客户端」异常相信你不再怕了!

    本文导读: [1] 疫情当前 [2] 应用异常监控 [3] Redis客户端异常分析 [4] Redis客户端问题引导分析 [5] 站在Redis客户端视角分析 [6] 站在Redis服务端视角分析 ...

  3. 最简单的基于FFMPEG+SDL的视频播放器:拆分-解码器和播放器

    ===================================================== 最简单的基于FFmpeg的视频播放器系列文章列表: 100行代码实现最简单的基于FFMPEG ...

  4. ccf

    import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; public class MST { pu ...

  5. 文件传输协议-FTP

    一.FTP概述 FTP(File Transfer Protocol 文件传输协议)C/S结构的应用层协议.由服务端和客户端两个部分共同实现文件传输功能 FTP服务器普遍部署于内网中,具有容易部署.方 ...

  6. 【5min+】 对象映射只有AutoMapper?试试Mapster

    系列介绍 [五分钟的dotnet]是一个利用您的碎片化时间来学习和丰富.net知识的博文系列.它所包含了.net体系中可能会涉及到的方方面面,比如C#的小细节,AspnetCore,微服务中的.net ...

  7. Private Variable and Private Method - Python 私有变量 和 私有方法

    Private Variable and Private Method Python 不象 Java 那样, 通过 private 关键字创建私有属性, python 通过更简洁的实现了'私有属性', ...

  8. [Redis-CentOS7]Redis数据持久化(八)

    配置文件位置 /ect/redis.conf RDB存储配置 save 900 1 # 900秒之内发生一次写操作保存 save 300 10 # 300秒内写10次保存 save 60 10000 ...

  9. To use the new Server Discover and Monitoring engine, pass option { useUnifiedTopology: true } to the MongoClient constructor.

    mongoose报错:DeprecationWarning: current Server Discovery and Monitoring engine is deprecated, and wil ...

  10. tensorflow开发环境版本组合

    记录下各模块的版本 tensorflow 1.15.0       print tf.__version__ cuda 10.0.130            nvcc -v cudnn 7.6.4  ...