(纪中)2162. 方格纸(square)【差分+前缀和】
(File IO): input:square.in output:square.out
時間限制: 1000 ms 空間限制: 262144 KB 具體限制
Goto ProblemSet
題目描述
今天小DDD在他的課桌上玩方格紙,現(xiàn)在有一個平面直角坐標(biāo)系,小DDD將方塊紙放在這個坐標(biāo)系中,并且方格紙的都與xxx軸、yyy軸平行,小DDD在這上面放了許多的方格紙,然后想知道對于平面直角坐標(biāo)系中的一個點(diǎn)有多少個方格紙覆蓋(包括方格紙的邊和點(diǎn)),因為方格紙?zhí)嗔?#xff0c;所以請聰明的你幫小DDD解決問題。
輸入
第一行 一個正整數(shù)N,接下來N行 每行四個正整數(shù)x1,y1,x2,y2x1,y1,x2,y2x1,y1,x2,y2,分別表示方格紙左下角的坐標(biāo)和右上角的坐標(biāo)。
第n+2n+2n+2行一個正整數(shù)QQQ,接下來QQQ行 每行兩個正整數(shù)x,yx,yx,y,表示詢問點(diǎn)的坐標(biāo)。
輸出
一共QQQ行,表示對應(yīng)坐標(biāo)。
樣例輸入
3
1 1 5 5
2 2 6 6
3 1 4 3
2
2 2
4 3
樣例輸出
2
3
數(shù)據(jù)范圍限制
303030%的數(shù)據(jù), N?Q≤107N*Q≤10^7N?Q≤107。
100100100%的數(shù)據(jù), 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%的方法 :
對于每一個詢問,枚舉每個方格紙是否覆蓋到。
時間復(fù)雜度O(N?Q)O(N*Q)O(N?Q)
100100100%的方法 :
因為方格紙所放在的平面直角坐標(biāo)系的地方十分的小,只有(0,0)到(2000,2000)(2000,2000)(2000,2000),面積不足,所以只用將
每個點(diǎn)被多少個方格紙覆蓋算出來就可以了,直接一個一個加顯然不可行,我們可以用差分的思想,把這張方
格紙的四個角加上差分的系數(shù),最后把前綴和求出來就可以了。
例如:一張方格紙左下角(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]);} }總結(jié)
以上是生活随笔為你收集整理的(纪中)2162. 方格纸(square)【差分+前缀和】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c#获取外网IP地址
- 下一篇: Tamami教你孕前如何选购防辐射服