金魚亭日常

読書,ガジェット,競技プログラミング

AtCoder ABC #138

D まで解いた. Dはpython再帰したら深さがアレでREになったっぽかったのでC++に書き直すか,と思ったら時間切れだった.

しかし,最近出るたびにratingが下がっていく…

A. Red or Not

普通に場合分け

a = int(input())
if a >= 3200:
  print(input())
else:
  print("red")

https://atcoder.jp/contests/abc138/submissions/6981216

B. Resistors in Parallel

なんか数学なやつかと思って考え込んでしまったが普通に計算するだけだった.

n = int(input())
a = list(map(int, input().split()))
ans = sum([1/x for x in a])
print(1/ans)

https://atcoder.jp/contests/abc138/submissions/6997764

C. Alchemist

ちまちまと試していたら,小さいほうからやるのがよさそうだった(証明ナシ).

n = int(input())
v = sorted(list(map(int, input().split())))
ans = v[0]
for i in range(1, n):
    ans += v[i]
    ans /= 2
print(ans)

https://atcoder.jp/contests/abc138/submissions/7002940

D. Ki

木を1からたどれば終わり.

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <sstream>
#include <string>

using namespace std;

static vector<vector<int>> g;
static vector<int> ans;
static vector<bool> visited;
static vector<int> c;

void walk(int e, int cnt) {
  ans[e] = cnt;
  visited[e] = true;
  for (auto i : g[e]) {
    if (!visited[i]) {
      walk(i, cnt + c[i]);
    }
  }
  return;
}

void solve(int n) {
  ans.resize(n + 1, 0);
  visited.resize(n + 1, false);
  walk(1, c[1]);
  for (int i = 1; i < n; i++) {
    printf("%d ", ans[i]);
  }
  printf("%d\n", ans[n]);
}

int main() {
  int n, q;
  cin >> n >> q;
  g.resize(n + 1);
  for (int i = 0; i < n - 1; i++) {
    int a, b;
    cin >> a >> b;
    g[a].push_back(b);
    g[b].push_back(a);
  }
  c.resize(n + 1, 0);
  for (int i = 0; i < q; i++) {
    int p, x;
    cin >> p >> x;
    c[p] += x;
  }
  solve(n);
  return 0;
}

https://atcoder.jp/contests/abc138/submissions/7019342