Loading

CF1477C

不要畏惧几何题。

注意到如果 Api,Api+1,Api+2 三个点构成了钝角,则交换 pi+1,pi+2 就可以将这三个点组成的角变成锐角,然而有可能会影响到 pi1,那么继续往后进行类似的处理即可,并且显然后面的修改不会影响到前面,手画一下图就会发现即使后面的修改了,前一个角也一定是锐角,因为前面的三个角一开始一定是钝角才会继续往后修改,而改变了顺序之后后面的那个角不可能成为钝角,手玩一下可以更好的理解。

时间复杂度 O(n2),代码:

#include <bits/stdc++.h>
#define int long long
#define rep(i, l, r) for (int i (l); i <= r; ++ i)
#define rrp(i, l, r) for (int i (r); i >= l; -- i)
#define eb emplace_back
#define pii pair <int, int>
#define ls (p << 1)
#define rs (ls | 1)
using namespace std;
constexpr int N = 2.5e6 + 5, B = 35, P = 1e9 + 7;
inline int rd () {
  int x = 0, f = 1;
  char ch = getchar ();
  while (! isdigit (ch)) {
    if (ch == '-') f = -1;
    ch = getchar ();
  }
  while (isdigit (ch)) {
    x = (x << 1) + (x << 3) + (ch ^ 48);
    ch = getchar ();
  }
  return x * f;
}
int qpow (int x, int y) {
  int ret = 1;
  for (; y; y >>= 1, x = x * x % P) if (y & 1) ret = ret * x % P;
  return ret;
}
int n;
int x[N], y[N];
int p[N];
int dist (int i, int j) {
  return (x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]);
}
bool check (int i, int j, int k) {
  int a = dist (i, j), b = dist (i, k), c = dist (j, k);
  if (b >= (unsigned long long) a + c) return 1;
  return 0;
}
int32_t main () { 
  // freopen ("1.in", "r", stdin);
  // freopen ("1.out", "w", stdout);
  n = rd ();
  rep (i, 1, n) p[i] = i;
  rep (i, 1, n) {
    x[i] = rd (), y[i] = rd ();
  }
  // cout<<check(2,3,4)<<endl;
  rep (i, 1, n - 2) {
    int j = i;
    while (check (p[j], p[j + 1], p[j + 2])) {
      // cout<<j<<endl;
      swap (p[j + 1], p[j + 2]);
      -- j;
      if (j < 1) break;
    }
  }
  rep (i, 1, n) printf ("%lld ", p[i]);
}

作者:lalaouye

出处:https://www.cnblogs.com/lalaouyehome/p/18739530

版权:本作品采用「114514」许可协议进行许可。

posted @   lalaouye  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示