[bzoj4605]崂山白花蛇草水 k-d tree 带替罪羊重构
4605: 崂山白花蛇草水
Time Limit: 80 Sec Memory Limit: 512 MB
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1 1 1 1
1 2 2 3
1 4 1 2
1 3 4 4
2 1 1 4 1 3
2 2 2 3 5 4
2 2 1 4 4 2
Sample Output
NAIVE!ORZzyz.
3
HINT
Source
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 |
---|---|---|---|---|---|---|---|---|
#18327 | #99. 【BZOJ #4605】崂山白花蛇草水 | yjqqqaq | 100 | 2690ms | 27364kb | C++ | 3.5kb | 2017-08-21 20:13:50 |
#3278 | #99. 【BZOJ #4605】崂山白花蛇草水 | smallfat | 100 | 7771ms | 61976kb | C++ | 5.3kb | 2017-02-11 21:39:10 |
#3271 | #99. 【BZOJ #4605】崂山白花蛇草水 | abcd | 100 | 8099ms | 109108kb | C++ | 4.6kb | 2017-02-11 21:09:38 |
#4111 | #99. 【BZOJ #4605】崂山白花蛇草水 | std | 100 | 11307ms | 301792kb | C++ | 5.9kb | 2017-02-21 10:30:06 |
#2942 | #99. 【BZOJ #4605】崂山白花蛇草水 | chenxun | 100 | 12971ms | 301792kb | C++ | 5.9kb | 2017-02-06 17:26:00 |
#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std;
const double A = 0.8;
const int N = 100005, M = 1600005;
struct Node{ int l,r,mx[2],mn[2],d[2],siz; }t[M];
int n,k,X1,Y1,X2,Y2,ans,cmpp,op;
int tmp[N],need[N],deep,cnt,cur;
int T[M],l[M],r[M],tot=1;
bool cmp( int a, int b ){ return t[a].d[cmpp] < t[b].d[cmpp]; }
void umax( int &a, int b ){ if( a < b ) a = b; }
void umin( int &a, int b ){ if( a > b ) a = b; }
void update( int x ){t[x].siz = t[t[x].l].siz + t[t[x].r].siz + 1;if( t[x].l ){umax( t[x].mx[0], t[t[x].l].mx[0] );umax( t[x].mx[1], t[t[x].l].mx[1] );umin( t[x].mn[0], t[t[x].l].mn[0] );umin( t[x].mn[1], t[t[x].l].mn[1] );} if( t[x].r ){umax( t[x].mx[0], t[t[x].r].mx[0] );umax( t[x].mx[1], t[t[x].r].mx[1] );umin( t[x].mn[0], t[t[x].r].mn[0] );umin( t[x].mn[1], t[t[x].r].mn[1] );}
}
int build( int l, int r , int D ){int mid = (l+r)>>1; cmpp = D;nth_element( need+l+1, need+mid+1, need+r+1, cmp );int x = need[mid];t[x].mx[0] = t[x].mn[0] = t[x].d[0];t[x].mx[1] = t[x].mn[1] = t[x].d[1];t[x].l = ( l^mid ) ? build( l, mid-1, D^1 ) : 0;t[x].r = ( r^mid ) ? build( mid+1, r, D^1 ) : 0;update(x); return x;
}
void dfs( int x ){ if(x) need[++cnt] = x, dfs(t[x].l), dfs(t[x].r); }
void ins( int &root, int now ){if(!root){ root = now; return; }for( int D = deep = 0, x = root; ; D ^= 1 ){tmp[++deep] = x;umax( t[x].mx[0], t[now].mx[0] );umax( t[x].mx[1], t[now].mx[1] );umin( t[x].mn[0], t[now].mn[0] );umin( t[x].mn[1], t[now].mn[1] );t[x].siz++;if( t[now].d[D] >= t[x].d[D] ){if( !t[x].r ) { t[x].r = now; break; } else x = t[x].r;}else{if( !t[x].l ) { t[x].l = now; break; } else x = t[x].l;}}tmp[++deep] = now;if( deep < log(t[root].siz)/log(1/A)) return;while( (double)t[t[now].l].siz < A*t[now].siz && (double)t[t[now].r].siz < A*t[now].siz ) now = tmp[--deep];if(!now) return;if( now == root ){cnt = 0; dfs(root);root = build( 1, cnt, 0 );return ;}int y = tmp[--deep];cnt = 0; dfs(now);int k = build( 1, cnt, deep&1 );if( t[y].l == now ) t[y].l = k; else t[y].r = k;
}
void ask( int x ){if( !x || t[x].mx[0]<X1 || t[x].mn[0]>X2 || t[x].mx[1]<Y1 || t[x].mn[1]>Y2 || ans>=k ) return;if( t[x].mn[0]>=X1 && t[x].mx[0]<=X2 && t[x].mn[1]>=Y1 && t[x].mx[1]<=Y2 ){ ans += t[x].siz; return;}if( t[x].d[0]>=X1 && t[x].d[0]<=X2 && t[x].d[1]>=Y1 && t[x].d[1]<=Y2 ) ans++;ask( t[x].l ); ask( t[x].r );
}
void add(){int x = 1, a = 1, b = 1000000000, mid, flag = 1;while(1){if(flag){cur++;t[cur].mx[0] = t[cur].mn[0] = t[cur].d[0]=X1;t[cur].mx[1] = t[cur].mn[1] = t[cur].d[1]=Y1;t[cur].siz = 1; ins(T[x],cur);}if( a == b ) return;mid = (a+b)>>1;if( k <= mid ){if( !l[x] ) l[x] = ++tot;x = l[x], b = mid, flag = 0;} else{if( !r[x] ) r[x] = ++tot;x = r[x], a = mid+1, flag = 1;}}
}
void query(){ans = 0; ask(T[1]);if( ans < k ){puts("NAIVE!ORZzyz.");ans = 0; return;}int x=1,a=1,b=1000000000,mid;while( a < b ){mid = (a+b)>>1;ans = 0, ask( T[r[x]] );if( ans >= k ) x = r[x], a = mid+1;else k -= ans, x = l[x], b = mid;}printf("%d\n", ans=a);
}
int main(){scanf("%d", &n); scanf("%d", &n);while(n--){scanf("%d%d%d", &op, &X1, &Y1);if( op == 1 ){scanf("%d", &k);add();} else{scanf("%d%d%d", &X2, &Y2, &k);query();}}return 0;
}
[bzoj4605]崂山白花蛇草水 k-d tree 带替罪羊重构相关推荐
- bzoj4605: 崂山白花蛇草水 //替罪羊式重构k-d树
bzoj4605: 崂山白花蛇草水 题意 Q(<=100000)次操作,支持: 在二维平面上插入一个坐标(x,y)(x,y<=500000),点权为v(<=1e9)的点: 查询矩形区 ...
- bzoj4605: 崂山白花蛇草水 权值线段树套KDtree
bzoj4605: 崂山白花蛇草水 链接 bzoj loj 思路 强制在线,那就权值线段树套KDtree好了,没啥好讲的. KDtree要加平衡因子来重构.另外,那水真难喝. 错误 树套树一边写过了, ...
- 【线段树套KD树】[BZOJ4605]崂山白花蛇草水
题目描述 Description 神犇Aleph在SDOI Round2前立了一个flag:如果进了省队,就现场直播喝崂山白花蛇草水.凭借着神犇Aleph的实 力,他轻松地进了山东省省队,现在便是他履 ...
- bzoj4605 崂山白花蛇草水(动态开点线段树逃替罪羊重构K-D tree)
首先我们发现它是一个三维的问题而且还强制在线 囧 我们可以考虑在外面来一个权值线段树,然后每次查询时在线段树二分即可,这样我们每个节点再套一棵K-D tree,用来查询有多少个点被框住了,然后因为是不 ...
- bzoj4605 崂山白花蛇草水
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4605 [题解] 序列上的第k大我们可以用线段树内套一个能查询序列某些地方有多少数的数据结构来 ...
- bzoj4605 崂山白花蛇草水 权值线段树套kd树
Description Q次操作,要求资瓷 在(x,y)处放一个数字x 查询(x1,y1)到(x2,y2)矩形内第k大 Solution 非常裸的权值线段树套kd树,为了保证复杂度可以定期重构也可以平 ...
- BZOJ4605 : 崂山白花蛇草水
外层维护权值线段树,内层维护kd-tree. 修改的时候只往右儿子里插入,不平衡的时候替罪羊式重构. 查询的时候在外层线段树上走,在内层kd-tree上查询矩形内点数即可. 时间复杂度$O(q\log ...
- bzoj4605: 崂山白花蛇草水(权值线段树套k-dtree)
题目 #include<bits/stdc++.h> using namespace std; #define mid (l+r>>1) const int N=100002, ...
- [BZOJ4605]崂山白花蛇草水(主席树套kd-tree)
题意:两种操作,在二维平面插入一个点及其权值,查询矩形区间第k大,强制在线. 之前考试考过一个矩形区间第k大的题..当时想了各种树套树套树,算了算复杂度都没有暴力快..后来憋了个kd-tree套主席树 ...
最新文章
- 省二c语言笔试试卷,2005年春浙省二级C语言笔试试卷.doc
- Apache Kafka-max.poll.interval.ms参数含义说明
- powershell 备份文件脚本
- iis无法启动计算机上的服务器,Win7系统iis无法启动怎么解决?
- IAsyncResult异步设计
- 解决CI框架的Disallowed Key Characters错误提示
- easyui源码翻译1.32--ValidateBox(验证框)
- qwt自定义时间标尺TimeScale
- 知道世界越大,就会觉得你越小
- script-百度换肤效果
- 彻底理解position与anchorPoint - Wonderffee's Blog(转)
- DPad down是哪个键_投影仪前3甲PK:双十一坚果J7S和当贝D3X投影仪选择哪个
- 如何判断自己的Windows系统是否为盗版系统?
- 关于流行的几点思考——《引爆点》读书笔记
- matlab实现振动弹簧的实时动画,Matlab实现振动弹簧的实时动画
- pspice计算机仿真实验,基于OrCAD_PSpice二阶动态电路的计算机仿真分析
- springboot项目启动参数详解
- 汽车电子功能安全标准ISO26262解析(十二)——HARA分析
- 指南-安卓/Linux应用指南-RNDIS
- OLTP+OLAP->HTAP