luoguP2163 [SHOI2007]园丁的烦恼
安利系列博文
https://www.cnblogs.com/tyner/p/11565348.html
https://www.cnblogs.com/tyner/p/11605073.html
题意
https://www.luogu.org/problem/P2163
如摘要所示,二位静态数点
分析
离线下来
先,按照y为第一关键字,x为第二关键字排序,把n个数点,和询问的4*m个点都加进去,然后优先数点
这样就可以用关于 x 的树状数组进行求和和加点操作,进而用查询矩形的四个端点的sum加加减减就好了
可是这代码不知道为什么RE了一个点,,,以后再调吧
小伙伴们记得提醒博主这个傻子哦...
或者大佬能帮我调调....
(RE对于博主来说,只是常规操作..)
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAX = 500000+99;
const int INF = 2147000047;
int n,m;
int t[MAX];
struct node{
int xx, x, y;//x为离散化之后的x坐标
int is;//is = 1表示数点, 0表示查询点
//这样我们就可以在排序的时候分清数点与查询点 ,并且优先数点了
int id;
//用以按要求输出答案
node(int xx=0, int y=0, int is=0, int id=0) : xx(xx), y(y), is(is), id(id) {}
}d[MAX*5];
bool cmp1(node a, node bb) {
if(a.y == bb.y) {
if(a.x == bb.x) return a.is > bb.is;
return a.x < bb.x;
}
return a.y < bb.y;
}
bool cmp2(node a, node bb) {
return a.xx < bb.xx;
}
int cnt, max_x, ans[MAX];//ans[id] = 第id个查询点的前缀和
void add_node(int xx, int y, int is, int id) {
++cnt;
d[cnt] = node(xx, y, is, id);
}
bool cmp3(node a, node bb) {
return a.id < bb.id;
}
void add(int x, int k) { while(x <= max_x) t[x] += k, x += x&(-x);}
int query(int x) {
int res = 0;
while(x) res += t[x], x -= x&(-x);
return res;
}
void init() {
scanf("%d%d",&n,&m);
int x1, y1, x2, y2;
for(int i = 1; i <= n; i++) {
scanf("%d%d",&x1, &y1);
add_node(x1, y1, 1, INF);
}
for(int i = 1; i <= (m<<2); i += 4) {
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
add_node(x2, y2, 0, i);
add_node(x1-1, y2, 0, i+1);
add_node(x2, y1-1, 0, i+2);
add_node(x1-1, y1-1, 0, i+3);
}
sort(d+1, d+1+cnt, cmp2);
int tot = 1;
d[1].x = 1;//记得初始化成1
for(int i = 2; i <= cnt; i++) {
if(d[i].xx != d[i-1].xx) ++tot;
d[i].x = tot;
}
max_x = d[cnt].x;
// for(int i = 1; i <= cnt; i++) {
// if(d[i].is == 1) printf("数点:");
// else printf("查询点%d为", d[i].id);
// printf("%d %d\n", d[i].x, d[i].y);
// }
}
void print_ans() {
sort(d+1, d+1+cnt, cmp3);
for(int i = 1; i <= (m<<2); i += 4) printf("%d\n", ans[i]-ans[i+1]-ans[i+2]+ans[i+3]);
}
void solve() {
sort(d+1, d+cnt+1, cmp1);
for(int i = 1; i <= cnt; i++) {
if(d[i].is == 1) add(d[i].x, 1);//会重复加点吗
else ans[d[i].id] = query(d[i].x);
}
print_ans();
}
int main() {
init();
solve();
return 0;
}
/*
3 1
0 0
0 1
1 0
0 0 1 1
*/
luoguP2163 [SHOI2007]园丁的烦恼的更多相关文章
- [LuoguP2163][SHOI2007]园丁的烦恼_CDQ分治
园丁的烦恼 题目链接:https://www.luogu.org/problem/P2163 数据范围:略. 题解: 树套树过不去,那就$CDQ$分治好了. 有点小细节,但都是$CDQ$分治必要的. ...
- P2163 [SHOI2007]园丁的烦恼
题目 P2163 [SHOI2007]园丁的烦恼 做法 关于拆点,要真想拆直接全部用树状数组水过不就好了 做这题我们练一下\(cdq\)分治 左下角\((x1,y1)\)右上角\((x2,y2)\), ...
- bzoj1935 [Shoi2007]园丁的烦恼
bzoj1935 [Shoi2007]园丁的烦恼 有N个点坐标为(xi,yi),M次询问,询问(a,b)-(c,d)的矩形内有多少点. 0≤n≤500000,1≤m≤500000,0≤xi,yi≤10 ...
- 洛谷 P2163 [SHOI2007]园丁的烦恼 (离线sort,树状数组,解决三维偏序问题)
P2163 [SHOI2007]园丁的烦恼 题目描述 很久很久以前,在遥远的大陆上有一个美丽的国家.统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各种奇花异草. 有一天国王漫步在花园 ...
- P2163 【[SHOI2007]园丁的烦恼】
其实是不用把一个询问拆成四个的 把询问转化为数学语言: 对于每个查询,询问满足$a<=x<=b$且$c<=y<=d$的点$x,y$的个数 ~~自然~~想到偏序问题,看到有两个式 ...
- P2163 [SHOI2007]园丁的烦恼(cdq分治)
思路 其实是cdq的板子 题目要求询问对于每个给出的xi,yi,xj,yj形如xi<=x<=xj.yi<=y<=yj的x,y对数有多少组 改成四个询问,拆成四个前缀和的形式后就 ...
- BZOJ1935或洛谷2163 [SHOI2007]园丁的烦恼
BZOJ原题链接 洛谷原题链接 很容易想到二维前缀和. 设\(S[i][j]\)表示矩阵\((0, 0)(i, j)\)内树木的棵数,则询问的矩形为\((x, y)(xx, yy)\)时,答案为\(S ...
- [SHOI2007]园丁的烦恼
裸的二维数点 #include"cstdio" #include"cstring" #include"iostream" #include& ...
- 【[SHOI2007]园丁的烦恼】
\(CDQ\) 分治的神奇操作 这个问题跟偏序问题好像差的不小啊 但是就是可以转化过去 对于一个查询我们可以把它拆成四个,也就是用二维前缀和的方式来查询 我们发现其实前缀和的定义就是多少个点的横纵坐标 ...
随机推荐
- Scrapy安装和简单使用
模块安装 Windows 安装scrapy 需要安装依赖环境twisted,twisted又需要安装C++的依赖环境 pip install scrapy 时 如果出现twisted错误 在http ...
- Java核心(一)深入理解BIO、NIO、AIO
目标: BIO.NIO.AIO 的区别是什么? 同/异步.阻/非阻塞的区别是什么? 文件读写最优雅的实现方式是什么? NIO 如何实现多路复用功能? 一,IO的介绍: (1)IO的全称其实是:Inpu ...
- 【bzoj4945】[Noi2017]游戏(搜索+2-sat)
bzoj 洛谷 题意: 现在有\(a,b,c\)三种车,每个赛道可能会存在限制:\(a\)表示不能选择\(a\)类型的赛车,\(b,c\)同理:\(x\)表示该赛道不受限制,但\(x\)类型的个数$\ ...
- Idea为类生成序列号(十一)
新建一个测试的实体类Gradle,实现java.io.Serializable接口,选择类名,按Alt+Enter键,出现的提示框中没有生成serialVersionUID的提示,这个需要设置之后才会 ...
- Sphinx 2.0.8 发布,全文搜索引擎 Installing Sphinx on Windows
参考资料地址信息 http://sphinxsearch.com/docs/latest/installing-windows.html http://my.oschina.net/melonol/b ...
- Win32 程序开发入门:一个最简单的Win32程序
一.什么是 Win32 Win32 是指 Microsoft Windows 操作系统的 32 位环境,与 Win64 都为 Windows 常见环境. 这里再介绍下 Win32 Applicatio ...
- IT兄弟连 HTML5教程 HTML和CSS的关系
HTML是描述网页的标记语言,是将内容放到网页上,虽然HTML本身也自带一些样式功能,通过自身的属性,来实现一些特定的效果,制作出来的只能是一个网页,而不是一个美观的网页.最主要的是在HTML里面,一 ...
- redis设置、查看和校验密码
Redis没有实现访问控制这个功能,但是它提供了一个轻量级的认证方式(密码),可以通过编辑[redis.conf]配置文件来启用认证,这里简单介绍一下Redis中如何设置.查看和校验密码(登录验证和操 ...
- hibernate关联关系(多对多)
数据库的多对多数据库中不能直接映射多对多 处理:创建一个桥接表(中间表),将一个多对多关系转换成两个一对多 注:数据库多表联接查询 永远就是二个表的联接查询 注2:交叉连接 注3:外连接:left(左 ...
- MySQL入门——在Linux下安装和卸载MariaDB
MySQL入门——在Linux下安装和卸载MariaDB 摘要:本文主要学习了如何在Linux系统中安装和卸载MariaDB数据库. 查看有没有安装过MariaDB 使用命令查看有没有安装过: [ro ...