传送门

如果能给每个 \(pair\) 按照权值编号就好了

假设之前已经有了所有的权值的编号,现在考虑编号新的 \(pair\)

如果看过了陈立杰的论文的话,不难得到一个重量平衡树的做法

给树上每个子树一个实数权值区间 \([l,r]\),这个点权值为 \(mid=\frac{l+r}{2}\)

左子树 \([l,mid]\) 右子树 \([mid,r]\)

只需要选择一个树高 \(log\) 的树(treap/替罪羊树)使得满足精度要求即可

# include <bits/stdc++.h>
using namespace std;
typedef long long ll; const int maxn(5e5 + 5);
const double alpha(0.75); int ls[maxn], rs[maxn], rt, tot, size[maxn], que[maxn], cnt, id[maxn], n, m;
double val[maxn];
pair <int, int> info[maxn];
int mx[maxn << 2]; inline int operator <(pair <int, int> a, pair <int, int> b) {
return val[a.first] == val[b.first] ? val[a.second] < val[b.second] : val[a.first] < val[b.first];
} void Dfs(int u) {
if (!u) return;
Dfs(ls[u]), que[++cnt] = u, Dfs(rs[u]);
} int Build(int l, int r, double vl, double vr) {
if (l > r) return 0;
double midv;
int mid, o;
mid = (l + r) >> 1, o = que[mid], midv = (vl + vr) * 0.5;
ls[o] = rs[o] = 0, val[o] = midv;
ls[o] = Build(l, mid - 1, vl, midv);
rs[o] = Build(mid + 1, r, midv, vr);
size[o] = size[ls[o]] + size[rs[o]] + 1;
return o;
} int Rebuild(int x, double vl, double vr) {
cnt = 0, Dfs(x);
return Build(1, cnt, vl, vr);
} int Insert(int &x, double vl, double vr, pair <int, int> v) {
double midv;
int ret;
midv = (vl + vr) * 0.5;
if (!x) {
x = ++tot, val[x] = midv, info[x] = v, size[x] = 1;
return x;
}
if (alpha * size[x] < max(size[ls[x]], size[rs[x]])) x = Rebuild(x, vl, vr);
if (v == info[x]) return x;
else if (v < info[x]) ret = Insert(ls[x], vl, midv, v);
else ret = Insert(rs[x], midv, vr, v);
size[x] = size[ls[x]] + size[rs[x]] + 1;
return ret;
} void Modify(int x, int l, int r, int p) {
int mid;
if (l == r) mx[x] = l;
else {
mid = (l + r) >> 1;
p <= mid ? Modify(x << 1, l, mid, p) : Modify(x << 1 | 1, mid + 1, r, p);
mx[x] = val[id[mx[x << 1]]] >= val[id[mx[x << 1 | 1]]] ? mx[x << 1] : mx[x << 1 | 1];
}
} int Query(int x, int l, int r, int ql, int qr) {
int mid, ret, v;
if (ql <= l && qr >= r) return mx[x];
mid = (l + r) >> 1, ret = -1, v;
if (ql <= mid) ret = Query(x << 1, l, mid, ql, qr);
if (qr > mid) {
v = Query(x << 1 | 1, mid + 1, r, ql, qr);
ret = (ret == -1 || val[id[v]] > val[id[ret]]) ? v : ret;
}
return ret;
} int main() {
int i, l, r, k;
char op;
scanf("%d%d", &n, &m);
val[0] = -1, Insert(rt, 0, 1, make_pair(0, 0));
for (i = 1; i <= n; ++i) Modify(1, 1, n, i);
for (i = 1; i <= m; ++i) {
scanf(" %c%d%d", &op, &l, &r);
if (op == 'C') {
scanf("%d", &k);
id[k] = Insert(rt, 0, 1, make_pair(id[l], id[r]));
Modify(1, 1, n, k);
}
else printf("%d\n", Query(1, 1, n, l, r));
}
return 0;
}

