[bzoj1935][Shoi2007]Tree 园丁的烦恼 _树状数组
Tree 园丁的烦恼 bzoj-1935 Shoi-2007
题目大意:给定平面上的$n$个点,$m$次查询矩形点个数。
注释:$1\le n,m\le 5\cdot 10^5$。
想法:静态二维数点。
$Orz Winniechen$,真tm敢写$KD-Tree$,虽然$T$了..
正常这种静态的二维数点我们都要请到树状数组。最简单的就是二维树状数组。
但是发现开不下,这样的话我们依据它可以离线这一点,我们将每个询问$(x1,y1)$到$(x2,y2)$变成$4$次查询:
$(x1-1,y1-1),(x1-1,y2),(x2,y1-1),(x2,y2)$把它们哥四个都当成点放入点集。每次都相当于查询$(1,1)$到$balabala$
每个点集中的点有$4$个参数:横纵坐标,种类和系数。
种类就是这个点到底是给定的点还是查询的点。
系数的话就是容斥前面的系数:$(x1-1,y1-1)$和$(x2,y2)$前面是$1$,$(x1-1,y2)$和$(x2,y1-1)$前面是$-1$。
然后我们将点集排序,横坐标递增为第一关键字,纵坐标递增为第二关键字。
紧接着我们顺次枚举每个点,如果这个点的种类是给定点,我们将它压到树状数组里。
是一个树状数组里,我们只开一个树状数组,记录的是小于每个横坐标的点的个数。
这样的话根据我们的关键字可知,每一个有可能更新查询的点都会被提前枚举过。
如果这个点是查询,就直接查询然后累加到对应查询的编号答案上,即可。
最后,附上丑陋的代码... ...
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 1000010
using namespace std;
struct Node
{
int x,y,f,id;//这里跟上述的有些不一样。
//我们用f直接可以同时记录种类和系数。如果f==0,那么就表示这个点是给定的点,反之f=1或-1代表系数,直接累计即可。
}q[N<<2];
int tree[10000010];
int mx=0;
int ans[N];
inline bool cmp(const Node &a,const Node &b)
{
return a.x!=b.x?a.x<b.x:(a.y!=b.y?a.y<b.y:a.id<b.id);
}
int a,b,c,d;
int cnt;
inline int lowbit(int x) {return x&(-x);}
void fix(int x)
{
// if(!x) x++;
// puts("fix");
for(int i=x;i<=mx+1;i+=lowbit(i))
{
// printf("aha %d\n",i);
tree[i]++;
}
}
int query(int x)
{
// puts("query");
int ans=0;
for(int i=x;i>=1;i-=lowbit(i))
{
ans+=tree[i];
}
return ans;
}
int main()
{
int n,m; cin >> n >> m ;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&q[i].x,&q[i].y);
q[i].x++,q[i].y++;
mx=max(mx,q[i].y);
}
cnt=n;
// puts("Fuck 1");
for(int i=1;i<=m;i++)
{
scanf("%d%d%d%d",&a,&b,&c,&d);
c++,d++;
q[++cnt].x=c; q[cnt].y=d; q[cnt].f=1; q[cnt].id=i;//这里不要把系数搞错
q[++cnt].x=c; q[cnt].y=b; q[cnt].f=-1; q[cnt].id=i;
q[++cnt].x=a; q[cnt].y=d; q[cnt].f=-1; q[cnt].id=i;
q[++cnt].x=a; q[cnt].y=b; q[cnt].f=1; q[cnt].id=i;
}
// printf("Gun %d\n",cnt);
// puts("Fuck 2");
sort(q+1,q+cnt+1,cmp);
for(int i=1;i<=cnt;i++)
{
// printf("Shit %d\n",i);
if(!q[i].id) fix(q[i].y);
else ans[q[i].id]+=query(q[i].y)*q[i].f;//这就是直接压到一个变量的好处,不用特判直接加就行了,反正如果是给定点f就是0,不会影响答案。
}
// puts("Fuck 3");
for(int i=1;i<=m;i++)
{
printf("%d\n",ans[i]);
}
return 0;
}
小结:这个想法极其常用,很多静态可离线二维数点问题都可以用这个来解决。那些动态的就让KD-Tree上吧,反正出了那种题被卡常的不可能只有你一个人/手动滑稽
[bzoj1935][Shoi2007]Tree 园丁的烦恼 _树状数组的更多相关文章
- [BZOJ1935][SHOI2007]Tree 园丁的烦恼(树状数组)
		
题目描述 很久很久以前,在遥远的大陆上有一个美丽的国家.统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各种奇花异草. 有一天国王漫步在花园里,若有所思,他问一个园丁道: “最近我在思 ...
 - [bzoj1935][shoi2007]Tree 园丁的烦恼(树状数组+离线)
		
