#4604. The kth maximum number(整体二分 + 树套树)
#4604. The kth maximum number
给定一个大小不超过5×1055 \times 10 ^ 55×105的矩形区域,有一些点有点权。
其实于P1527 [国家集训队]矩阵乘法是基本差不多的,就是矩形的大小变大了,无法进行二维树状数组操作
但是,矩形数点不就是一个二维偏序问题嘛,可以树套树来解决,于是我们有了如下的做法,
先对x,yx, yx,y进行离散化(保证常数小一点吧),对每个横左边建立一颗主席树,同时用树状数组维护,
于是在二分过程中,我们对每个点的修改操作,直接修改即可,同时对主席树加上内存回收机制,这样可以保证不会炸空间,
之后对每个矩阵的查询,我们只要在区间[x1,x2][x_1, x_2][x1,x2]的主席树上查询值在[y1,y2][y_1, y_2][y1,y2]有多少即可,
整体复杂度O(nlog3n)O(n \log ^ 3 n)O(nlog3n),由于nnn比较小,实测跑得还是挺快的。
#include <bits/stdc++.h>using namespace std;const int N = 1e5 + 10;int X[N], Y[N], V[N], ans[N], n, m, nn, mm, tot;int root[N], ls[N * 300], rs[N * 300], sum[N * 300], stk[N * 300], top, num;void update(int &rt, int l, int r, int x, int v) {if (!rt) {if (top) {rt = stk[top--];}else {rt = ++num;}}sum[rt] += v;if (l == r) {return ;}int mid = l + r >> 1;if (x <= mid) {update(ls[rt], l, mid, x, v);}else {update(rs[rt], mid + 1, r, x, v);}
}int A[50], B[50], cnt1, cnt2;int query(int l, int r, int L, int R) {if (l >= L && r <= R) {int res = 0;for (int i = 1; i <= cnt1; i++) {res -= sum[A[i]];}for (int i =1 ; i <= cnt2; i++) {res += sum[B[i]];}return res;}int mid = l + r >> 1, res = 0, A1[50], B1[50];if (L <= mid) {for (int i = 1; i <= cnt1; i++) {A1[i] = A[i];A[i] = ls[A[i]];}for (int i = 1; i <= cnt2; i++) {B1[i] = B[i];B[i] = ls[B[i]];}res += query(l, mid, L, R);for (int i = 1; i <= cnt1; i++) {A[i] = A1[i];}for (int i = 1; i <= cnt2; i++) {B[i] = B1[i];}}if (R > mid) {for (int i = 1; i <= cnt1; i++) {A1[i] = A[i];A[i] = rs[A[i]];}for (int i = 1; i <= cnt2; i++) {B1[i] = B[i];B[i] = rs[B[i]];}res += query(mid + 1, r, L, R);for (int i = 1; i <= cnt1; i++) {A[i] = A1[i];}for (int i = 1; i <= cnt2; i++) {B[i] = B1[i];}}return res;
}inline int lowbit(int x) {return x & (-x);
}void update(int x, int y, int v) {while (x <= nn) {update(root[x], 1, mm, y, v);x += lowbit(x);}
}int get_sum(int l, int r, int L, int R) {if (l > r || L > R) {return 0;}cnt1 = cnt2 = 0;for (int i = l - 1; i; i -= lowbit(i)) {A[++cnt1] = root[i];}for (int i = r; i; i -= lowbit(i)) {B[++cnt2] = root[i];}return query(1, mm, L, R);
}struct Res {int x1, y1, x2, y2, v, id, op;
}q[N], q1[N], q2[N];void solve(int l, int r, int L, int R) {if (L > R || l > r) {return ;}if (l == r) {for (int i = L; i <= R; i++) {if (q[i].op == 2) {ans[q[i].id] = l;}}return ;}int mid = l + r >> 1, cnt1 = 0, cnt2 = 0;for (int i = L; i <= R; i++) {if (q[i].op == 1) {if (q[i].v > V[mid]) {update(q[i].x1, q[i].y1, 1);q2[++cnt2] = q[i];}else {q1[++cnt1] = q[i];}}else {int cur = get_sum(q[i].x1, q[i].x2, q[i].y1, q[i].y2);if (cur >= q[i].v) {q2[++cnt2] = q[i];}else {q[i].v -= cur;q1[++cnt1] = q[i];}}}for (int i = 1; i <= cnt2; i++) {if (q2[i].op == 1) {update(q2[i].x1, q2[i].y1, -1);}}for (int i = 1; i <= cnt1; i++) {q[L + i - 1] = q1[i];}for (int i = 1; i <= cnt2; i++) {q[L + cnt1 + i - 1] = q2[i];}solve(l, mid, L, L + cnt1 - 1), solve(mid + 1, r, L + cnt1, R);
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);scanf("%d %d", &n, &m);for (int i = 1, op; i <= m; i++) {scanf("%d", &op);if (op & 1) {int x, y, v;scanf("%d %d %d", &x, &y, &v);q[i] = {x, y, 0, 0, v, 0, 1};X[++tot] = x, Y[tot] = y, V[tot] = v;}else {int x1, y1, x2, y2, v;scanf("%d %d %d %d %d", &x1, &y1, &x2, &y2, &v);q[i] = {x1, y1, x2, y2, v, i, 2};}}sort(X + 1, X + 1 + tot), sort(Y + 1, Y + 1 + tot), sort(V + 1, V + 1 + tot);nn = unique(X + 1, X + 1 + tot) - (X + 1);mm = unique(Y + 1, Y + 1 + tot) - (Y + 1);tot = unique(V + 1, V + 1 + tot) - (V + 1);for (int i = 1; i <= m; i++) {if (q[i].op & 1) {q[i].x1 = lower_bound(X + 1, X + 1 + nn, q[i].x1) - X;q[i].y1 = lower_bound(Y + 1, Y + 1 + mm, q[i].y1) - Y;}else {q[i].x1 = lower_bound(X + 1, X + 1 + nn, q[i].x1) - X;q[i].y1 = lower_bound(Y + 1, Y + 1 + mm, q[i].y1) - Y;q[i].x2 = upper_bound(X + 1, X + 1 + nn, q[i].x2) - X;q[i].y2 = upper_bound(Y + 1, Y + 1 + mm, q[i].y2) - Y;q[i].x2--, q[i].y2--;}}for (int i = 1; i <= m; i++) {ans[i] = -1;}solve(0, tot, 1, m);for (int i = 1; i <= m; i++) {if (ans[i] != -1) {if (ans[i] == 0) {puts("NAIVE!ORZzyz.");}else {printf("%d\n", V[ans[i]]);}}}return 0;
}
#4604. The kth maximum number(整体二分 + 树套树)相关推荐
- P2617 Dynamic Rankings 动态区间第K大【树套树】或【整体二分】
传送门 动态区间第KKK大问题,单点修改(这里是第kkk小,即是从小到大第kkk个) 这里还有个区间修改,有点类似的 P3332 [ZJOI2013]K大数查询 分析 树套树 树套树,就是用一种树形结 ...
- P3332 [ZJOI2013]K大数查询【整体二分】或【树套树】
传送门 给定一个长度为NNN的可重集合 支持修改,离线 求区间可重集合的并集第K大 这里介绍两种方法[树套树]和 [整体二分] 这里还有个单点修改,有点类似的 P2617 Dynamic Rankin ...
- 【bzoj1146】 [CTSC2008]网络管理Network【树链剖分+树套树+二分 线段树套Treap】
1146: [CTSC2008]网络管理Network Description M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个 部门之间协同工作,公 ...
- [luogu3380][bzoj3196]【模板】二逼平衡树【树套树】
题目地址 [洛谷传送门] 题目大意 区间查询k的排名,查找k排名的数,单点修改,区间前驱,区间后继. 感想 真的第一次写树套树,整个人都不对了.重构代码2次,发现样例都过不了,splay直接爆炸,可能 ...
- [树套树] 网络管理
A:[CTSC2008]网络管理 此题本来是平衡树板块的,但俺写的是树套树,平衡树会多个log 题目 查询第kkk大,天然主席树可以维护 就不用了平衡树二分,多个logloglog了 将树上(u,v) ...
- BZOJ3489 A simple rmq problem 【可持久化树套树】*
BZOJ3489 A simple rmq problem Description 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过一 ...
- 【BZOJ3196】【Tyvj1730】二逼平衡树,第一次的树套树(线段树+splay)
传送门1 传送门2 写在前面:创造迄今最长的正常代码的记录 思路:个人感觉这个树套树就是对线段树的每个区间建一棵splay来维护,最初觉得这个方法会爆T爆M--(实际上真的可能会爆).对于5个操作,我 ...
- 数据结构:树套树-替罪羊树套权值线段树
BZOJ3065 本题是在BZOJ上的处女A,实在不应该拿这样一道题来开头 平衡树套线段树应该是树套树问题里比较难的一种了,当然我记得还有一个替罪羊树套Trie树的题,我是不信自己能写出来的. 外层的 ...
- P3380 【模板】二逼平衡树(树套树)
传送门 查询 kkk 在区间内的排名 查询区间内排名为 kkk的值 修改某一位值上的数值 查询 kkk 在区间内的前驱(前驱定义为严格小于 xxx,且最大的数,若不存在输出 −2147483647-2 ...
最新文章
- CCNA2 - Module 2 Exam Answers (05/07/2008 14:30)
- 链表删除功能实现演示
- oracle主键从键怎么看,分析Oracle主键的跳号现象
- 平年用c语言的计算方式,C语言平年闰年问题
- 央视推荐的护眼台灯是什么牌子?教育照明灯具品牌
- Windows下 OpenCV 的下载安装教程(详细)
- 403forbidden
- 如何打造数字原生企业?易捷行云EasyStack有话要说
- Leiden算法介绍
- iphone内存管理(二)
- 聊聊护网中常见钓鱼攻击思路
- 中国五大知名的食品与餐饮调查研究咨询公司
- xfs和ext4文件系统大小调整
- 超级眼局域网监控软件 员工禁止软件 可以控制时间段
- pdf电子发票打印方法
- _new_()与_init_()的区别
- mfc编程 孙鑫_孙鑫MFC学习笔记7:对话框编程(上)
- 省级面板数据(2000-2019)十三:建筑业(主要经济指标、劳动生产率)(stata版)
- mx linux默认字体,世界排名第一的Linux系统—MX Linux 19.2 KDE 版正式发布
- 【RCJ-2 AC220V 0.015A静态冲击继电器】
热门文章
- pytorch forward_【Pytorch部署】TorchScript
- Android启动过程五个步骤,Android启动流程、app启动原理
- 服务器的响应一直一直发送不过去,zeroRPC:在发送响应后继续运行进程
- php 怎么定义一个空对象,php定义空对象的方法
- jq取第一个子元素为select_【转】jquery如何获取第一个或最后一个子元素?
- 微信功能“拍一拍”,都有谁在“拍”你?
- 计算机如何实现共享接入,局域网内电脑实现共享设置方法
- Android 防火墙 知乎,知乎回应:防火墙太“坑爹” 正检查用户隐私是否有泄露...
- easyui select ajax,easyui的combobox根据后台数据实现自动输入提示功能
- apache weblogic ssl linux,apache基于ssl配置weblogic(完结篇)