けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AtCoder ABC 246 A - Four Points (6Q, 灰色, 100 点)

工夫すると楽できる!

問題概要

xy 平面上に、各辺が x 軸または y 軸に平行である長方形がある。この長方形の 4 つの頂点のうちの、3 つの頂点の座標  (x_{1}, y_{1}), (x_{2}, y_{2}), (x_{3}, y_{3}) が与えられる。

残り 1 点の座標を求めよ。

制約

  •  -100 \le x_{i}, y_{i} \le 100

考えたこと:一般の長方形の性質

たとえば、次の 4 点をもつ長方形を考える。

  •  (3, 5)
  •  (3, 15)
  •  (23, 5)
  •  (23, 15)

この 4 点について、次の性質が成り立っている。

  •  x 座標の XOR 和をとると、3 ^ 3 ^ 23 ^ 23 = 0 となる
  •  y 座標の XOR 和をとると、5 ^ 5 ^ 15 ^ 15 = 0 となる

実はこのような性質は、一般の長方形で成り立つ。というのも、 x 座標が小さい側の頂点がちょうど 2 個、 x 座標が大きい側の頂点がちょうど 2 個あることから、これらの XOR 和は 0 となる。 y 座標についても同様である。

今回

よって、与えられた長方形の残り 1 点の座標を  (x_{4}, y_{4}) とすると、

  •  x_{1} ^  x_{2} ^  x_{3} ^  x_{4} = 0
  •  y_{1} ^  y_{2} ^  y_{3} ^  y_{4} = 0

が成り立つ。これらの式にそれぞれ、両辺に  x_{4},  y_{4} の XOR 和をとることで、次のようになる。

  •  x_{4} =  x_{1} ^  x_{2} ^  x_{3}
  •  y_{4} =  y_{1} ^  y_{2} ^  y_{3}

これが答えとなる。

コード

#include <bits/stdc++.h>
using namespace std;

int main() {
    int x1, y1, x2, y2, x3, y3;
    cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3;
    
    int res_x = x1 ^ x2 ^ x3;
    int res_y = y1 ^ y2 ^ y3;
    
    cout << res_x << " " << res_y << endl;
}