• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

yumiym765

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

C. Black Circles

C. Black Circles

\(\hspace{20px}\)二维平面上有 \(n\) 个圆。其中 \(i\) 个圆以 \((x_i,y_i)\) 为圆心。最初,所有圆的半径都是 \(0\) 。

\(\hspace{20px}\)圆的半径以每秒 \(1\) 个单位的速度增加。

\(\hspace{20px}\)你目前在 \((x_s,y_s)\) 处;你的目标是到达 \((x_t,y_t)\) 处,且不触及任何圆的周长(包括到达 \((x_t,y_t)\) 的时刻)。您可以朝任何方向移动。但是,你的速度限制为每秒 \(1\) 个单位。

\(\hspace{20px}\)请判断这是否可行。

\(\hspace{20px}\)Problem - 2002C - Codeforces

考虑直接沿着直线走向目标。

如果某个圆先到达目标,那么无论我们走哪条路,都没有成功的机会。

否则,在通往目标的路上不会经过任何圆圈。

题解证明:Editorial - Codeforces

(假设相遇了推出的结论)

点击查看代码
using ll = long long;
ll dis(ll x1, ll y1, ll x2, ll y2){
    ll dis2 = (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2);
    return dis2;
}
void solve(){
    int n;
    cin >> n;
    vector<ll> x(n), y(n);
    for(int i = 0;i < n;i++){
        cin >> x[i] >> y[i];
    }
    ll xs, ys, xt, yt;
    cin >> xs >> ys >> xt >> yt;
    ll distance = dis(xs, ys, xt, yt);
    for(int i = 0;i < n;i++){
        if(dis(xt, yt, x[i], y[i]) <= distance){
            cout << "NO\n";
            return;
        }
    }
    cout << "YES\n";
}

posted on 2025-09-17 11:02  羊毛corn  阅读(6)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3