前缀和-天上的星星
題目:
在一個星光摧殘的夜晚,蒜頭君一顆一顆的數這天上的星星。
蒜頭君給在天上巧妙的畫了一個直角坐標系,讓所有的星星都分布在第一象。天上有?n?顆星星,他能知道每一顆星星的坐標和亮度。
現在,蒜頭君問自己?q?次,每次他問自己每個矩形區域的星星的亮度和是多少(包含邊界上的星星)。
輸入格式
第一行輸入一個整數?n(1≤n≤50000)?表示星星的數量。
接下里?nn?行,每行輸入三個整數?x,y,w。x,y,w(0≤x,y,w≤2000),表示在坐標?(x,y)?有一顆亮度為?w?的星星。注意一個點可能有多個星星。
接下來一行輸入一個整數?q(1≤q≤50000),表示查詢的次數。
接下來?q?行,每行輸入四個整數?x1, y1, x2, y2,其中(x1?,y1?)?表示查詢的矩形的左下角的坐標,(x2?,y2?)?表示查詢的矩形的右上角的坐標,0≤x1?≤x2?≤2000,0≤y1?≤y2?≤2000。
輸出格式
對于每一次查詢,輸出一行一個整數,表示查詢的矩形區域內的星星的亮度總和。
樣例輸入復制
5 5 0 6 7 9 7 8 6 13 9 7 1 3 0 19 4 0 8 7 9 0 0 7 10 2 7 10 9 5 4 7 5樣例輸出復制
7 32 8 0題目來源:https://nanti.jisuanke.com/t/A1603
前綴和:https://blog.csdn.net/k_r_forever/article/details/81775899
?
代碼:
#include<cstdio> #include<iostream> using namespace std; int a[2005][2005]; int main() {int n,x,y,w;int q,x1,x2,y1,y2;scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d%d%d",&x,&y,&w);a[x+1][y+1]+=w; //因為星星可以重復,即亮度可以疊加,考慮到邊界問題,所以對坐標+1 }for(int i=0;i<2005;i++){for(int j=1;j<2005;j++){a[i][j]+=a[i-1][j]+a[i][j-1]-a[i-1][j-1];}}scanf("%d",&q);for(int i=0;i<q;i++){scanf("%d%d%d%d",&x1,&y1,&x2,&y2);++x1;++x2;++y1;++y2;//考慮邊界,坐標依次+1int ans=a[x2][y2]-a[x2][y1-1]-a[x1-1][y2]+a[x1-1][y1-1];printf("%d\n",ans);}return 0; }?
轉載于:https://www.cnblogs.com/LJHAHA/p/10641230.html
總結
- 上一篇: docker+httpd的安装
- 下一篇: PAT乙级1016