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; }