CF 989D A Shade of Moonlight

本文介绍了一种新颖的算法思路,将两人速度同步增加的问题转化为月亮移动的模型。通过坐标轴绘制,分析了如何判断两人能否在特定条件下相遇,并提供了一个具体的C++实现代码,用于计算相遇的可能性。

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

考虑换一个思路,原题说的是两个人的速度同时加w,我们转换成月亮会进行移动。 
月亮以每个时刻从中间向两侧移动最多W个单位的速度移动。 
我们可以把时间放在纵坐标,把位置放在横坐标,画出如题解中的那样一张图。 
这里写图片描述

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath>
#include <vector>

using namespace std;

int n;
long long l,w;

long long tr[100005],tl[100005];
int cntr,cntl;

bool check(long long x1,long long x2)
{
    double xx=1.0*(x1+x2)/2.0;
    double yy=1.0*(x2-x1)/2.0;

    if(1.0*yy*w > (-xx)  && 1.0*yy*w > (xx))
    {
        return true;
    }
    else
        return false;
}

int bin(long long x)
{
    int l=0,r=cntl-1;
    while(l<r)
    {
        int mid=(l+r)/2;
        if(check(x,tl[mid]))
        {
            r=mid;
        }
        else
        {
            l=mid+1;
        }
    }
    if(check(x,tl[l])==false)
    {
        l++;
    }
    return min(l,cntl);
}

int main() {

    while(~scanf("%d%lld%lld",&n,&l,&w))
    {
        cntr=cntl=0;

        for(int i=0;i<n;i++)
        {
            long long id,f;
            scanf("%lld%lld",&id,&f);
            if(f==1)
            {
                tr[cntr]=id;
                cntr++;
            }
            else
            {
                id+=l;
                tl[cntl]=id;
                cntl++;
            }
        }

        sort(tr,tr+cntr);
        sort(tl,tl+cntl);

        long long ans=0;

        //cout<<tr[0]<<" "<<tl[0]<<endl;
        //cout<<check(tr[0],tl[0])<<endl;
        for(int i=0;i<cntr;i++)
        {
            //cout<<bin(tr[i])<<endl;
            ans+=(cntl-bin(tr[i]));
            //cout<<ans<<endl;
        }
        printf("%lld\n",ans);
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值