2018蓝桥模拟赛·天上的星星 暴力|二维树状数组
在一個星光摧殘的夜晚,蒜頭君一顆一顆的數這天上的星星。
蒜頭君給在天上巧妙的畫了一個直角坐標系,讓所有的星星都分布在第一象。天上有?nn?顆星星,他能知道每一顆星星的坐標和亮度。
現在,蒜頭君問自己?qq?次,每次他問自己每個矩形區域的星星的亮度和是多少(包含邊界上的星星)。
輸入格式
第一行輸入一個整數?n(1 \le n \le 50000)n(1≤n≤50000)?表示星星的數量。
接下里?nn?行,每行輸入三個整數?x,y,w(0 \le x, y, w\le 2000)x,y,w(0≤x,y,w≤2000),表示在坐標?(x,y)(x,y)?有一顆亮度為?ww?的星星。注意一個點可能有多個星星。
接下來一行輸入一個整數?q(1 \le q \le 50000)q(1≤q≤50000),表示查詢的次數。
接下來?qq?行,每行輸入四個整數?x_1, y_1, x_2, y_2x1?,y1?,x2?,y2?,其中?(x_1, y_1)(x1?,y1?)?表示查詢的矩形的左下角的坐標,(x_2, y_2)(x2?,y2?)?表示查詢的矩形的右上角的坐標,0 \le x_1 \le x_2 \le 20000≤x1?≤x2?≤2000,0 \le y_1 \le y_2 \le 20000≤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給出第一象限下的坐標并給出這個坐標下的值 給我們多個矩形的范圍 求這個
雖然暴力能過
但是樹狀數組 也可以~并且更快~
復雜度O(q*log(x)*log(y))
x,y<=2000
注意邊界要算進去 而且數據不能存在0,0上
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll tre[2010][2010]; void add(int x,int y,int w) {for(int i=x;i<=2001;i+=i&(-i)){for(int j=y;j<=2001;j+=j&(-j)){tre[i][j]+=w;} } ll query(int x,int y){ll sum=0;for(int i=x;i>0;i-=i&(-i)){for(int j=y;j>0;j-=j&(-j)){sum+=tre[i][j]; }return sum; } int main() {int n;ios::sync_with_stdio(0);cin>>n;while(n--){int x,y,w;cin>>x>>y>>w;add(x+1,y+1,w);}int q;cin>>q;while(q--){int lx,ly,rx,ry;cin>>lx>>ly>>rx>>ry;ll ans = query(rx+1,ry+1)-query(rx+1,ly)-query(lx,ry+1)+query(lx,ly); //注意邊要算在矩形內 cout<<ans<<endl; }return 0; }創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的2018蓝桥模拟赛·天上的星星 暴力|二维树状数组的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《计算复杂性:现代方法》——0.2 判定
- 下一篇: 收藏十一种常用简单实用漂亮的HTML表格