安利系列博文

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
*/

最新文章

  1. Linux 安装Mono环境 运行ASP.NET(二)
  2. 相机标定简介与MatLab相机标定工具箱的使用(未涉及原理公式推导)
  3. ACdream 1128 Maze(费用流)
  4. HDU 3333 树状数组离线查询
  5. 读者写者问题(有bug 后续更改)
  6. hdu 2852 树状数组
  7. 发送带有认证信息的HTTP请求并取回响应
  8. Publisher/Subscriber(发布/订阅者)消息模式开发流程
  9. python 全栈开发之路 day1
  10. ASIHTTPRequest 详解 例子
  11. Oracle PLSQL笔记(过程的创建和及调用)
  12. xml学习_上篇
  13. 使用org.apache.commons.logging打日志注意事项
  14. day-5 python协程与I/O编程深入浅出
  15. [2017.4.7校内训练赛by hzwer]
  16. iOS学习——核心动画之Layer基础
  17. Scala知识点汇总
  18. Html富文本编辑器
  19. developer的996,需要谁来拯救
  20. centos7下zabbix安装与部署

热门文章

  1. 微信小程序拒绝授权后重新拉起授权窗口
  2. Redis 找出大 key
  3. Linux系统学习 六、网络基础—Linux的IP地址的配置
  4. MYSQL的备份与恢复--物理备份xrabackup
  5. docker修改系统时间总结
  6. 【LOJ6397】「THUPC2018」蛋糕 / Cake(搜索)
  7. C++教程详解
  8. Spring Cloud Zuul 那些你不知道的功能点
  9. PHP实现Redis分布式锁
  10. Mybatis框架模糊查询+多条件查询