다 해보면 된다.


찾고싶은 별자리를 pair<int,int> s 배열에 저장하고 m개의 별을 set에 저장해 준 후


1<=i<=m 일 때 i번째 별을 찾고싶은 별자리의 첫번째 별로 간주했을 때 차이를 dif에 저장해놓고


s배열의 모든 요소 + dif가 set에 모두 있다면 -dif를 출력한다.


u,d,l,r은 찾고싶은 별자리가 s[0]를 기준으로 사방으로 얼만큼 더 뻗느냐를 저장해놓고


그정도 여유공간이 없는 별은 첫번째 별 후보에서 제외시켰는데 속도차이를 느끼지 못했다.


<코드>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <stdio.h>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
 
typedef pair<intint> pii;
 
#define mv 1000000
 
struct star {
    int x, y;
    star(int x = 0int y = 0) : x(x), y(y) {}
    star operator-(const star& a) {
        return{ x - a.x,y - a.y };
    }
};
 
star s[201];
vector<star> s2, s3;
 
set<int> m[mv + 1];
 
int n, nn, u, d, l, r;
 
int main() {
    scanf("%d"&n);
    d = l = mv + 1;
    for (int i = 0; i < n; i++) {
        scanf("%d%d"&s[i].x, &s[i].y);
        u = max(u, s[i].x);
        d = min(d, s[i].x);
        l = min(l, s[i].y);
        r = max(r, s[i].y);
    }
    u -= s[0].x;
    d = s[0].x - d;
    l = s[0].y - l;
    r -= s[0].y;
    scanf("%d"&nn);
    for (int i = 0; i < nn; i++) {
        int a, b;
        scanf("%d%d"&a, &b);
        if (a + u <= mv && a - d >= 0 && b + r <= mv && b - l >= 0) s2.push_back({ a,b });
        m[a].insert(b);
    }
    star dif, nx;
    bool f = true;
    for (int i = 0; i < s2.size() && f; i++) {
        dif = s[0- s2[i]; // -2,3
        for (int j = 1; j < n && f; j++) {
            nx = s[j] - dif;
            if (!m[nx.x].count(nx.y)) f = false;
        }
        if (f) {
            printf("%d %d"-dif.x, -dif.y);
            break;
        }
        f = true;
    }
    return 0;
}
cs


'BOJ' 카테고리의 다른 글

1733 등번호  (0) 2017.09.06
2311 왕복 여행  (0) 2017.09.06
3621 족보  (0) 2017.09.06
3780 네트워크 연결  (0) 2017.09.06
9938 방 청소  (0) 2017.09.06

+ Recent posts