HDU 4007 Dave 线段树
来源:互联网 发布:星宇周晓萍老公知乎 编辑:程序博客网 时间:2024/05/21 10:20
题意:广场上有许多的人,现在给你一个边长为R的正方形,求正方形最多能框住的人,包括边界。
题解:
#include <algorithm> #include <iostream> using namespace std; #define N 2010 #define L(u) ( u * 2 ) #define R(u) ( u * 2 + 1 ) #define max(a,b) ( a > b ? a : b ) unsigned int Y[N]; struct TreeNode { int l, r, v, add; } node[N*3]; struct Point { unsigned int x, y;int v; } point[N]; bool cmp ( Point & a, Point & b ) { if ( a.x == b.x ) return a.v > b.v; return a.x < b.x; } int bfind ( int l, int r, unsigned int key ) { while ( l <= r ) { int mid = ( l + r ) / 2; if ( Y[mid] == key ) return mid; if ( key < Y[mid] ) r = mid - 1; else l = mid + 1; } return -1; } void build ( int u, int l, int r ) { node[u].l = l; node[u].r = r; node[u].v = node[u].add = 0; if ( l == r ) return; int mid = ( l + r ) / 2; build ( L(u), l, mid ); build ( R(u), mid + 1, r ); } void update ( int u, int l, int r, int val ) { if ( l <= node[u].l && node[u].r <= r ) { node[u].add += val; node[u].v += val; return; } if ( node[u].add != 0 ) { node[L(u)].add += node[u].add; node[L(u)].v += node[u].add; node[R(u)].add += node[u].add; node[R(u)].v += node[u].add; node[u].add = 0; } int mid = ( node[u].l + node[u].r ) / 2; if ( r <= mid ) update ( L(u), l, r, val ); else if ( l > mid ) update ( R(u), l, r, val ); else { update ( L(u), l, mid, val ); update ( R(u), mid + 1, r, val ); } node[u].v = max ( node[L(u)].v, node[R(u)].v ); } int main() { int n, R, x, y, i, j; while ( scanf("%d%d",&n,&R) != EOF ) { for ( i = 1; i <= n; i++ ) { scanf("%d%d",&x,&y); point[i].x = x; point[i].y = y; point[i].v = 1; Y[i] = y; } for ( i = 1; i <= n; i++ ) { point[i+n].x = point[i].x + R; point[i+n].y = point[i].y; point[i+n].v = -1; Y[i+n] = point[i].y + R; } sort ( point+1, point+1+n*2, cmp ); sort ( Y+1, Y+1+n*2 ); for ( i = j = 1; i <= n*2; i++ ) { if ( Y[j] != Y[i] ) Y[++j] = Y[i]; } build ( 1, 1, j ); int l, r, ans = 0; for ( i = 1; i <= n * 2; i++ ) { l = bfind ( 1, j, point[i].y ); r = bfind ( 1, j, point[i].y + R ); update ( 1, l, r, point[i].v ); if ( ans < node[1].v ) ans = node[1].v; } printf("%d\n", ans ); } return 0; }
- HDU 4007 Dave 线段树
- hdu 4007 Dave(线段树+离散化+扫描线)
- HDU 4007 Dave(11年大连 线段树+离散化+扫描线)
- HDU 4007 Dave (线段树扫描线 或 暴力+双扫描线)
- hdu 4007 Dave
- hdu 4007 枚举 Dave
- hdu 4007 Dave
- hdu 4007 Dave
- HDU 4007 Dave
- HDU 4007 Dave 枚举
- hdu 4007 Dave
- HDU 4007 Dave
- HDU 4007 Dave
- hdu 4007 暴力枚举 Dave
- HDU 4007:Dave (枚举)
- HDU--4007[Dave] O(N^2)枚举
- hdu 4007 Dave 求矩形圈点最大值
- HDU 4007 Dave (基本算法-水题)
- 0905日报
- JQERY 报$未定义
- [转]Ultra Fractal教程系列38——蒙版的学习04——微调渐变
- [转]Ultra Fractal教程系列39——蒙版的学习05——图层4:Gaussian Integer
- 才去小米手机那排了个队,发现已经排到115842位了。
- HDU 4007 Dave 线段树
- Doxygen简单经验谈
- 什么是设计模式
- 程序调用存储过程 输出参数返回0的问题
- 提升程序权限
- 用HTML5的Canvas写字的例子
- net 打开后在文件菜单下没有源代码管理项
- java对象的创建与初始化
- HP-Mercury LoadRunner - 可预测系统行为和性能的负载测试工具