您的位置:首页 > 其它

计算几何-离散化

2017-12-08 21:18 113 查看
矩形覆盖

#include <iostream>
#include <algorithm>
using namespace std;

struct SQ {
int x1, y1;
int x2, y2;
} sq[201];
int n;
int X[401], Y[401];
bool G[401][401];
long long ans;

int main() {
cin >> n;
for(int i=1; i<=n; i++) {
cin >> sq[i].x1 >> sq[i].y1 >> sq[i].x2 >> sq[i].y2;
X[i*2-1] = sq[i].x1;
X[i*2] = sq[i].x2;
Y[i*2-1] = sq[i].y1;
Y[i*2] = sq[i].y2;
}
sort(X+1, X+2*n+1);
sort(Y+1, Y+2*n+1);
for(int i=1; i<=n; i++) {
for(int x=1; x<2*n; x++) {
if(sq[i].x2 <= X[x]) break;
if(sq[i].x1 >= X[x+1]) continue;
for(int y=1; y<2*n; y++) {
if(sq[i].y2 <= Y[y]) break;
if(sq[i].y1 >= Y[y+1]) continue;
G[x][y] = true;
}
}
}
for(int x=1; x<2*n; x++) {
long long s = X[x+1] - X[x];
for(int y=1; y<2*n; y++)
if(G[x][y]) ans += s * (Y[y+1] - Y[y]);
}
cout << ans << endl;
return 0;
}


区间覆盖

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

struct Interval {
int L, R;
bool operator <(const Interval b) const { //重载运算符-按左端点比较
return L < b.L;
}
};
Interval I[20001];

int N, ans;

int main() {
int last;
scanf("%d", &N);
for(int i=1; i<=N; i++) scanf("%d%d", &I[i].L, &I[i].R);
sort(I+1, I+N+1); //离散
last = -1e9-1;
for(int i=1; i<=N; i++) {
if(I[i].R <= last) continue; //if 当前区间被包含
if(I[i].L > last) ans += I[i].R - I[i].L;//if 与上个区间不重合
else ans += I[i].R - last; //if 与上个区间有重合部分
last = I[i].R;
}
printf("%d\n", ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: