boxmoe_header_banner_img

Hello! 欢迎来到DRheEheAM的blog!

加载中

文章导读

Jun. 30th 每日一题 | P14511 [NFLSPC #8] 轨道交通


avatar
DRheEheAM_Garylv229憨毛怪 2026-07-01 41

AI Summary

将点投影到x轴,按坐标排序后匹配同色点对,利用容斥保证不交,得到轨道连线。

P14511 [NFLSPC #8] 轨道交通

这道题第一眼并没有思路…

然后我们考虑特殊性质,发现特殊性质描述了所有点都在对角线上的情况。
我们考虑特殊做法,根据容斥原理,我们可以得到:若按照顺序遍历,找到一对颜色相同的点,连边,并在遍历队列中删除所有刚刚遍历过的点,因为每次最多删除 nn 个点,每个颜色删除 11 个,最多删除 nn 次,但是每个颜色都有 n+1n+1 个点,那么保证有完全不重合交点。

我们从特殊性质出发得出做法:将所有点投影到 x 轴上,有一个显而易见的结论:
投影之后不相交的线段投影前也不相交。
那么投影完之后按照特殊做法相同方式处理即可。

AC记录

/*---------------------
by DRheEheAM (awa)-----
love hanser forever!---
---------------------*/
#include<bits/stdc++.h>
using namespace std;
#define intc constexpr int
#define intl long long
#define Cios ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
intc N=2005;
int n;
struct point {
    int x,col,id;
    bool operator < (const point p) const {
        return x<p.x;
    }
};
vector <point> p;
int tmp[N];
pair <int,int> res[N];
signed main() {
    Cios;
    int T;
    cin>>T;
    while (T--) {
        cin>>n;
        p.clear();
        for (int i=1;i<=n;i++) {
            for (int j=1;j<=n+1;j++) {
                int x,y;
                cin>>x>>y;
                p.push_back({x,i,j});
            }
        }
        sort(p.begin(),p.end());
        for (auto [x,col,id]:p) {
            if (!tmp[col]) tmp[col]=id;
            else if (res[col].first==0&&res[col].second==0){
                res[col]={tmp[col],id};
                for (int i=1;i<=n;i++) tmp[i]=0;
            }
        }
        for (int i=1;i<=n;i++) cout<<res[i].first<<" "<<res[i].second<<"\n";
        for (int i=1;i<=n;i++) tmp[i]=0,res[i]={0,0};
    }
    return 0;
}



评论(0)

查看评论列表

暂无评论


发表评论

DRheEheAM_Gary Blog