(纪中)2162. 方格纸(square)【差分+前缀和】
(File IO): input:square.in output:square.out
時間限制: 1000 ms 空間限制: 262144 KB 具體限制
Goto ProblemSet
題目描述
今天小DDD在他的課桌上玩方格紙,現在有一個平面直角坐標系,小DDD將方塊紙放在這個坐標系中,并且方格紙的都與xxx軸、yyy軸平行,小DDD在這上面放了許多的方格紙,然后想知道對于平面直角坐標系中的一個點有多少個方格紙覆蓋(包括方格紙的邊和點),因為方格紙太多了,所以請聰明的你幫小DDD解決問題。
輸入
第一行 一個正整數N,接下來N行 每行四個正整數x1,y1,x2,y2x1,y1,x2,y2x1,y1,x2,y2,分別表示方格紙左下角的坐標和右上角的坐標。
第n+2n+2n+2行一個正整數QQQ,接下來QQQ行 每行兩個正整數x,yx,yx,y,表示詢問點的坐標。
輸出
一共QQQ行,表示對應坐標。
樣例輸入
3
1 1 5 5
2 2 6 6
3 1 4 3
2
2 2
4 3
樣例輸出
2
3
數據范圍限制
303030%的數據, N?Q≤107N*Q≤10^7N?Q≤107。
100100100%的數據, N,Q≤105,0<x1,y1,x2,y2,x,y≤3000N,Q≤10^5,0<x1,y1,x2,y2,x,y≤3000N,Q≤105,0<x1,y1,x2,y2,x,y≤3000。
解題思路
303030%的方法 :
對于每一個詢問,枚舉每個方格紙是否覆蓋到。
時間復雜度O(N?Q)O(N*Q)O(N?Q)
100100100%的方法 :
因為方格紙所放在的平面直角坐標系的地方十分的小,只有(0,0)到(2000,2000)(2000,2000)(2000,2000),面積不足,所以只用將
每個點被多少個方格紙覆蓋算出來就可以了,直接一個一個加顯然不可行,我們可以用差分的思想,把這張方
格紙的四個角加上差分的系數,最后把前綴和求出來就可以了。
例如:一張方格紙左下角(0,0)(0,0)(0,0)右上角(1,1)(1,1)(1,1),對于這張方格紙需要變成這樣
我們只需要
代碼
#include<iostream> #include<cstring> #include<string> #include<cstdio> #include<algorithm> #include<iomanip> #include<cmath> using namespace std; int n,x,y,x1,y2,q,a1,b,f[4000][4000],a[4000][4000]; int main(){freopen("square.in","r",stdin);freopen("square.out","w",stdout);scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d%d%d%d",&x,&y,&x1,&y2);a[x][y]++;a[x1+1][y2+1]++;a[x1+1][y]--;a[x][y2+1]--;}for(int i=1;i<=3000;i++){for(int j=1;j<=3000;j++)f[i][j]=f[i-1][j]+f[i][j-1]-f[i-1][j-1]+a[i][j];}scanf("%d",&q);for(int i=1;i<=q;i++){scanf("%d%d",&a1,&b);printf("%d\n",f[a1][b]);} }總結
以上是生活随笔為你收集整理的(纪中)2162. 方格纸(square)【差分+前缀和】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c#获取外网IP地址
- 下一篇: Tamami教你孕前如何选购防辐射服