只看题面绝对做不出系列....


注意到\(c \leqslant 7\),因此不会有删边操作(那样例删边干嘛)

注意到\(2, 5\)操作十分的有趣,启示我们拿线段树合并来做

操作\(7\)很好处理

操作\(6\),维护对数的和即可

操作\(3, 4\),乍看不好处理,然而势能分析一下就可以得出暴力的复杂度是\(O(n \log n)\)的

然而我好像写了个稳定的\(\log\)维护

然后好像就没了诶......

空间直接动态开点是开不下的....

需要预先离散化权值

复杂度\(O(n \log n)\)


#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;#define de double
#define ri register int
#define rep(io, st, ed) for(ri io = st; io <= ed; io ++)#define gc getchar
inline int read() {int p = 0, w = 1; char c = gc();while(c > '9' || c < '0') { if(c == '-') w = -1; c = gc(); }while(c >= '0' && c <= '9') p = p * 10 + c - '0', c = gc();return p * w;
}const int sid = 5e5 + 5;
const int eid = 5e6 + 5;de mul[eid];
int n, m, id, nc;
int rt[sid], fa[sid];
int ls[eid], rs[eid], sz[eid];
int opt[sid], c1[sid], c2[sid], T[sid];inline int find(int o) { return fa[o] = (o == fa[o]) ? o : find(fa[o]); }inline void upd(int o) {int lc = ls[o], rc = rs[o];sz[o] = sz[lc] + sz[rc];mul[o] = mul[lc] + mul[rc];
}inline int merge(int x, int y) {if(!x || !y) return x + y;ls[x] = merge(ls[x], ls[y]);rs[x] = merge(rs[x], rs[y]);sz[x] = sz[x] + sz[y];mul[x] = mul[x] + mul[y];return x;
}inline void mdf(int &o, int l, int r, int c, int v) {if(!o) o = ++ id;if(l == r) { sz[o] = v; mul[o] = (de)v * (de)log(T[c]); return; }int mid = (l + r) >> 1;if(c <= mid) mdf(ls[o], l, mid, c, v);else mdf(rs[o], mid + 1, r, c, v);upd(o);
}inline int dfs(int &o, int l, int r, int ml, int mr) {if(!o || ml > r || mr < l) return 0;if(ml <= l && mr >= r) {int tmp = sz[o]; o = 0;return tmp;}int mid = (l + r) >> 1;int ret = dfs(ls[o], l, mid, ml, mr) + dfs(rs[o], mid + 1, r, ml, mr);upd(o); return ret;
}inline int qry(int o, int l, int r, int k) {if(l == r) return T[l];int mid = (l + r) >> 1;if(sz[ls[o]] >= k) return qry(ls[o], l, mid, k);else return qry(rs[o], mid + 1, r, k - sz[ls[o]]);
}void calc() {rep(i, 1, m) {opt[i] = read(); c1[i] = read();if(opt[i] != 1 && opt[i] != 7) c2[i] = read();if(opt[i] == 1) T[++ nc] = c1[i];if(opt[i] == 3 || opt[i] == 4) T[++ nc] = c2[i];}sort(T + 1, T + nc + 1);nc = unique(T + 1, T + nc + 1) - T - 1;rep(i, 1, m) {if(opt[i] == 1) c1[i] = lower_bound(T + 1, T + nc + 1, c1[i]) - T;if(opt[i] == 3 || opt[i] == 4)c2[i] = lower_bound(T + 1, T + nc + 1, c2[i]) - T;}rep(i, 1, m) {int u, v, w, num;switch(opt[i]) {case 1 : n ++; fa[n] = n;mdf(rt[n], 1, nc, c1[i], 1); break;case 2 : u = find(c1[i]); v = find(c2[i]); if(u == v) break;fa[v] = u; rt[u] = merge(rt[u], rt[v]); break;case 3 :u = find(c1[i]); w = c2[i];num = dfs(rt[u], 1, nc, 1, w);mdf(rt[u], 1, nc, w, num); break;case 4 : u = find(c1[i]); w = c2[i];num = dfs(rt[u], 1, nc, w, nc);mdf(rt[u], 1, nc, w, num); break;case 5 :u = find(c1[i]); w = c2[i];printf("%d\n", qry(rt[u], 1, nc, w)); break;case 6 : u = find(c1[i]); v = find(c2[i]);if(mul[rt[u]] > mul[rt[v]]) puts("1");else puts("0"); break;case 7 : u = find(c1[i]);printf("%d\n", sz[rt[u]]); break;default : break;}}
}int main() {//freopen("4399.in", "r", stdin);//freopen("4399.out", "w", stdout);m = read();calc();return 0;
}

