题意:两种操作,在二维平面插入一个点及其权值,查询矩形区间第k大,强制在线。

之前考试考过一个矩形区间第k大的题。。当时想了各种树套树套树,算了算复杂度都没有暴力快。。后来憋了个kd-tree套主席树,就是把若干个kd-tree上的节点上的主席树弄来一起走,时间复杂度logn*sqrt(n),空间复杂度俩log(由于那个题是离线的,我当时写的kd-tree上自底向上的线段树合并,所以实际空间复杂度只有一个log)。。当时标程给的块状链表套划分树(维度高了什么奇葩玩意都有),比我慢一倍。。然后前两天BZOJ上加了俩差不多的题,就把当时的代码改了改交了一发,结果被claris狂D了一顿。。于是决心痛改前非把主席树放外面。。

主席树放外面的好处就是空间上少个log,并且不用将一大堆主席树节点存在数组里一起跑。。维度比较高的题目当中最好把平衡树或者kd-tree(本质和平衡树差不多)放里面,这样内部插入一个节点的内存开销是O(1)的。感觉主席树放外面本质其实就是动态版的划分树,因为划分树里面是数组,不支持一些动态操作,所以根据具体题目改成平衡树啊kd-tree啊什么什么的就好了。。

开始偷懒没写重构T了一发。。

