ABC183

[ABC183A] ReLU

答案即 \(\max(0,n)\)

cin >> n;
cout << max(0, n) << '\n';

[ABC183B] Billiards

感觉比 E+F 难,类似于光的反射,入射角等于反射角,那么斜率的绝对值相同,直接计算即可

cin >> sx >> sy >> tx >> ty;
if (sx > tx) {
  swap(sx, tx), swap(sy, ty);
}
d = sy + ty, l = sy / d;
cout << fixed << setprecision(10) << sx + l * (tx - sx) << '\n';

[ABC183C] Travel

直接枚举走城市的顺序,判断即可

cin >> n >> k;
for (int i = 1; i <= n; i++) {
  for (int j = 1; j <= n; j++) {
    cin >> t[i][j];
  }
  f[i] = i;
}
do {
  if (f[n] == 1) {
    LL cur = 1, cnt = 0;
    for (int i = 1; i <= n; i++) {
      cnt += t[cur][f[i]], cur = f[i];
    }
    ans += (cnt == k);
  }
} while(next_permutation(f + 1, f + n + 1));
cout << ans << '\n';

[ABC183D] Water Heater

差分模板,懒得解释了

cin >> n >> w;
for (int i = 1; i <= n; i++) {
  cin >> a[i] >> b[i] >> c[i];
  s[a[i]] += c[i], s[b[i]] -= c[i];
}
for (int i = 1; i <= n; i++) {
  s[i] += s[i - 1];
}
for (int i = 0; i <= 2e5; i++) {
  if (s[i] > w) {
    pr(0);
    return 0;
  }
}
pr(1);

[ABC183E] Queen on Grid

dp 板子,记录一下左边,上面,左上方从上一个 # 的前缀和即可

cin >> n >> m;
for (int i = 1; i <= n; i++) {
  for (int j = 1; j <= m; j++) {
    cin >> ch, mp[i][j] = ch == '.';
  }
}
dp[1][1] = l[1][1] = u[1][1] = e[1][1] = 1;
for (int i = 1; i <= n; i++) {
  for (int j = 1; j <= m; j++) {
    if (!mp[i][j]) {
      l[i][j] = u[i][j] = e[i][j] = 0;
      continue;
    }
    l[i][j] = l[i][j - 1] + dp[i][j] % kP, u[i][j] = u[i - 1][j] + dp[i][j] % kP, e[i][j] = e[i - 1][j - 1] + dp[i][j] % kP;
    if (i + 1 <= n) {
      (dp[i + 1][j] += u[i][j]) %= kP;
    }
    if (j + 1 <= m) {
      (dp[i][j + 1] += l[i][j]) %= kP;
    }
    if (i + 1 <= n && j + 1 <= m) {
      (dp[i + 1][j + 1] += e[i][j]) %= kP;
    }
  }
}
cout << dp[n][m] << '\n';

[ABC183F] Confluence

使用并查集 + map 直接暴力,加上启发式合并可以优化到 \(O(n\log n)\)

int Find(int x) {
  return fa[x] == x ? x : fa[x] = Find(fa[x]);
}
void Merge(int x, int y) {
  x = Find(x), y = Find(y);
  if (x == y) {
    return;
  }
  if (sz[x] > sz[y]) {
    swap(x, y);
  }
  fa[x] = y, sz[y] += sz[x];
  for (auto [i, j] : mp[x]) {
    mp[y][i] += j;
  }
}

// ---------------

cin >> n >> q;
for (int i = 1; i <= n; i++) {
  cin >> a[i], mp[i][a[i]]++, fa[i] = i, sz[i] = 1;
}
for (; q; q--) {
  cin >> op >> x >> y;
  if (op == 1) {
    Merge(x, y);
  } else {
    cout << mp[Find(x)][y] << '\n';
  }
}
posted @ 2024-10-11 17:13  BluemoonQwQ  阅读(47)  评论(0)    收藏  举报