性质归纳题,随便写一写。
struct node
{
int idx, x, y, z;
bool operator<(const node b)const
{
if (this->x == b.x)
{
if (this->y == b.y)
return this->z < b.z;
else return this->y < b.y;
}
return this->x < b.x;
}
}a[N];
bool vis[N];
int main()
{
int n;
while (cin >> n)
{
vector<pii> ans;
f(i, 1, n) { scanf("%d%d%d", &a[i].x, &a[i].y, &a[i].z); a[i].idx = i; }
sort(a + 1, a + 1 + n);
f(i, 1, n - 1)
{
if (a[i].x == a[i + 1].x&&a[i].y == a[i + 1].y)
{
vis[a[i].idx] = true, vis[a[i+1].idx] = true;
ans.emplace_back(make_pair(a[i].idx, a[i + 1].idx));
i++;
}
}
vector<node> tmp;
f(i, 1, n)
{
if (!vis[a[i].idx])tmp.emplace_back(a[i]);
}
if(tmp.size()>=2)
f(i, 0, tmp.size() - 2)
{
if (tmp[i].x == tmp[i + 1].x)
{
vis[tmp[i].idx] = true, vis[tmp[i + 1].idx] = true;
ans.emplace_back(make_pair(tmp[i].idx, tmp[i + 1].idx));
i++;
}
}
int k = 1;
for (auto I : ans)
cout << I.first << " " << I.second << endl;
for (auto I : tmp)
{
if (!vis[I.idx])
{
if (k)cout << I.idx << " ";
else cout << I.idx << endl;
k ^= 1;
}
}
}
return 0;
}