2019牛客多校第三场H Magic Line 思维

本文介绍了一个名为MagicLine的算法,该算法旨在解决将一组偶数个整点通过一条直线均匀分割的问题。通过按x坐标排序并利用斜率极限的直线策略,文章详细阐述了如何有效地实现这一目标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Magic Line

题意

给出n(偶)个整点 整点范围1000,找出一条直线,把n个点分成均等的两部分

分析

因为都是整数,并且范围比较小,所以直接按x排序找到在中间那一部分,并且把中间那一部分的点按照左右点的分布情况,分成两部分即可。如何分呢,因为范围比较小,所以可以找一条斜率特别极限的直线把其分成两部分。这题的关键是要同意直线的形状,要么从左上到右下,要么从左下到右上,混淆就会WA。

#include<bits/stdc++.h>
using namespace std;
#define F first
#define S second
const int maxn=2e6+5;
pair<int,int>a[maxn];
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int cntzuo=0,cntyou=0;
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d%d",&a[i].F,&a[i].S);
        }
        sort(a+1,a+1+n,[](pair<int,int>a,pair<int,int>b){
                    if(a.F!=b.F)return a.F<b.F;
                    else return a.S<b.S;
                });
        int tmp=n/2;
        int x=a[tmp].F;
        int xa=a[tmp].F;
        int xb=a[tmp+1].F;
        int ya,yb;
        for(int i=1;i<=n;i++){
            if(a[i].F<x)cntzuo++;
            else if(a[i].F>x) cntyou++;
        }
         
        if(cntzuo>=cntyou){
            ya=a[cntzuo+(tmp-cntzuo)].S;
            yb=a[cntzuo+(tmp-cntzuo+1)].S;
        }
        else {
            ya=a[(n-cntyou)-(tmp-cntyou)].S;
            yb=a[(n-cntyou)-(tmp-cntyou)+1].S;
        }
    printf("%d %d %d %d\n",xa+1,ya-10000000,xb-1,yb+10000000);
 
    }
    return 0;
}

转载于:https://www.cnblogs.com/ttttttttrx/p/11396035.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值