BZOJ3600:没有人的算术的更多相关文章

  1. bzoj3600: 没有人的算术

    题意:太难说了..手动去看吧反正不是权限题. 膜拜VFK大爷的神题! 其实一开始思路挺清楚的,如果我们能做到用一个实数去代表"数",这就是裸的动态区间最值查询. 关键是怎么用实数去 ...

  2. [BZOJ3600] 没有人的算术 [重量平衡树+权值线段树]

    题面 传送门 思路 这道题目是陈立杰论文<重量平衡树和后缀平衡树在信息学奥赛中的应用 >中关于重量平衡树维护序列排名算法的一个应用 具体方法为:令根节点保存一个实数区间$[0,1]$ 若当 ...

  3. 「BZOJ3600」没有人的算术 替罪羊树+线段树

    题目描述 过长--不想发图也不想发文字,所以就发链接吧-- 没有人的算术 题解 \(orz\)神题一枚 我们考虑如果插入的数不是数对,而是普通的数,这就是一道傻题了--直接线段树一顿乱上就可以了. 于 ...

  4. 【BZOJ3600】没有人的算术 - 替罪羊树+线段树

    题意: 题解: Orz vfleaking……真·神题 做法大概是先把题意中定义的“数”都赋一个实数权值,用平衡树来维护整个从大到小排序过的序列,再用线段树查询最值: 这样做为什么是对的?考虑插入一个 ...

  5. 【BZOJ3600】没有人的算术(替罪羊树+线段树)

    点此看题面 大致题意: 定义任意数对\(>0\),数对之间比大小先比第一位.后比第二位,一开始数列全为\(0\),要求你支持\(a_k=(a_x,a_y)\)和询问区间最大值所在位置两种操作. ...

  6. bzoj 3600 没有人的算术——二叉查找树动态标号

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3600 已知 l 和 r 的排名,想快速知道 k 的排名.那么建一个 BIT ,用已知的排名做 ...

  7. bzoj 3600 没有人的算术 - 替罪羊树 - 线段树

    题目都是图片,就不给了,就给链接好了 由于bzoj比较慢,就先给[vjudge传送门] 有兴趣的可以去逛bzoj[bzoj传送门] 题目大意 有n个数a[1],a[2],...,a[n],它们开始都是 ...

  8. bzoj 3600: 没有人的算术

    Description Solution 我们可以给每一个数钦定一个权值 , 这样就可以 \(O(1)\) 比较大小了. 考虑怎么确定权值: 用平衡树来维护 , 我们假设根节点管辖 \([1,2^{6 ...

  9. 【题解】BZOJ 3600: 没有人的算术——替罪羊树、线段树

    题目传送门 题意 具体的自己去上面看吧...反正不是权限题. 简单来说,就是定义了一类新的数,每个数是0或者为 \((x_L, x_R)\) ,同时定义比较大小的方式为:非零数大于零,否则按字典序比较 ...

随机推荐

  1. oracle中将number类型毫秒值转为时间类型

    在搞数据库时,发现有这样的一个字段,类型是NUMBER(38),查看了一下里面的数据,都是这样的: 13239576781141321326994295132212930680413221297162 ...

  2. docker 暴露2375 端口。

    网上找的.大多不能用...一下是我自己找了半天的方法...,可能是版本太旧的原因 下图解决方法: ubuntu: 18.04 docker: Docker version 18.09.2, build ...

  3. python之守护进程

    主进程创建子进程,然后将该进程设置成守护自己的进程,守护进程就好比崇祯皇帝身边的老太监,崇祯皇帝已死老太监就跟着殉葬了. 关于守护进程需要强调两点: 其一:守护进程会在主进程代码执行结束后就终止 其二 ...

  4. 遇见Navicat 2003-can't connect to MYSQL server on 'localhost'(10061)

    学习过程中难免遇到问题,今天就遇到了Navicat 2003-can't connect to MYSQL server on 'localhost'(10061),navicat报错,我就纳闷以前都 ...

  5. [黑科技]跑的比fread还快的cin挂和cout挂

    CCPC赛后摸鱼搞了个新的奇怪外挂 这里贴上利用sgetn和sputn来实现的读入读出挂,理论上比fread更优 期望在赛中TLE的代码能强行卡过去hhh 利用小规模的Codeforces - 103 ...

  6. C#效率提升总结

    1. 尽量减少装箱 尽量减少字符串之间拼接 优先用StringBuilder,因为不会多次分配内存 String.Format()内部其实是调用了StringBuilder(),所以效率很高 2. 转 ...

  7. java翻译到mono C#实现系列(1) 重写返回键按下的事件

    今天看到群里的朋友问怎么按下返回键的时候提示信息,百度了下,就参考网上一个java版示例做了.没啥技术含量,就权当丰富下mono for android的小代码. 直接在mono新建的APP上修改的. ...

  8. 设置npm的镜像源

    将npm的镜像源设置为淘宝镜像源 1.执行命令修改镜像源地址:npm config set registry https://registry.npm.taobao.org 2.重新加载修改后的地址: ...

  9. JavaScript设计模式-15.适配器模式

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. Velocity初始化过程解析

    velocity就是由template,engine,context组成. 1.首先创建一个template(如果是用在web上就是一个html文件),将需要参数化或实例化的地方用跟context有关 ...