cf 1237 C2. Balanced Removals (Harder)
Posted initrain
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cf 1237 C2. Balanced Removals (Harder)相关的知识,希望对你有一定的参考价值。
题意:
三维空间上有n个点(无重点),n为偶数,要求进行n/2次操作,每次操作消除两个点,记为 (xa,ya,za)和(xb,yb,zb),需满足不存在点(xc,yc,zc),使得
min(xa,xb)≤xc≤max(xa,xb) && min(ya,yb)≤yc≤max(ya,yb) && min(za,zb)≤zc≤max(za,zb)
思路:
对于x与y都相等点,排序,然后z相邻的那些一对一对的点就一定可以消除。
然后就只剩下x相同的那些点,同理,再消除。
最后,就没有x相同的点了,再消除。
结束。
代码:
#include <stdio.h> #include <string.h> #include <cmath> #include <iostream> #include <vector> #include <algorithm> using namespace std; typedef long long int ll; const double pi = acos(-1); const int maxn = 1e5 + 10; struct node{ int x,y,z,id; friend bool operator <(node a,node b){ if(a.x != b.x) return a.x < b.x; else if(a.y != b.y) return a.y < b.y; else return a.z < b.z; } }p[maxn]; int main() { int n; while(scanf("%d",&n) != EOF){ for(int i = 1;i <= n;i++){ p[i].id = i; scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].z); } sort(p + 1,p + n + 1); for(int i = 1;i <= n - 1;i++){ if(p[i].x == p[i + 1].x && p[i].y == p[i + 1].y){ printf("%d %d ",p[i].id,p[i + 1].id); p[i].x = 1e9; p[i + 1].x = 1e9; i++; } } sort(p + 1,p + n + 1); for(int i = 1;i <= n - 1;i++){ if(p[i].x == 1e9) break; if(p[i].x == p[i + 1].x){ printf("%d %d ",p[i].id,p[i + 1].id); p[i].x = 1e9; p[i + 1].x = 1e9; i++; } } sort(p + 1,p + n + 1); for(int i = 1;i <= n - 1;i+=2){ if(p[i].x == 1e9) break; printf("%d %d ",p[i].id,p[i + 1].id); } } return 0; }
以上是关于cf 1237 C2. Balanced Removals (Harder)的主要内容,如果未能解决你的问题,请参考以下文章
CF1237F Balanced Domino Placements
@codeforces - 1237F@ Balanced Domino Placements
Codeforces 1237F. Balanced Domino Placements