文章目录
2017-2018 ACM-ICPC German Collegiate Programming Contest (GCPC 2017)
- A.Drawing Borders
- B.Buildings
- C.Joyride
- D.Pants On Fire
- E.Perpetuum Mobile
- F.Plug It In!
- G.Water Testing
- H.Ratatoskr
- I.Uberwatch
- J.Word Clock
- K.You Are Fired
A.Drawing Borders
题意: 给定m个点,每个点给出(x,y),每个点都有一个颜色1/2/3,-3000<=x,y<=3000,找到划分方法将这些点划分为3个平面,打印你划分出来的2个平面的边界。
题解:
由于点都是整数,因此可以用如下的划分方法:
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 109;
int n;
struct point{
int x, y;
int tag;
point(){
}
point(int _x, int _y, int _tag):x(_x), y(_y), tag(_tag){
}
void input(){
scanf("%d%d%d", &x, &y, &tag);}
};
point plist[N];
int cnt;
point vec1[N], vec2[N];
int cnt1, cnt2;
bool cmp1(point p, point s){
if(p.x == s.x)return p.y < s.y;
else return p.x < s.x;
}
bool cmp2(point p, point s){
if(p.x == s.x)return p.y > s.y;
else return p.x > s.x;
}
typedef pair<double, double>pir;
vector<pir>ans1, ans2;
void work(){
ans1.push_back({
-3000, 3000});
ans1.push_back({
-3000, 2999});
for(int i = 0; i < cnt1; i++){
double x = vec1[i].x, y = vec1[i].y;
ans1.push_back({
x - 0.3, 2999});
ans1.push_back({
x - 0.3, y - 0.3});
ans1.push_back({
x + 0.3, y - 0.3});
ans1.push_back({
x + 0.3, y + 0.3});
ans1.push_back({
x - 0.2, y + 0.3});
while(i + 1 < cnt1 && vec1[i + 1].x == vec1[i].x){
ans1.push_back({
vec1[i + 1].x - 0.2, vec1[i + 1].y - 0.3});
ans1.push_back({
vec1[i + 1].x + 0.3, vec1[i + 1].y - 0.3});
ans1.push_back({
vec1[i + 1].x + 0.3, vec1[i + 1].y + 0.3});
ans1.push_back({
vec1[i + 1].x - 0.2, vec1[i + 1].y + 0.3});
i++;
}
ans1.push_back({
x - 0.2, 2999});
}
ans1.push_back({
3000, 2999});
ans1.push_back({
3000, 3000});
ans2.push_back({
3000, -3000});
ans2.push_back({
3000, -2999});
for(int i = 0; i < cnt2; i++){
double x = vec2[i].x, y = vec2[i].y;
ans2.push_back({
x + 0.41, -2999});
ans2.push_back({
x + 0.41, y + 0.3});
ans2.push_back({
x - 0.19, y + 0.3});
ans2.push_back({
x - 0.19, y - 0.3});
ans2.push_back({
x + 0.31, y - 0.3});
while(i + 1 < cnt2 && vec2[i + 1].x == vec2[i].x){
ans2.push_back({
vec2[i + 1].x + 0.31, vec2[i + 1].y + 0.3});
ans2.push_back({
vec2[i + 1].x - 0.19, vec2[i + 1].y + 0.3});
ans2.push_back({
vec2[i + 1].x - 0.19, vec2[i + 1].y - 0.3});
ans2.push_back({
vec2[i + 1].x + 0.31, vec2[i + 1].y - 0.3});
i++;
}
ans2.push_back({
x + 0.31, -2999});
}
ans2.push_back({
-3000, -2999});
ans2.push_back({
-3000