Codeforces 1237C2。バランス引越し(ハーダー)

ポータル

とき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 = - 1CH = 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 
}

 

おすすめ

転載: www.cnblogs.com/LLTYYC/p/11693044.html