JZOJ__Day 9:【普及模拟】Square
来源:互联网 发布:淘宝暗黑3代练 编辑:程序博客网 时间:2024/06/08 18:14
题目描述
今天小D在他的课桌上玩方格纸,现在有一个平面直角坐标系,小D将方块纸放在这个坐标系中,并且方格纸的都与x轴、y轴平行,小D在这上面放了许多的方格纸,然后想知道对于平面直角坐标系中的一个点有多少个方格纸覆盖(包括方格纸的边和点),因为方格纸太多了,所以请聪明的你帮小D解决问题。
输入
第一行 一个正整数N,接下来N行 每行四个正整数x1,y1,x2,y2,分别表示方格纸左下角的坐标和右上角的坐标。
第n+2行一个正整数Q,接下来Q行 每行两个正整数x,y,表示询问点的坐标。
输出
一共Q行,表示对应坐标。
样例输入
3
1 1 5 5
2 2 6 6
3 1 4 3
2
2 2
4 3
样例输出
2
3
数据范围限制
30%的数据, N*Q≤10^7。
100%的数据, N,Q≤10^5,0< x1,y1,x2,y2,x,y≤3000。
分析
30%的方法
对于每一个询问,枚举每个方格纸是否覆盖到。
时间复杂度O(N*Q)
100%的方法
因为方格纸所放在的平面直角坐标系的地方十分的小,只有(0,0)到(2000,2000),面积不足,所以只用将
每个点被多少个方格纸覆盖算出来就可以了,直接一个一个加显然不可行,我们可以用差分的思想,把这张方
格纸的四个角加上差分的系数,最后把前缀和求出来就可以了。
例如:一张方格纸左下角(0,0)右上角(1,1),对于这张方格纸需要变成这样
我们只需要
前缀和后就可以变成所需要的。
时间复杂度 O(N+Q+max x2*max y2)。
程序:
vari,j,n,m,x,y,x1,y1:longint;a,f:array[0..3001,0..3001]of longint;begin assign(input,'square.in'); reset(input); assign(output,'square.out'); rewrite(output); readln(n); fillchar(a,sizeof(a),0); fillchar(f,sizeof(f),0); for i:=1 to n do begin readln(x,y,x1,y1); inc(a[x,y]); inc(a[x1+1,y1+1]); dec(a[x1+1,y]); dec(a[x,y1+1]); end; for i:=1 to 3000 do for j:=1 to 3000 do f[i,j]:=f[i-1,j]+f[i,j-1]-f[i-1,j-1]+a[i,j]; readln(m); for i:=1 to m do begin readln(x,y); writeln(f[x,y]); end; close(input); close(output);end.
阅读全文
0 0
- JZOJ__Day 9:【普及模拟】Square
- JZOJ__Day 9:【普及模拟】算法学习(sfxx)
- JZOJ__Day 2:【普及模拟】串
- JZOJ__Day 1:【普及模拟】PLES
- JZOJ__DAY 4:【普及模拟】最大值
- JZOJ__Day 4:【普及模拟】火柴
- JZOJ__Day 4:【普及模拟】游戏
- JZOJ__Day 5:【普及模拟】num
- JZOJ__Day 7:【普及模拟】蚂蚁
- JZOJ__Day 7:【普及模拟】max
- JZOJ__Day 8:【普及模拟】马农
- JZOJ__Day 3:【NOIP普及模拟】排序(sort)
- JZOJ__Day 3:【NOIP普及模拟】数数(count)
- JZOJ__Day 2:【NOIP普及模拟】和谐数
- JZOJ__Day 2:【NOIP普及模拟】分数
- JZOJ__Day 1:【NOIP普及模拟】JABUKE
- JZOJ__Day 1【NOIP普及模拟】MATRIX
- JZOJ__Day 5:【普及模拟】权势二进制
- 【C++心路历程11】火柴棒等式1182,打表!
- 循环初始化pageview
- shell脚本学习
- Hadoop2源码分析-准备篇
- MooFest POJ 1990 【树状数组】
- JZOJ__Day 9:【普及模拟】Square
- php中curl的应用
- Hadoop2源码分析-Hadoop V2初识
- Ajax
- ROS进阶
- 嵌入式开发定位
- mysql insert数据到远端数据库乱码,导入到本地正常
- JavaScript变量存储浅析(二)
- php中的curl使用入门教程和常见用法实例