加上了替罪羊还是比claris慢三倍TAT。。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define erp(i,a,b) for(int i=a;i>=b;--i)
using namespace std;
inline void gmin(int&a, const int&b) { if(a>b)a=b; }
inline void gmax(int&a, const int&b) { if(a<b)a=b; }
const int MAXN = 100005;
const int inf = 1000000000;
const int MAXS = 2000000;
const double alp = 0.8;
int N, Q;struct dot {int d[2], mn[2], mx[2], l, r, sz;dot () { l = r = 0; }dot (int x, int y) { d[0] = x; d[1] = y; l = r = 0; }int& operator [] (int x) { return d[x]; }
};
int D, pt[MAXN];
int dcnt, tot;
namespace kdt
{dot tr[MAXS];inline bool cmp(int i, int j){return tr[i][D] < tr[j][D];}inline void pushup(int k){dot&l = tr[tr[k].l], &r = tr[tr[k].r];tr[k].mn[0] = tr[k].mx[0] = tr[k][0];tr[k].mn[1] = tr[k].mx[1] = tr[k][1];rep(i, 0, 1){if (tr[k].l) gmin(tr[k].mn[i], l.mn[i]), gmax(tr[k].mx[i], l.mx[i]);if (tr[k].r) gmin(tr[k].mn[i], r.mn[i]), gmax(tr[k].mx[i], r.mx[i]);}tr[k].sz = l.sz + r.sz + 1;}inline int NewDot(int x, int y){++dcnt, tr[dcnt][0] = x, tr[dcnt][1] = y;return pushup(dcnt), dcnt;}inline bool isbad(int x){return max(tr[tr[x].l].sz, tr[tr[x].r].sz) > tr[x].sz*alp+5;}int quary(int i, int x0, int y0, int x1, int y1){if (!i||tr[i].mn[0]>x1||tr[i].mx[0]<x0||tr[i].mn[1]>y1||tr[i].mx[1]<y0) return 0;if (tr[i].mn[0]>=x0&&tr[i].mx[0]<=x1&&tr[i].mn[1]>=y0&&tr[i].mx[1]<=y1) return tr[i].sz;int ret = 0;if (tr[i][0]>=x0&&tr[i][0]<=x1&&tr[i][1]>=y0&&tr[i][1]<=y1) ret ++;return ret + quary(tr[i].l, x0, y0, x1, y1) + quary(tr[i].r, x0, y0, x1, y1);}int gt, gtd, gtf;void ins(int&x, int D, const dot&p){if (!x) { x = NewDot(p.d[0], p.d[1]); return; }if (p.d[D]<tr[x][D]) ins(tr[x].l, D^1, p);else ins(tr[x].r, D^1, p);pushup(x);if (isbad(x)) gt = x, gtd = D, gtf = 0;else if (gt==tr[x].l||gt==tr[x].r) gtf = x;}void treavel(int&x){if (!x) return;pt[++tot] = x;treavel(tr[x].l), treavel(tr[x].r);}int build(int l, int r, int now){if (l > r) return 0;int mid = (l+r)>>1, x;D = now;nth_element(pt+l, pt+mid, pt+r+1, cmp);x = pt[mid];tr[x].l = build(l, mid-1, now^1);tr[x].r = build(mid+1, r, now^1);return pushup(x), x;}void deal_ins(int&x, const dot&p){gt = gtf = 0, ins(x, 0, p);if (!gt) return;tot = 0, treavel(gt);if (!gtf) { x = build(1, tot, gtd); return; }if (gt==tr[gtf].l) tr[gtf].l = build(1, tot, gtd);else tr[gtf].r = build(1, tot, gtd);}
}#define lch(a) ti[a].lch
#define rch(a) ti[a].rch
struct Node {int lch, rch, rt;
} ti[MAXS];
int ncnt, root;
void ins(int&x, const dot&p, int val, int L=1, int R=inf)
{if (!x) x = ++ncnt;kdt::deal_ins(ti[x].rt, p);if (L==R) return;int mid = (L+R)>>1;if (val<=mid) ins(lch(x), p, val, L, mid);else ins(rch(x), p, val, mid+1, R);
}
int quary(int&x, int&x0, int&y0, int&x1, int&y1, int k, int L=1, int R=inf)
{if (L==R) return L;int rcnt = kdt::quary(ti[rch(x)].rt, x0, y0, x1, y1);int mid = (L+R)>>1;if (k<=rcnt) return quary(rch(x), x0, y0, x1, y1, k, mid+1, R);return quary(lch(x), x0, y0, x1, y1, k-rcnt, L, mid);
}int main()
{//freopen("data.txt","r",stdin);//freopen("my.out","w",stdout);scanf("%d%d", &N, &Q);int op, x0, y0, x1, y1, k, ans = 0, tmp;rep(i, 1, Q){scanf("%d", &op);if (op==1){scanf("%d%d%d", &x0, &y0, &k);x0^=ans, y0^=ans, k^=ans;dot p = dot(x0, y0);ins(root, p, k);}else{scanf("%d%d%d%d%d", &x0, &y0, &x1, &y1, &k);x0^=ans, y0^=ans, x1^=ans, y1^=ans, k^=ans;tmp = kdt::quary(ti[root].rt, x0, y0, x1, y1);if (tmp < k) puts("NAIVE!ORZzyz."), ans=0;else printf("%d\n", ans=quary(root, x0, y0, x1, y1, k));}}return 0;
}

