#4604. The kth maximum number

给定一个大小不超过5×1055 \times 10 ^ 55×105的矩形区域,有一些点有点权。

每次询问给定x1,y1,x2,y2,kx_1, y_1, x_2, y_2, kx1​,y1​,x2​,y2​,k问以x1,y1x_1, y_1x1​,y1​为右下角,x2,y2x_2, y_2x2​,y2​为左上角的矩形中权值第kkk大是多少。

其实于P1527 [国家集训队]矩阵乘法是基本差不多的,就是矩形的大小变大了,无法进行二维树状数组操作

但是,矩形数点不就是一个二维偏序问题嘛,可以树套树来解决,于是我们有了如下的做法,

考虑整体二分,

先对x,yx, yx,y进行离散化(保证常数小一点吧),对每个横左边建立一颗主席树,同时用树状数组维护,

于是在二分过程中,我们对每个点的修改操作,直接修改即可,同时对主席树加上内存回收机制,这样可以保证不会炸空间,

之后对每个矩阵的查询,我们只要在区间[x1,x2][x_1, x_2][x1​,x2​]的主席树上查询值在[y1,y2][y_1, y_2][y1​,y2​]有多少即可,

整体复杂度O(nlog⁡3n)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(整体二分 + 树套树)相关推荐

  1. P2617 Dynamic Rankings 动态区间第K大【树套树】或【整体二分】

    传送门 动态区间第KKK大问题,单点修改(这里是第kkk小,即是从小到大第kkk个) 这里还有个区间修改,有点类似的 P3332 [ZJOI2013]K大数查询 分析 树套树 树套树,就是用一种树形结 ...

  2. P3332 [ZJOI2013]K大数查询【整体二分】或【树套树】

    传送门 给定一个长度为NNN的可重集合 支持修改,离线 求区间可重集合的并集第K大 这里介绍两种方法[树套树]和 [整体二分] 这里还有个单点修改,有点类似的 P2617 Dynamic Rankin ...

  3. 【bzoj1146】 [CTSC2008]网络管理Network【树链剖分+树套树+二分 线段树套Treap】

    1146: [CTSC2008]网络管理Network Description M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个 部门之间协同工作,公 ...

  4. [luogu3380][bzoj3196]【模板】二逼平衡树【树套树】

    题目地址 [洛谷传送门] 题目大意 区间查询k的排名,查找k排名的数,单点修改,区间前驱,区间后继. 感想 真的第一次写树套树,整个人都不对了.重构代码2次,发现样例都过不了,splay直接爆炸,可能 ...

  5. [树套树] 网络管理

    A:[CTSC2008]网络管理 此题本来是平衡树板块的,但俺写的是树套树,平衡树会多个log 题目 查询第kkk大,天然主席树可以维护 就不用了平衡树二分,多个logloglog了 将树上(u,v) ...

  6. BZOJ3489 A simple rmq problem 【可持久化树套树】*

    BZOJ3489 A simple rmq problem Description 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过一 ...

  7. 【BZOJ3196】【Tyvj1730】二逼平衡树,第一次的树套树(线段树+splay)

    传送门1 传送门2 写在前面:创造迄今最长的正常代码的记录 思路:个人感觉这个树套树就是对线段树的每个区间建一棵splay来维护,最初觉得这个方法会爆T爆M--(实际上真的可能会爆).对于5个操作,我 ...

  8. 数据结构:树套树-替罪羊树套权值线段树

    BZOJ3065 本题是在BZOJ上的处女A,实在不应该拿这样一道题来开头 平衡树套线段树应该是树套树问题里比较难的一种了,当然我记得还有一个替罪羊树套Trie树的题,我是不信自己能写出来的. 外层的 ...

  9. P3380 【模板】二逼平衡树(树套树)

    传送门 查询 kkk 在区间内的排名 查询区间内排名为 kkk的值 修改某一位值上的数值 查询 kkk 在区间内的前驱(前驱定义为严格小于 xxx,且最大的数,若不存在输出 −2147483647-2 ...

最新文章

  1. CCNA2 - Module 2 Exam Answers (05/07/2008 14:30)
  2. 链表删除功能实现演示
  3. oracle主键从键怎么看,分析Oracle主键的跳号现象
  4. 平年用c语言的计算方式,C语言平年闰年问题
  5. 央视推荐的护眼台灯是什么牌子?教育照明灯具品牌
  6. Windows下 OpenCV 的下载安装教程(详细)
  7. 403forbidden
  8. 如何打造数字原生企业?易捷行云EasyStack有话要说
  9. Leiden算法介绍
  10. iphone内存管理(二)
  11. 聊聊护网中常见钓鱼攻击思路
  12. 中国五大知名的食品与餐饮调查研究咨询公司
  13. xfs和ext4文件系统大小调整
  14. 超级眼局域网监控软件 员工禁止软件 可以控制时间段
  15. pdf电子发票打印方法
  16. _new_()与_init_()的区别
  17. mfc编程 孙鑫_孙鑫MFC学习笔记7:对话框编程(上)
  18. 省级面板数据(2000-2019)十三:建筑业(主要经济指标、劳动生产率)(stata版)
  19. mx linux默认字体,世界排名第一的Linux系统—MX Linux 19.2 KDE 版正式发布
  20. 【RCJ-2 AC220V 0.015A静态冲击继电器】

热门文章

  1. pytorch forward_【Pytorch部署】TorchScript
  2. Android启动过程五个步骤,Android启动流程、app启动原理
  3. 服务器的响应一直一直发送不过去,zeroRPC:在发送响应后继续运行进程
  4. php 怎么定义一个空对象,php定义空对象的方法
  5. jq取第一个子元素为select_【转】jquery如何获取第一个或最后一个子元素?
  6. 微信功能“拍一拍”,都有谁在“拍”你?
  7. 计算机如何实现共享接入,局域网内电脑实现共享设置方法
  8. Android 防火墙 知乎,知乎回应:防火墙太“坑爹” 正检查用户隐私是否有泄露...
  9. easyui select ajax,easyui的combobox根据后台数据实现自动输入提示功能
  10. apache weblogic ssl linux,apache基于ssl配置weblogic(完结篇)