初涉二维数点问题&&bzoj1935: [Shoi2007]Tree 园丁的烦恼
离线好评
Description
Input
Output
题目分析
#include<bits/stdc++.h>
const int maxn = ; struct node
{
int x,y,lb,fr;
bool operator < (node a) const
{
return x==a.x?lb<a.lb:x<a.x;
}
}f[*maxn];
int n,m,cnt,tot;
int sum[maxn],ans[maxn][];
int a[maxn],b[maxn],c[maxn],d[maxn],x[maxn],y[maxn],p[*maxn]; int lowbit(int x){return x&-x;}
void add(int x){for (; x<=cnt; x+=lowbit(x)) sum[x]++;}
int query(int x)
{
int ret = ;
for (; x; x-=lowbit(x))
ret += sum[x];
return ret;
}
int read()
{
char ch = getchar();
int num = ;
for (; !isdigit(ch); ch = getchar());
for (; isdigit(ch); ch = getchar())
num = (num<<)+(num<<)+ch-;
return num;
}
int main()
{
n = read(), m = read();
for (int i=; i<=n; i++)
x[i] = read()+, y[i] = read()+, p[++cnt] = y[i];
for (int i=; i<=m; i++)
a[i] = read()+, b[i] = read()+, c[i] = read()+, d[i] = read()+,
p[++cnt] = b[i], p[++cnt] = d[i];
std::sort(p+, p+cnt+);
cnt = std::unique(p+, p+cnt+)-p-;
for (int i=; i<=n; i++)
y[i] = std::lower_bound(p+, p+cnt+, y[i])-p,
f[++tot].x = x[i], f[tot].y = y[i];
for (int i=; i<=m; i++)
{
b[i] = std::lower_bound(p+, p+cnt+, b[i])-p;
d[i] = std::lower_bound(p+, p+cnt+, d[i])-p;
f[++tot].x = a[i]-, f[tot].y = b[i]-, f[tot].lb = ,f[tot].fr = i;
f[++tot].x = a[i]-, f[tot].y = d[i], f[tot].lb = ,f[tot].fr = i;
f[++tot].x = c[i], f[tot].y = b[i]-, f[tot].lb = ,f[tot].fr = i;
f[++tot].x = c[i], f[tot].y = d[i], f[tot].lb = ,f[tot].fr = i;
}
std::sort(f+, f++tot);
for (int i=; i<=tot; i++)
if (f[i].lb) ans[f[i].fr][f[i].lb] = query(f[i].y);
else add(f[i].y);
for (int i=; i<=m; i++)
printf("%d\n",ans[i][]+ans[i][]-ans[i][]-ans[i][]);
return ;
}
这里是cdq做法:
#include<bits/stdc++.h>
const int maxn = ;
const int maxk = ; struct point
{
int x,y,lb,mt;
point() {}
point(int a, int b, int c, int d):x(a),y(b),lb(c),mt(d) {}
bool operator < (point a) const
{
return x==a.x?abs(mt) < abs(a.mt):x < a.x;
}
}f[maxn*],s[maxn*];
int n,m,cnt,dfn,maxy;
int sum[maxk],tim[maxk],ans[maxn]; int lowbit(int x){return x&-x;}
void add(int x)
{
for (; x <= maxy; x += lowbit(x))
{
if (tim[x] != dfn) tim[x] = dfn, sum[x] = ;
sum[x]++;
}
}
int query(int x)
{
int ret = ;
for (; x; x -= lowbit(x))
if (tim[x] == dfn)
ret += sum[x];
return ret;
}
int read()
{
char ch = getchar();
int num = ;
for (; !isdigit(ch); ch = getchar());
for (; isdigit(ch); ch = getchar())
num = (num<<)+(num<<)+ch-;
return num;
}
void cdq(int l, int r)
{
if (l >= r) return;
int mid = (l+r)>>, L = l, R = mid+, now = l;
cdq(l, mid);
cdq(mid+, r);
dfn++;
while (L <= mid && R <= r)
if (f[L] < f[R]){
if (!f[L].mt) add(f[L].y);
s[now++] = f[L++];
}else{
if (f[R].mt) ans[f[R].lb] += f[R].mt*query(f[R].y);
s[now++] = f[R++];
}
while (L <= mid) s[now++] = f[L++];
while (R <= r)
{
if (f[R].mt) ans[f[R].lb] += f[R].mt*query(f[R].y);
s[now++] = f[R++];
}
for (int i=l; i<=r; i++) f[i] = s[i];
}
int main()
{
n = read(), m = read();
for (int i=; i<=n; i++)
f[++cnt].x = read()+, f[cnt].y = read()+, maxy = std::max(maxy, f[cnt].y);
for (int i=; i<=m; i++)
{
int a = read()+, b = read()+, c = read()+, d = read()+;
f[++cnt] = point(a-, b-, i, );
f[++cnt] = point(c, d, i, );
f[++cnt] = point(a-, d, i, -);
f[++cnt] = point(c, b-, i, -);
maxy = std::max(maxy, std::max(b, d));
}
cdq(, cnt);
for (int i=; i<=m; i++)
printf("%d\n",ans[i]);
return ;
}
初涉二维数点问题&&bzoj1935: [Shoi2007]Tree 园丁的烦恼的更多相关文章
- [bzoj1935][shoi2007]Tree 园丁的烦恼(树状数组+离线)
1935: [Shoi2007]Tree 园丁的烦恼 Time Limit: 15 Sec Memory Limit: 357 MBSubmit: 980 Solved: 450[Submit][ ...
- bzoj千题计划143:bzoj1935: [Shoi2007]Tree 园丁的烦恼
http://www.lydsy.com/JudgeOnline/problem.php?id=1935 二维偏序问题 排序x,离散化树状数组维护y #include<cstdio> #i ...
- BZOJ1935: [Shoi2007]Tree 园丁的烦恼
1935: [Shoi2007]Tree 园丁的烦恼 Time Limit: 15 Sec Memory Limit: 357 MBSubmit: 552 Solved: 220[Submit][ ...
- BZOJ1935: [Shoi2007]Tree 园丁的烦恼(树状数组 二维数点)
题意 题目链接 Sol 二维数点板子题 首先把询问拆成四个矩形 然后离散化+树状数组统计就可以了 // luogu-judger-enable-o2 #include<bits/stdc++.h ...
- [bzoj1935][Shoi2007]Tree 园丁的烦恼 _树状数组
Tree 园丁的烦恼 bzoj-1935 Shoi-2007 题目大意:给定平面上的$n$个点,$m$次查询矩形点个数. 注释:$1\le n,m\le 5\cdot 10^5$. 想法:静态二维数点 ...
- [bzoj4822][Cqoi2017]老C的任务&[bzoj1935][Shoi2007]Tree 园丁的烦恼
来自FallDream的博客,未经允许,请勿转载,谢谢. 老 C 是个程序员. 最近老 C 从老板那里接到了一个任务——给城市中的手机基站写个管理系统.作为经验丰富的程序员,老 C 轻松地完成 ...
- [BZOJ1935][SHOI2007]Tree 园丁的烦恼(离线+树状数组)
题意 给出第一象限的n个点,有m次询问,每次询问一个矩形中的点的个数.(0<=n,m<=500000,0<=xi,yi<=10000000) 题解 一眼望去不可做. 用二位前缀 ...
- bzoj1935: [Shoi2007]Tree 园丁的烦恼lowbit 离散化
链接 bzoj 最好不要去luogu,数据太水 思路 一个询问转化成四个矩阵,求起点\((0,0)到(x,y)\)的矩阵 离线处理,离散化掉y,x不用离散. 一行一行的求,每次处理完一行之后下一行的贡 ...
- BZOJ1935:[SHOI2007]Tree 园丁的烦恼(CDQ分治)
Description 很久很久以前,在遥远的大陆上有一个美丽的国家.统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各种奇花异草.有一天国王漫步在花园里,若有所思,他问一个园丁道: ...
随机推荐
- IT兄弟连 JavaWeb教程 Servlet会话跟踪 Cookie的优缺点
Cookie技术存储的数据类型只能是字符串,且不支持中文 ● 保存的数据大小有限,4kb ● 太依赖用户浏览器的设置,用户可以禁用Cookie! ● 数据存储在客户端的文本文件中,不安全,不建议 ...
- Sql Server2008R2与IDEA的连接
数据库的连接笔者搞了一天,参阅了众多连接方案,大部分都是Eclipse和My sql,笔者一遍一遍的调试,终于皇天不负有心人,成绩先摆出来 为了让更多的新手能少走弯路,话不多说,上干货 首先,我们需要 ...
- 5 天 4000 star 的一个爆款开源项目
今天早上起来浏览 GitHub 的时候,在周热门趋势排行榜上看到了这么一个开源项目,仅仅 5 天时间,爬到了周排行榜的第一名的位置.而在每天的排行榜上,今天一早也高高位居排行榜的第二位. 这个开源项目 ...
- Requests 入门
首先直接通过管理员运行cmd,然后执行 pip install requests 就可以直接安装Requests库了 有个最基本的语句 r = requests.get(url) 通过request ...
- UILabel和UIbutton(富文本)封装方法
/** 方法说明:设置label的富文本属性 参数说明:contentStr富文本内容 textColor字体颜色 rangeSet设置字体颜色及大小的位置 */ - (UILabel *)backf ...
- Tinghua Data Mining 7
SVM B分割得更加无偏 比较公平 卡着分界面的点叫支持向量,就好比托着分界面 支持向量决定了可移动的范围,这个范围就叫margin 分界面可移动的距离 前提是先要被分对 对偶问题一般是不等价的,但是 ...
- Qt 2D绘图之五:图形视图框架的结构和坐标系统
一.图形视图框架的结构 在前面讲的基本绘图中,我们可以自己绘制各种图形,并且控制它们.但是,如果需要同时绘制很多个相同或不同的图形,并且要控制它们的移动.检测它们的碰撞和叠加:或者我们想让自己绘制的图 ...
- 盒子模型--IE与标准
从上图可以看到标准 W3C 盒子模型的范围包括 margin.border.padding.content,并且 content 部分不包含其他部分. 从上图可以看到 IE 盒子模型的范围也包括 ma ...
- iOS 画圆图片的几种方法
方法一: self.cycleImv= [[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 50, 50)]; [self.view addS ...
- Windows上SVN服务器搭建【转】
Subversion是优秀的版本控制工具,其具体的的优点和详细介绍,这里就不再多说.本文介绍Windows上 VisualSVN server 服务端和 TortoiseSVN客户端搭配使用: 现在S ...