Codeforces Global Round 5-C1/2.Balanced Removals

题意:

在三维空间中给定个点,要求把这些点通过次操作两两移除,移除的点对所形成的空间中不得包含任何其他的点,按顺序输出每次操作移除的点对。

分析:

对点进行排序,首先移除相邻的平行于轴的点,紧接着移除相邻的与轴垂直的线/面,最后移除相邻的可以构成体的点

代码:

#include<bits/stdc++.h>
using namespace std;
const int MAXN =500007;
struct node {
    int x,y,z;
    int index;
}Node[MAXN],Node2[MAXN],Node3[MAXN];
bool cmp(node a,node b) {
    if(a.x==b.x&&a.y==b.y) return a.z<b.z;
    else if(a.x==b.x) return a.y<b.y;
    else return a.x<b.x;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n,m=0,p=0;
    cin>>n;
    for(int i=0;i<n;++i) {
        cin>>Node[i].x>>Node[i].y>>Node[i].z;
        Node[i].index=i+1;
    }
    sort(Node,Node+n,cmp);
    for(int i=0;i<n;i++) {
        if(i<n-1&&Node[i].x==Node[i+1].x&&Node[i].y==Node[i+1].y)
            cout<<Node[i].index<<" "<<Node[i+1].index<<endl,i++;
        else Node2[m++]=Node[i];
    }
    for(int i=0;i<m;i++) {
        if(i<m-1&&Node2[i].x==Node2[i+1].x)
            cout<<Node2[i].index<<" "<<Node2[i+1].index<<endl,i++;
        else Node3[p++]=Node2[i];
    }
    for(int i=0;i<p;i+=2) {
        cout<<Node3[i].index<<" "<<Node3[i+1].index<<endl;
    }
    // system("pause");
    return 0;
}