Description


Q次操作,要求资瓷

  1. 在(x,y)处放一个数字x
  2. 查询(x1,y1)到(x2,y2)矩形内第k大

Solution


非常裸的权值线段树套kd树,为了保证复杂度可以定期重构也可以平衡因子搞搞

Code


#include <stdio.h>
#include <string.h>
#include <algorithm>
#define max(x,y) (x>y?x:y)
#define min(x,y) (x<y?x:y)const double alpha=0.6;
const int N=100005;struct treeNode1 {int l,r,p[2],mx[2],mn[2],sum,val;
} t1[N*40];struct treeNode2 {int l,r,root;
} t2[N*40];int v[N],tot,cnt,wjp,rec,ff,typ;int read() {int x=0,v=1; char ch=getchar();for (;ch<'0'||ch>'9';v=(ch=='-')?(-1):(v),ch=getchar());for (;ch<='9'&&ch>='0';x=x*10+ch-'0',ch=getchar());return x*v;
}void push_up(int x) {t1[x].sum=t1[x].val;t1[x].mn[0]=t1[x].mx[0]=t1[x].p[0];t1[x].mn[1]=t1[x].mx[1]=t1[x].p[1];if (t1[x].l) {t1[x].mx[0]=max(t1[x].mx[0],t1[t1[x].l].mx[0]);t1[x].mx[1]=max(t1[x].mx[1],t1[t1[x].l].mx[1]);t1[x].mn[0]=min(t1[x].mn[0],t1[t1[x].l].mn[0]);t1[x].mn[1]=min(t1[x].mn[1],t1[t1[x].l].mn[1]);t1[x].sum+=t1[t1[x].l].sum;}if (t1[x].r) {t1[x].mx[0]=max(t1[x].mx[0],t1[t1[x].r].mx[0]);t1[x].mx[1]=max(t1[x].mx[1],t1[t1[x].r].mx[1]);t1[x].mn[0]=min(t1[x].mn[0],t1[t1[x].r].mn[0]);t1[x].mn[1]=min(t1[x].mn[1],t1[t1[x].r].mn[1]);t1[x].sum+=t1[t1[x].r].sum;}
}bool cmp(int a,int b) {return (t1[a].p[wjp]==t1[b].p[wjp])?(t1[a].p[!wjp]<t1[b].p[!wjp]):(t1[a].p[wjp]<t1[b].p[wjp]);
}int build(int tl,int tr,int R) {int mid=(tl+tr)>>1; wjp=R;std:: nth_element(v+tl,v+mid,v+tr+1,cmp);if (tl!=mid) t1[v[mid]].l=build(tl,mid-1,!R);if (mid!=tr) t1[v[mid]].r=build(mid+1,tr,!R);push_up(v[mid]); return v[mid];
}void dfs(int now) {v[++v[0]]=now;if (t1[now].l) dfs(t1[now].l);if (t1[now].r) dfs(t1[now].r);t1[now].l=t1[now].r=0;push_up(now);
}void ins(int &now,int fa,int *p,int R) {if (!now) { now=++tot;t1[now].p[0]=t1[now].mx[0]=t1[now].mn[0]=p[0];t1[now].p[1]=t1[now].mx[1]=t1[now].mn[1]=p[1];t1[now].sum=t1[now].val=1;return ;}if (p[R]<t1[now].p[R]) ins(t1[now].l,now,p,!R);else ins(t1[now].r,now,p,!R);push_up(now);if (alpha*t1[now].sum<=t1[t1[now].l].sum) rec=now,ff=fa,typ=R;if (alpha*t1[now].sum<=t1[t1[now].r].sum) rec=now,ff=fa,typ=R;
}void modify(int &now,int tl,int tr,int x,int *p) {if (!now) now=++cnt;rec=ff=typ=0;ins(t2[now].root,0,p,0);if (rec) {int d=(t1[ff].r==rec); v[0]=0;dfs(rec); int tmp=build(1,v[0],typ);if (ff) (d)?(t1[ff].r=tmp):(t1[ff].l=tmp);else t2[now].root=tmp;}if (tl==tr) return ;int mid=(tl+tr)>>1;if (x<=mid) modify(t2[now].l,tl,mid,x,p);else modify(t2[now].r,mid+1,tr,x,p);
}bool check(int now,int x1,int y1,int x2,int y2) {if (t1[now].mx[0]<x1||t1[now].mn[0]>x2) return false;if (t1[now].mx[1]<y1||t1[now].mn[1]>y2) return false;return true;
}int ask(int now,int x1,int y1,int x2,int y2) {if (!check(now,x1,y1,x2,y2)) return 0;if (t1[now].mn[0]>=x1&&t1[now].mx[0]<=x2&&t1[now].mn[1]>=y1&&t1[now].mx[1]<=y2) return t1[now].sum;int res=t1[now].val*(t1[now].p[0]>=x1&&t1[now].p[0]<=x2&&t1[now].p[1]>=y1&&t1[now].p[1]<=y2);res+=ask(t1[now].l,x1,y1,x2,y2);res+=ask(t1[now].r,x1,y1,x2,y2);return res;
}int query(int now,int tl,int tr,int k,int x1,int y1,int x2,int y2) {if (tl==tr) return tl;int mid=(tl+tr)>>1,w=ask(t2[t2[now].l].root,x1,y1,x2,y2);if (w>=k) return query(t2[now].l,tl,mid,k,x1,y1,x2,y2);return query(t2[now].r,mid+1,tr,k-w,x1,y1,x2,y2);
}int main(void) {int n=read(),T=read(),lxf=0;for (int lastans=0;T--;) {int opt=read();if (opt==1) {int x=read()^lastans,y=read()^lastans,v=read()^lastans;int p[2]={x,y};modify(lxf,1,1000000000,v,p);} else {int x1=read()^lastans,y1=read()^lastans,x2=read()^lastans,y2=read()^lastans;int k=read()^lastans; int total=ask(t2[lxf].root,x1,y1,x2,y2);if (total<k) puts("NAIVE!ORZzyz."),lastans=0;else printf("%d\n", lastans=query(1,1,1000000000,total-k+1,x1,y1,x2,y2));}}return 0;
}