1935: [Shoi2007]Tree 园丁的烦恼 Time Limit: 15 Sec Memory Limit: 357 MBSubmit: 980 Solved: 450[Submit][ ...
 - BZOJ1935: [Shoi2007]Tree 园丁的烦恼
		
1935: [Shoi2007]Tree 园丁的烦恼 Time Limit: 15 Sec Memory Limit: 357 MBSubmit: 552 Solved: 220[Submit][ ...
 - bzoj千题计划143:bzoj1935: [Shoi2007]Tree 园丁的烦恼
		
http://www.lydsy.com/JudgeOnline/problem.php?id=1935 二维偏序问题 排序x,离散化树状数组维护y #include<cstdio> #i ...
 - BZOJ1935: [Shoi2007]Tree 园丁的烦恼(树状数组 二维数点)
		
题意 题目链接 Sol 二维数点板子题 首先把询问拆成四个矩形 然后离散化+树状数组统计就可以了 // luogu-judger-enable-o2 #include<bits/stdc++.h ...
 - [BZOJ1935][SHOI2007]Tree 园丁的烦恼(离线+树状数组)
		
题意 给出第一象限的n个点,有m次询问,每次询问一个矩形中的点的个数.(0<=n,m<=500000,0<=xi,yi<=10000000) 题解 一眼望去不可做. 用二位前缀 ...
 - 初涉二维数点问题&&bzoj1935: [Shoi2007]Tree 园丁的烦恼
		
离线好评 Description 很久很久以前,在遥远的大陆上有一个美丽的国家.统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各种奇花异草.有一天国王漫步在花园里,若有所思,他问一个 ...
 - 【树状数组】bzoj1935 [Shoi2007]Tree 园丁的烦恼
		
把y坐标离散化后,按x坐标排序,把询问拆成四个点,每次询问某个点左下角的点的个数,注意处理边界和重叠的情况. #include<cstdio> #include<algorithm& ...
 - [bzoj4822][Cqoi2017]老C的任务&[bzoj1935][Shoi2007]Tree 园丁的烦恼
		
来自FallDream的博客,未经允许,请勿转载,谢谢. 老 C 是个程序员. 最近老 C 从老板那里接到了一个任务——给城市中的手机基站写个管理系统.作为经验丰富的程序员,老 C 轻松地完成 ...
 
随机推荐
- 虚拟化技术概要之VMM结构
			
1. 概述 当前主流的 VMM (Virtual Machine Monitor) 实现结构可以分为三类: 宿主模型 (OS-hosted VMMs)Hypervisor 模型 (Hypervisor ...
 - 数据库异常 :java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
			
最近在新项目中突然出现了 java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES) ...
 - linux下 yum相关
			
1.1 什么是yum源 Yellowdog Updater, Modified 一个基于RPM包管理的字符前端软件包管理器. 能够从指定的服务器自动下载RPM包并且安装,可以处理依赖性关系,并且一次安 ...
 - [Swift通天遁地]六、智能布局-(2)视图对象的尺寸和位置相对约束
			
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
 - web自动化测试—selenium游览器下拉框操作
			
# coding=utf-8'''下拉框实战思路导包:from selenium.webdriver.support.select import Select #下拉框select from sele ...
 - http通讯基础
			
1 . 一个网页包括 JS CSS Html 2 . 状态码:200 正常 302 临时重定向 (类似呼叫转移) 304 未修改,客户端缓存的信息是最新的,无需到服务器重新获取 403 ...
 - JS属性defer
			
其实就是简单的利用defer属性,让浏览器读JS脚本的时候完全不等脚本开始读就开始读下面的图片啊,html代码了.然后让js脚本自己在那里慢慢读取完以后再执行. 给外链的js脚本添加defer=& ...
 - Ajax实现文件的上传
			
Ajax实现文件的上传 准备 ajax的参数补充 type不写的话默认是GET dataType和ContentType: dataType: 浏览器发给服务器希望返回的数据类型 .. 如果明确地指定 ...
 - 生成错误:对路径".dll"的访问被拒绝
			
第一步:检查dll所在的目录的访问权限,右键文件夹>属性>安全>设置添加EveryOne用户并将完全控制的权限赋给它. 如果问题还没有解决,请不要一遍遍的重启,看第二步: 第二步:右 ...
 - ProE复杂曲线方程:Python Matplotlib 版本代码(L系统,吸引子和分形)
			
对生长自动机的研究由来已久,并在计算机科学等众多学科中,使用元胞自动机的概念,用于生长模拟.而复杂花纹的生成,则可以通过重写一定的生长规则,使用生成式来模拟自然纹理.当然,很多纹理是由人本身设计的,其 ...