# TIOJ 1510 - 彩色區塊
###### tags: `TOI` `TIOJ`
### 題意
在 $(0≦X≦1000,0≦Y≦1000)$ 的平面上給定數個顏色不同的矩形區塊$(X1,Y1)至(X2,Y2)$,表示方式為 $(R,G,B)$ 且 $(0≦R≦255; 0≦G≦255; 0≦B≦255)$ , $(R,G,B,X,Y∈Z)$。
且每個矩形有可能會有相互覆蓋的情形,假設一個整數座標為 $(x,y)$,被$k$個矩形覆蓋到,則此整數座標座標顏色為
$(\dfrac{1}{k}\sum_{i=1}^{k}R_i,\dfrac{1}{k}\sum_{i=1}^{k}G_i,\dfrac{1}{k}\sum_{i=1}^{k}B_i)$ ,若遇小數點採無條件進位法。
輸出分布面積最大(佔據最多個整數座標)之色彩的 R、G、B 即可。
### 解法
此題使用暴力法
1. 因為 $(0≦X≦1000,0≦Y≦1000)$ ,故可以開資料結購存取每個整數座標 $(x,y)$ 被矩形覆蓋到的的 R、G、B 值總和,除以被覆蓋矩形的數量後,再用 **ceil** 函式無條件進位就行。
2. 算完該整數座標的顏色後,用 **unordered_map<long long,int>** 來 **hash** 顏色,以「**R * 1000000 + G * 1000 + B**」來映射「**此顏色覆蓋的整數座標數**」。
3. 注意在計算每個整數座標的顏色時,若該點沒被覆蓋到則不要置入映射表內。
4. 遍歷映射表後取覆蓋最多的色彩,用 hash 值反推出 R、G、B 再輸出即可。
### code
```cpp=
#include <bits/stdc++.h>
using namespace std;
struct coor{
double rec=0;
int r=0,g=0,b=0;
double rsum=0 , gsum=0 , bsum=0;
};
int n;
coor dot[1001][1001];
unordered_map <long long,int> color;
int main(){
cin.tie(0);
cin >> n;
for(int i=0 ; i<n ; i++){
double a,b,c;
int xI , yI , xII , yII;
cin >> xI >> yI >> xII >> yII;
cin >> a >> b >> c;
if(xI > xII) swap(xI,xII);
if(yI > yII) swap(yI,yII);
for(int j=xI ; j<xII ; j++){
for(int k=yI ; k<yII ; k++){
dot[j][k].rec++;
dot[j][k].rsum += a;
dot[j][k].gsum += b;
dot[j][k].bsum += c;
}
}
}
for(int j=0 ; j<=1000 ; j++){
for(int k=0 ; k<=1000 ; k++){
if(dot[j][k].rsum == 0 && dot[j][k].gsum == 0 && dot[j][k].bsum == 0)
continue;
dot[j][k].r = ceil(dot[j][k].rsum / dot[j][k].rec);
dot[j][k].g = ceil(dot[j][k].gsum / dot[j][k].rec);
dot[j][k].b = ceil(dot[j][k].bsum / dot[j][k].rec);
color[dot[j][k].r * 1000000 + dot[j][k].g * 1000 + dot[j][k].b]++;
}
}
int maxColor = 0;
int ansR , ansG , ansB;
for(auto &it:color){
if(it.first == 0) continue;
if(it.second > maxColor){
maxColor = it.second;
ansB = it.first % 1000;
ansG = (it.first % 1000000 - ansB ) / 1000;
ansR = (it.first - ansB - ansG * 1000) / 1000000;
}
}
cout << ansR << " " << ansG << " " << ansB << "\n";
}
```