转载于:https://www.cnblogs.com/reverymoon/p/10078141.html

bzoj4399 魔法少女LJJ 线段树合并相关推荐

  1. BZOJ4399魔法少女LJJ——线段树合并+并查集

    题目描述 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了 LJJ感叹道"这里真是个迷人的绿色世界,空气清新.淡雅,到处散发着醉 ...

  2. [BZOJ4399]魔法少女LJJ(线段树合并)

    请仔细阅读数据范围,c<=7. 线段树合并裸题,对于乘积大小比较,使用log即可. 1 #include<cmath> 2 #include<cstdio> 3 #inc ...

  3. BZOJ 4399: 魔法少女LJJ 线段树合并 + 对数

    Description 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了 LJJ感叹道"这里真是个迷人的绿色世界,空气清新.淡雅 ...

  4. 魔法少女 LJJ——线段树

    题目 [题目描述] 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女 LJJ 已经觉得自己见过世界上的所有稀奇古怪的事情了. LJJ 感叹道"这里真是个迷人的绿色世界,空气清新. ...

  5. BZOJ4399 魔法少女LJJ【线段树合并】【并查集】

    Description 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了 LJJ感叹道"这里真是个迷人的绿色世界,空气清新.淡雅 ...

  6. bzoj4399 魔法少女LJJ

    这题不愧为4399. 4399: 魔法少女LJJ Time Limit: 20 Sec  Memory Limit: 162 MB Submit: 622  Solved: 145 [Submit][ ...

  7. [BZOJ4399]魔法少女LJJ

    题目大意: 一个动态图,支持以下$7$种操作: 1.加入一个权值为$x$的点: 2.在点$a$和点$b$之间加入一条无向边: 3.在点$a$所属的连通块中将小于$x$的所有权值修改为$x$: 4.在点 ...

  8. 【bzoj4399】魔法少女LJJ 并查集+权值线段树合并

    题目描述 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了 LJJ感叹道"这里真是个迷人的绿色世界,空气清新.淡雅,到处散发着醉 ...

  9. bzoj 4399 魔法少女LJJ

    4399: 魔法少女LJJ Time Limit: 20 Sec  Memory Limit: 162 MB http://www.lydsy.com/JudgeOnline/problem.php? ...

最新文章

  1. iOS Category小举例
  2. 人声提取工具Spleeter安装教程(linux)
  3. Transferring GANs: generating images from limited data 论文学习
  4. DVWA 黑客攻防实战(十五) 绕过内容安全策略 Content Security Policy (CSP) Bypass
  5. c #include如何找到文件_如何用C编写自己的头文件?
  6. 基于DataTabel的增删改查
  7. 如何在Marketing Cloud launchpad里添加Contact创建tile
  8. P5049 [NOIP2018 提高组] 旅行
  9. 方丹丹(1981-),女,就职于宁波市智慧城市规划标准发展研究院。
  10. 关于js数组的六种算法---水桶排序,冒泡排序,选择排序,快速排序,插入排序,希尔排序的理解。...
  11. android之datepicker控件用法
  12. JAVA命令行运行时设置参数
  13. 浅谈EM算法的两个理解角度
  14. matlab函数imhist执行错误可能因为图像不是灰度的
  15. 多电压等级计算机潮流计算,电力系统稳态分析教学心得
  16. jQuery项目:京东商品详情页
  17. 【光线追踪】 流程分析与实现的路径跟踪渲染器
  18. Git常用命令(Git常用命令)
  19. 基于openCV的形状模版匹配
  20. 模糊熵 matlab,近似熵/模糊熵/样本熵MATLAB代码

热门文章

  1. 数据的商业化实现之商圈选址
  2. java基于springboot+vue的驾校学车报名预约管理系统 nodejs+element
  3. SQL中in和not in
  4. js 通讯录(多音字)
  5. imp-00003: 遇到 oracle 错误 4052,imp IMP-00041错误处理
  6. SpringBoot切面应用-输出接口调用日志
  7. Mysql的避坑---- The error may involve defaultParameterMap #The error occurred while setting parameters
  8. 2020中南大学研究生招生夏令营机试题
  9. 读《消失的真实》有感
  10. Android开发艺术探索读书笔记(一)