[BZOJ4605]崂山白花蛇草水(主席树套kd-tree)相关推荐

  1. bzoj4605: 崂山白花蛇草水 //替罪羊式重构k-d树

    bzoj4605: 崂山白花蛇草水 题意 Q(<=100000)次操作,支持: 在二维平面上插入一个坐标(x,y)(x,y<=500000),点权为v(<=1e9)的点: 查询矩形区 ...

  2. [BZOJ]4605 崂山白花蛇草水 线段树套KD-Tree

    4605: 崂山白花蛇草水 Time Limit: 80 Sec  Memory Limit: 512 MB Submit: 527  Solved: 153 [Submit][Status][Dis ...

  3. 【BZOJ 4605】崂山白花蛇草水 替罪羊树套线段树

    外层是借鉴了kd-tree的替罪羊里层是线段树,插入就是正常插入+拍扁重建,查询的时候,我们就像树状数组套线段树一样操作在替罪羊中找到的线段树根节点,但是对于在kd-tree查找过程中遇到的单点,我们 ...

  4. bzoj4605: 崂山白花蛇草水 权值线段树套KDtree

    bzoj4605: 崂山白花蛇草水 链接 bzoj loj 思路 强制在线,那就权值线段树套KDtree好了,没啥好讲的. KDtree要加平衡因子来重构.另外,那水真难喝. 错误 树套树一边写过了, ...

  5. 【线段树套KD树】[BZOJ4605]崂山白花蛇草水

    题目描述 Description 神犇Aleph在SDOI Round2前立了一个flag:如果进了省队,就现场直播喝崂山白花蛇草水.凭借着神犇Aleph的实 力,他轻松地进了山东省省队,现在便是他履 ...

  6. bzoj4605 崂山白花蛇草水 权值线段树套kd树

    Description Q次操作,要求资瓷 在(x,y)处放一个数字x 查询(x1,y1)到(x2,y2)矩形内第k大 Solution 非常裸的权值线段树套kd树,为了保证复杂度可以定期重构也可以平 ...

  7. [bzoj4605]崂山白花蛇草水 k-d tree 带替罪羊重构

    4605: 崂山白花蛇草水 Time Limit: 80 Sec  Memory Limit: 512 MB [Submit][Status][Discuss] Description 神犇Aleph ...

  8. bzoj4605 崂山白花蛇草水(动态开点线段树逃替罪羊重构K-D tree)

    首先我们发现它是一个三维的问题而且还强制在线 囧 我们可以考虑在外面来一个权值线段树,然后每次查询时在线段树二分即可,这样我们每个节点再套一棵K-D tree,用来查询有多少个点被框住了,然后因为是不 ...

  9. bzoj4605: 崂山白花蛇草水(权值线段树套k-dtree)

    题目 #include<bits/stdc++.h> using namespace std; #define mid (l+r>>1) const int N=100002, ...

最新文章

  1. 【高并发】32位多核CPU并发读写long型数据为何会出现诡异问题?看完这篇我懂了!...
  2. 利用飞信给自己发短信的shell脚本
  3. WindowsPhone7入手,实在的照片
  4. 官方文档翻译-ESP32-High Resolution Timer
  5. django 的ORM
  6. 使用jedis实现Redis消息队列(MQ)的发布(publish)和消息监听(subscribe)
  7. C语言基础教程之错误处理
  8. 一位算法工程师从30+场秋招面试中总结出的超强面经——目标检测篇(含答案)...
  9. x11/xwindow GUI窗口代码范例
  10. 微波工程(5)——滤波器
  11. 大物期末复习(知识点公式总结+错题分析)
  12. Javascript复习必记知识点
  13. c++ 常用总结(三)
  14. 企业OA管理系统需具备哪些功能?
  15. 台式机切换有线/无线网脚本
  16. 安科瑞:列头柜、监控系统、触摸屏的数据中心机房配电方案
  17. 计算机之父冯·诺依曼
  18. nginx——keepalived
  19. 为什么选择量化交易?
  20. 杨百万:调整后最值得关注的10大金股

热门文章

  1. 免费的万能格式转换器 Convertio超级文件格式转换器
  2. python制作个人名片_python制作名片
  3. TEC相关指标和参数20221221
  4. Apollo 星火计划踩坑记录 dreamview启动报错“No such file or directory: ‘ping‘: ‘ping‘”
  5. Emby识别都是英文海报
  6. AutomationML与OPC UA 相结合-为工业4.0 组件建模
  7. Windows11 安装教程(Ultraiso-制作启动盘)
  8. iOS 诡异的崩溃EXC_BREAKPOINT (code=1, subcode=0x1c5691d2c)
  9. 关于测试的一篇论文, 基于web端selenium的自动化测试设计与实现(有需要的联系我 此论文内容缺失,不要直接用 一经发现,后果自负)
  10. webpack - 基础打包实现