bzoj4605 崂山白花蛇草水 权值线段树套kd树相关推荐

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

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

  2. 崂山白花蛇草水 权值线段树套KDtree

    崂山白花蛇草水 权值线段树套KDtree Description 神犇Aleph在SDOI Round2前立了一个flag:如果进了省队,就现场直播喝崂山白花蛇草水.凭借着神犇Aleph的实 力,他轻 ...

  3. 【BZOJ4605】崂山白花蛇草水 权值线段树+kd-tree

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

  4. 【bzoj4605】崂山白花蛇草水 权值线段树套KD-tree

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

  5. BZOJ 4605 崂山白花蛇草水 权值线段树+K-D树

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

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

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

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

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

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

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

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

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

最新文章

  1. [导入]sqlserver2005 数据挖掘控件研究
  2. 最近面试,笔试题中的一道sql题
  3. 更改文件和目录(及子目录)的拥有者
  4. 关联分析算法(一)——Apriori(先验算法)
  5. C# Invoke 和 BeginInvoke的区别和共同点
  6. QCA9377 QCA1023系列蓝牙WiFi二合一模块方案选型参考
  7. 骑士php授权,骑士人才系统伪静态设置教程
  8. 怎么提高文公写作水平?公文写作请示类模板
  9. 工业相机的50个知识点
  10. 使用EXCEL计算并绘制RSI指标
  11. 基于Android9.0,了解启动流程
  12. 【JAVA】经典排序算法,注释详细+可直接运行
  13. 如何用html5制作抽奖游戏,原生js实现抽奖小游戏
  14. 论文阅读13:ENHANCING COLLABORATIVE FILTERING MUSIC RECOMMENDATION BY BALANCING EXPLORATION AND EXPLOITAT
  15. Python(一)数据结构和算法
  16. python画五星红旗
  17. 关于图像的灰度值范围是0-1还是0-255的正确理解运用
  18. 毕业辨答 24PPPT模板
  19. 1.2 Probability Theory (下)
  20. 色噪声原理及matlab代码实现,色噪声原理及matlab代码实现

热门文章

  1. SYD8811 内存和代码的分布
  2. DC综合——学习笔记
  3. 【C语言游戏】太空大战 | SpaceWar(基于EasyX图形库,FPS优化,碰撞判断,drawAlpha绘制透明贴图,音乐播放,源码素材免费分享)
  4. 为什么人人都应该玩儿点儿DIY?
  5. Mongodb使用学习笔记(三)
  6. 数学家对物理学家的鄙视_物理学家的未来经济学
  7. SM1算法的EBC、CBC、OFB模式及其介绍
  8. 代码随想录30——回溯:332重新安排行程、51N皇后、37解数独
  9. 动漫网站-前端网页技术精美网站源码HTML+CSS+JS
  10. 基于Android的便签设计(一)