Shaping Regions
usaco卡了很久的一个题,因为这个题三个月没有碰usaco。开始是用了直接模拟的方法,其实是可以过掉除了最后一个数据外的所有数据的。最后一个数据就是1w*1w的,内存限制。usaco自己给的提示我硬是没看懂。
利用了矩形分割的方法。每次加入一个新矩形都把它和原来的矩形比较,如果没有交集就不处理,直接处理下一个矩形,否则分四种情况:
(1) 原来的矩形上部超出了现有矩形,把超出的部分分割为一个新矩形。加入矩形库中。
(2) 原来的矩形下部超出……
(3) 左部……
(4) 右部……
根据以上四种情况分别处理,再把原来的那个矩形从矩形库中删除。我写的比较挫的代码,还好一遍过了。
/*
ID: like_091
PROG: rect1
LANG: C++
*/
#include <iostream>
#include <algorithm>
#include <string.h>
#include <cstring>
#include <string>
#include <vector>
#include <cmath>
#include <fstream>
#include <cstdio>
using namespace std;
struct area{
int lx, ly, rx, ry, v;
};
vector<area> a;
bool deal(area temp, int i){
//没有交集就不用处理
if (temp.lx >= a[i].rx || temp.rx <= a[i].lx)return false;
if (temp.ly >= a[i].ry || temp.ry <= a[i].ly)return false;
area b;
//上面还有未被覆盖的地方
if (a[i].ry > temp.ry){
b.lx = a[i].lx;
b.ly = temp.ry;
b.rx = a[i].rx;
b.ry = a[i].ry;
b.v = a[i].v;
a.push_back(b);
}
//下面还有未被覆盖的地方
if (a[i].ly < temp.ly){
b.lx = a[i].lx;
b.ly = a[i].ly;
b.rx = a[i].rx;
b.ry = temp.ly;
b.v = a[i].v;
a.push_back(b);
}
//左边还有未被覆盖的地方
if (a[i].lx < temp.lx){
b.lx = a[i].lx;
b.rx = temp.lx;
b.ly = max(a[i].ly, temp.ly);
b.ry = min(a[i].ry, temp.ry);
b.v = a[i].v;
a.push_back(b);
}
//右边还有未被覆盖的地方
if (a[i].rx > temp.rx){
b.lx = temp.rx;
b.rx = a[i].rx;
b.ly = max(a[i].ly, temp.ly);
b.ry = min(a[i].ry, temp.ry);
b.v = a[i].v;
a.push_back(b);
}
return true;
}
int main(){
int row, col, n, sum[3000];
ifstream cin("rect1.in");
ofstream cout("rect1.out");
while (cin>>row>>col>>n){
a.clear();
area d;
d.lx = d.ly = 0;
d.v = 1;
d.rx = row;
d.ry = col;
a.push_back(d);
area temp;
for (int i = 0; i < n; i++){
cin>>temp.lx>>temp.ly>>temp.rx>>temp.ry>>temp.v;
for (int j = a.size() - 1; j >= 0; j--){
if (deal(temp, j)){
//如果有交集,原来的矩形被分割,不必再保存
a.erase(a.begin() + j);
}
}
a.push_back(temp);
}
memset(sum, 0, sizeof(sum));
for (int i = 0; i < a.size(); i++)
sum[a[i].v] += (a[i].rx - a[i].lx) * (a[i].ry - a[i].ly);
for (int i = 0; i < 3000; i++)
if (sum[i] > 0)
cout<<i<<" "<<sum[i]<<endl;
}
return 0;
}
浙公网安备 33010602011771号