とき2次元まず、その後、$ X $と同じ点について、私たちの並べ替えの$のy $によって、除去の後、隣接する一対の場合を考えます
最後に、残りのポイントアップの$ X $座標なので、この時間のすべてのポイントの$ xには$座標は同じではありません
そして、$ X $と$ X $の隣接ペアを削除することができます
三次元に拡張し、同じ考えは明らかであろう、最初の$ xは、yは$ Zが$、$ Xをする$ $ yで同じ点のz $隣接するペアのペアを排除することによって、同一の点を$消去
最後に、消去の一対に隣接$のX、Y、Zの$によって
#include <iostreamの> する#include <cstdioを> する#include <アルゴリズム> の#include <CStringの> する#include <cmath> の#include < 設定 > の#include <地図> 使用して 名前空間STD。 typedefの長い 長いLL。 インラインint型リード() { int型のx = 0、F = 1。チャー CH = GETCHAR()。 一方、(CH < ' 0 ' || CH> ' 9 '' - ')、F = - 1。CH = GETCHAR()。} 一方、(CH> = ' 0 ' && CH <= ' 9 '){X =(X << 1)+(X << 3)+(CH ^ 48)。CH = GETCHAR()。} 戻りのx *のF。 } のconst int型 N = 5E4 + 7 。 int型のn; 構造体DAT { int型のX、Y、Z、ID。 インラインブール 演算子 <(CONST DAT&TMP)のconst { もし(!X = tmp.x)を返すのx < tmp.x。 返す yと!= tmp.y?Y <tmp.y:Z < tmp.z。 } } A [N]。 BOOL VIS [N]。 INT ()は、メイン { N = 読み取ります()。 用(int型 i = 1 ; iが<= N iが++ ) A [i]が.X(読み取る。=)、A [i]が.Y =(読み取り)、A [i]が.Zは=(読み取り)、A [I ] .ID = I。 ソート(A + 1、A + N + 1 )。 int型、L = 1 。 以下のために(int型 I = 2 ; iが<= N; iは++します) もし(L && [I] .X == A [L] .X && A [i]が.Y == A [L] .Y) { VIS [I] = VIS [L] = 1 。 printf(" %D%D \ n " 、A [i]が.ID、A [L] .ID)。 L = 0 。 } そうでなければ、L = I。 L = 1。一方、(VIS [L])L ++ 。 以下のために(int型 iはL + = 1 ; iがn = <; iは++ ) { 場合(VIS [i])と続けます。 もし(L && [I] .X == A [L] .X) { VIS [I] = VIS [L] = 1 。 printf(" %D%D \ n " 、A [i]が.ID、A [L] .ID)。 L = 0 。 } そうでなければ、L = I。 } 、L = 1。一方、(VIS [L])L ++ 。 以下のために(int型 iはL + = 1 ; iがn = <; iは++ ) { 場合(VIS [i])と続けます。 もし(L)のprintf(" %D%D \ n "、A [i]が.ID、A [L] .ID)、L = 0 。 他リットル= I; } 戻り 0 。 }