题意

题目链接

Sol

下面的代码是\(O(nlog^3n)\)的暴力。

因为从一个点向上只会跳\(logn\)次,所以可以暴力的把未经过的处理出来然后每个点开个multiset维护最大值

#include<bits/stdc++.h>
#define Pair pair<int, int>
#define MP(x, y) make_pair(x, y)
#define fi first
#define se second
//#define int long long
#define LL long long
#define Fin(x) {freopen(#x".in","r",stdin);}
#define Fout(x) {freopen(#x".out","w",stdout);}
using namespace std;
const int MAXN = 2e5 + 10, SS = MAXN * 4, mod = 1e9 + 7, INF = 1e9 + 10;
const double eps = 1e-9;
template <typename A, typename B> inline bool chmin(A &a, B b){if(a > b) {a = b; return 1;} return 0;}
template <typename A, typename B> inline bool chmax(A &a, B b){if(a < b) {a = b; return 1;} return 0;}
template <typename A, typename B> inline LL add(A x, B y) {if(x + y < 0) return x + y + mod; return x + y >= mod ? x + y - mod : x + y;}
template <typename A, typename B> inline void add2(A &x, B y) {if(x + y < 0) x = x + y + mod; else x = (x + y >= mod ? x + y - mod : x + y);}
template <typename A, typename B> inline LL mul(A x, B y) {return 1ll * x * y % mod;}
template <typename A, typename B> inline void mul2(A &x, B y) {x = (1ll * x * y % mod + mod) % mod;}
template <typename A> inline void debug(A a){cout << a << '\n';}
template <typename A> inline LL sqr(A x){return 1ll * x * x;}
inline int read() {
char c = getchar(); int x = 0, f = 1;
while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int N, Q, fa[MAXN], siz[MAXN], son[MAXN], id[MAXN], top[MAXN], dep[MAXN], times;
vector<int> v[MAXN];
void dfs1(int x, int _fa) {
siz[x] = 1; dep[x] = dep[_fa] + 1; fa[x] = _fa;
for(auto &to : v[x]) {
if(to == _fa) continue;
dfs1(to, x);
siz[x] += siz[to];
if(siz[to] > siz[son[x]]) son[x] = to;
}
}
void dfs2(int x, int topf) {
top[x] = topf; id[x] = ++times;
if(!son[x]) return ;
dfs2(son[x], topf);
for(auto &to : v[x]) {
if(top[to]) continue;
dfs2(to, to);
}
}
multiset<int> s[SS];
struct Query {
int a, b, v;
}q[MAXN];
vector<Pair> line[MAXN];
int ls[SS], rs[SS], root, tot;
void Erase(multiset<int> &s, int v) {
auto it = s.find(v);
if(it != s.end()) s.erase(it);
}
void Get(vector<Pair> &v, int x, int y) {
vector<Pair> tmp;
while(top[x] ^ top[y]) {
if(dep[top[x]] < dep[top[y]]) swap(x, y);
tmp.push_back({id[top[x]], id[x]});
x = fa[top[x]];
}
if(dep[x] > dep[y]) swap(x, y);
tmp.push_back({id[x], id[y]});
sort(tmp.begin(), tmp.end());
int las = 1;
for(auto x : tmp) {
if(las <= x.fi - 1) v.push_back({las, x.fi - 1});
las = x.se + 1;
}
if(las <= N) v.push_back({las, N});
} int Mx(multiset<int> &s) {
if(s.empty()) return -1;
auto it = s.end(); it--;
return *it;
}
void IntAdd(int &k, int l, int r, int ql, int qr, int v, int opt) {
if(!k) k = ++tot;
if(ql <= l && r <= qr) {
if(opt == 1) s[k].insert(v);
else Erase(s[k], v);
return ;
}
int mid = l + r >> 1;
if(ql <= mid) IntAdd(ls[k], l, mid, ql, qr, v, opt);
if(qr > mid) IntAdd(rs[k], mid + 1, r, ql, qr, v, opt);
}
int Query(int k, int l, int r, int p) {
if(!k) return -1;
int ans = Mx(s[k]), mid = l + r >> 1;
if(l == r) return Mx(s[k]);
if(p <= mid) chmax(ans, Query(ls[k], l, mid, p));
else chmax(ans, Query(rs[k], mid + 1, r, p));
return ans;
}
void TreeAdd(int x, int y, int v, int opt) {
while(top[x] ^ top[y]) {
if(dep[top[x]] < dep[top[y]]) swap(x, y);
IntAdd(root, 1, N, id[top[x]], id[x], v, opt);
x = fa[top[x]];
}
if(dep[x] > dep[y]) swap(x, y);
IntAdd(root, 1, N, id[x], id[y], v, opt);
}
void Add(int ti, int opt) {
int x = q[ti].a, y = q[ti].b, v = q[ti].v;
if(opt == 1) Get(line[ti], x, y);
for(auto x : line[ti])
IntAdd(root, 1, N, x.fi, x.se, v, opt);
}
signed main() {
// Fin(a); Fout(b);
N = read(); Q = read();
for(int i = 1; i <= N - 1; i++) {
int x = read(), y = read();
v[x].push_back(y);
v[y].push_back(x);
}
dfs1(1, 0);
dfs2(1, 1);
for(int i = 1; i <= Q; i++) {
int opt = read();
if(opt == 0) {
int a = read(), b = read(), v = read(); q[i] = {a, b, v};
Add(i, 1);
} else if(opt == 1) {
int ti = read();
Add(ti, -1);
} else if(opt == 2) {
int x = read();
printf("%d\n", Query(root, 1, N, id[x]));
}
}
return 0;
}

loj#2049. 「HNOI2016」网络(set 树剖 暴力)的更多相关文章

  1. 「HNOI2016」网络 解题报告

    「HNOI2016」网络 我有一个绝妙的可持久化树套树思路,可惜的是,它的空间是\(n\log^2 n\)的... 注意到对一个询问,我们可以二分答案 然后统计经过这个点大于当前答案的路径条数,如果这 ...

  2. loj#2255. 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点

    loj#2255. 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点 链接 loj 思路 用交错关系建出图来,发现可以直接缩点,拓扑统计. 完了吗,不,瓶颈在于边数太多了,线段树优化建图. 细节 ...

  3. loj #2051. 「HNOI2016」序列

    #2051. 「HNOI2016」序列 题目描述 给定长度为 n nn 的序列:a1,a2,⋯,an a_1, a_2, \cdots , a_na​1​​,a​2​​,⋯,a​n​​,记为 a[1: ...

  4. LOJ 2551 「JSOI2018」列队——主席树+二分

    题目:https://loj.ac/problem/2551 答案是排序后依次走到 K ~ K+r-l . 想维护一个区间排序后的结果,使得可以在上面二分.求和:二分可以知道贡献是正还是负. 于是想用 ...

  5. LOJ 2555 「CTSC2018」混合果汁——主席树

    题目:https://loj.ac/problem/2555 二分答案,在可以选的果汁中,从价格最小的开始选. 按价格排序,每次可以选的就是一个前缀.对序列建主席树,以价格为角标,维护体积和.体积*价 ...

  6. LOJ#2052. 「HNOI2016」矿区(平面图转对偶图)

    题面 传送门 题解 总算会平面图转对偶图了-- 首先我们把无向边拆成两条单向边,这样的话每条边都属于一个面.然后把以每一个点为起点的边按极角排序,那么对于一条边\((u,v)\),我们在所有以\(v\ ...

  7. loj2049 「HNOI2016」网络

    好像复杂度来说不是正解--不加谜之优化(下叙)能被loj上的加强数据卡 #include <algorithm> #include <iostream> #include &l ...

  8. loj 2955 「NOIP2018」保卫王国 - 树链剖分 - 动态规划

    题目传送门 传送门 想抄一个短一点ddp板子.然后照着Jode抄,莫名其妙多了90行和1.3k. Code /** * loj * Problem#2955 * Accepted * Time: 26 ...

  9. LOJ #2048. 「HNOI2016」最小公倍数

    题意 有 \(n\) 个点,\(m\) 条边,每条边连接 \(u \Leftrightarrow v\) 且权值为 \((a, b)\) . 共有 \(q\) 次询问,每次询问给出 \(u, v, q ...

随机推荐

  1. feh: linux终端下看图片的好工具

    1) 普通浏览 $ feh * 可以察看当前目录下的所有图片,以及当前子目录里的所有图片 2) 播放幻灯片 (-D)   $ feh -D 2 *.jpg 对所有jpg以幻灯片的方式播放,每两秒放一张 ...

  2. GDB dump mem example和命令

    使用方法: You can use the commands dump, append, and restore to copy data between target memory and a fi ...

  3. muduo-ThreadLocal实现细节——阻止销毁未定义对象

    muduo利用pthread_key_t实现ThreadLocal模板类. 具体代码如下所示: template<typename T> class ThreadLocal : nonco ...

  4. 【ABP框架系列学习】启动配置(5)

    ABP提供了在启动时配置模块的基础设施和模型. 1.配置ABP 配置ABP是在模块的PreInitialize方法中完成的,例如: public class SimpleTaskSystemModul ...

  5. sessionStorage 基本使用

    sessionStorage 是浏览器数据存储的方法之一,用于临时保存同一窗口的数据,关闭窗口后sessionStorage 的数据将会不存在,它是以 key value 键值对的形式储存. 基本用法 ...

  6. Work Queues

    Round-robin dispatching 默认情况下,RabbitMQ按顺序分发消息给下一个消费者.平均每个消费者会得到相同数量的消息. Message acknowledgment 为了确保消 ...

  7. jvm详情——2、Java对象在jvm中的大小

    Java对象的大小 基本数据的类型的大小是固定的,这里就不多说了.对于非基本类型的Java对象,其大小就值得商榷.在Java中,一个空Object对象的大小是8byte,这个大小只是保存堆中一个没有任 ...

  8. 【原创】Hacker学习发展流程图 V1.0

    这两张Hacker学习发展流程图都来自A1PASS之手,V0.2为2009推出的,V1.0为2015推出,在这里保存这两张图作为自己学习的方向,希望自己有朝一日也能成为IT大牛!!!

  9. 解释代码((n & (n-1))== 0)的含义

    思路:初步查看很难一眼分析出表达式是什么含义,我们不妨举例分析一下,假设 n = 5,二进制表示为101,那么 n-1 = 4,二进制表示为100, 5 & 4 = 101 & 100 ...

  10. 跟面试官聊.NET垃圾收集,直刺面试官G点

    装逼的面试官和装逼的程序员 我面试别人的时候,经常是按这种路子来面试: 看简历和面试题,从简历和面试题上找到一些技术点,然后跟应聘者聊. 聊某个技术点的时候,应聘者的回答会牵涉到其他的技术点,然后我会 ...