金魚亭日常

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

ABC#026 C - 高橋君の給料

#chokudai今日の一問 2日目は,

ABC#026 C - 高橋君の給料

C - 高橋君の給料

自分より数字の大きい上司はいないので,後ろから順番に給料を決めていく.

二次元vector の初期化のうまいやり方がわからんかった.

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

using namespace std;

static int N;
static vector<vector<int>> B;

void solve() {
  vector<long long> v(N + 1, 1);
  for (int i = N; i > 0; i--) {
    vector<int> x;
    for (int b = 1; b < B[i].size(); b++) {
      x.push_back(v[B[i][b]]);
    }
    if (x.empty()) {
      v[i] = 1;
    } else {
      v[i] = *max_element(x.begin(), x.end()) +
             *min_element(x.begin(), x.end()) + 1;
    }
  }
  printf("%lld\n", v[1]);
}

int main() {
  cin >> N;
  B.resize(N + 1);
  for (int i = 0; i < N + 1; i++) {
    vector<int> v(1);
    B[i] = v;
  }
  for (int i = 0; i < N - 1; i++) {
    int b;
    cin >> b;
    B[b].push_back(i + 2);
  }
  solve();
  return 0;
}

https://atcoder.jp/contests/abc026/submissions/7089830

ABC113 C - ID

いつの間にかできていた #chokudai今日の一問

記念すべき1問目は,多分これ.

ABC113 C - ID

C - ID

素直に実装する.

前回解いたときは,sprintf() とかその辺でハマった気がするけど,今回はvector 2個作って printf() すればいいということに途中で気づいた.

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

using namespace std;

static int N, M;
typedef pair<long long, int> City;
static vector<vector<City>> P;

void solve() {
  vector<int> id1(M + 1);
  vector<int> id2(M + 1);
  for (int i = 1; i < N + 1; i++) {
    sort(P[i].begin(), P[i].end());
    for (int j = 1; j < P[i].size(); j++) {
      id1[P[i][j].second] = i;
      id2[P[i][j].second] = j;
    }
  }
  for (int i = 1; i < M + 1; i++) {
    printf("%06d%06d\n", id1[i], id2[i]);
  }
}

int main() {
  cin >> N >> M;
  P.resize(N + 1);
  for (int i = 0; i < N + 1; i++) {
    vector<City> v(1);
    P[i] = v;
  }
  for (int i = 0; i < M; i++) {
    int p;
    long long y;
    cin >> p >> y;
    P[p].push_back(City(y, i + 1));
  }
  solve();
  return 0;
}

https://atcoder.jp/contests/abc113/submissions/7090478

AtCoder ABC #137

出場はしてない

A. +-x

問題文の通りに最大値を出力する.

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

using namespace std;

void solve(int a, int b) { printf("%d\n", max({a + b, a - b, a * b})); }

int main() {
  int a, b;
  cin >> a >> b;
  solve(a, b);
  return 0;
}

https://atcoder.jp/contests/abc137/submissions/7038126

B

範囲に気を付けて,x - k + 1 から x + k - 1 を出力する

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

using namespace std;

void solve(int k, int x) {
  int l, r;
  l = max(-1000000, x - k + 1);
  r = min(1000000, x + k - 1);
  for (int i = l; i < r; i++) {
    printf("%d ", i);
  }
  printf("%d\n", r);
}

int main() {
  int k, x;
  cin >> k >> x;
  solve(k, x);
  return 0;
}

https://atcoder.jp/contests/abc137/submissions/7038666

C

アナグラム判定はsortでやって,同じものがいくつあるかを数えて,それぞれについて   {}_n C_2 を全部足す.

一回 int にしていて WAになった.

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

using namespace std;

void solve(map<string, long long> m) {
  long long ans = 0;
  for (auto item : m) {
    ans += item.second * (item.second - 1) / 2;
  }
  printf("%lld\n", ans);
}

int main() {
  int n;
  cin >> n;
  map<string, long long> m;
  for (int i = 0; i < n; i++) {
    string s;
    cin >> s;
    sort(s.begin(), s.end());
    m[s] += 1;
  }
  solve(m);
  return 0;
}

https://atcoder.jp/contests/abc137/submissions/7038666

D

最終日からさかのぼって処理する. 残り日数以下の仕事をque に全部入れて,報酬が最大のものを取り出す,ということをやっていく.

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

using namespace std;

typedef struct {
  int A;
  int B;
} Job;

bool comp(const Job &a, const Job &b) { return a.A < b.A; }

void solve(int N, int M, vector<Job> jobs) {
  priority_queue<int> que;
  int ans = 0;
  int i = 0;
  for (int m = 0; m <= M; m++) {
    while (jobs[i].A <= m && i < N) {
      que.push(jobs[i].B);
      i++;
    }
    if (!que.empty()) {
      int b = que.top();
      que.pop();
      ans += b;
    }
  }
  printf("%d\n", ans);
}

int main() {
  int N, M;
  cin >> N >> M;
  vector<Job> jobs(N);
  for (int i = 0; i < N; i++) {
    int A, B;
    cin >> A >> B;
    Job job = {A, B};
    jobs[i] = job;
  }
  sort(jobs.begin(), jobs.end(), comp);
  solve(N, M, jobs);
  return 0;
}

https://atcoder.jp/contests/abc137/submissions/7047537

Codeforces Round #580 Div2

最近は codeforces にも頑張って出ているが,こちらも出るたびにratingが下がっていく…

しかし,codeforces 出ると AtCoder は使いやすいなぁと思う.

Cまで開けたが,わからんかった.

A. Choose Two Numbers

普通に総当たり

n = int(input())
a = list(map(int, input().split()))
m = int(input())
b = list(map(int, input().split()))
 
 
def solve():
    for i in range(n):
        for j in range(m):
            if (a[i] + b[j] not in a) and (a[i] + b[j] not in b):
                print(a[i], b[j])
                return
 
 
solve()

https://codeforces.com/contest/1206/submission/59005861

B. Make Product Equal One

1 か -1 の近いほうにして, -1 にするのが奇数個だったら, -1 => 1 or 1 => -1 のコストが小さいほうを変更する. 解説では 0を基準にしていた. もっとすっきり書けた気がする.

n = int(input())
a = list(map(int, input().split()))
neg = []
pos = []
 
for aa in a:
    if abs(1 - aa) < abs(-1 - aa):
        pos.append(aa)
    else:
        neg.append(aa)
 
ans = 0
if len(neg) % 2 != 0:
    if len(pos) == 0:
        d = 0
        cost = 10**9 + 1
        for aa in neg:
            if cost > abs(1 - aa) - abs(-1 - aa):
                cost = abs(1 - aa) - abs(-1 - aa)
                d = aa
        ans += sum([abs(-1 - x) for x in neg])
        ans -= abs(-1 - d)
        ans += abs(1 - d)
    else:
        d1 = 0
        cost1 = 10**9 + 1
        for aa in neg:
            if cost1 > abs(1 - aa) - abs(-1 - aa):
                cost1 = abs(1 - aa) - abs(-1 - aa)
                d1 = aa
        d2 = 0
        cost2 = 10**9 + 1
        for aa in pos:
            if cost2 > abs(-1 - aa) - abs(1 - aa):
                cost2 = abs(-1 - aa) - abs(1 - aa)
                d2 = aa
 
        ans += sum([abs(1 - x) for x in pos])
        ans += sum([abs(-1 - x) for x in neg])
        if cost1 < cost2:
            ans -= abs(-1 - d1)
            ans += abs(1 - d1)
        else:
            ans -= abs(1 - d2)
            ans += abs(-1 - d2)
else:
    ans += sum([abs(1 - x) for x in pos])
    ans += sum([abs(-1 - x) for x in neg])
 
print(ans)

https://codeforces.com/contest/1206/submission/59026990

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

2019年7月に読んだ本

それでもデミアンは一人なのか?

新シリーズ. この人は誰だろう,とか 考えながら読んでいる.

無能なナナ (5)

最後どうなるのだろうか.

無能なナナ(5) (ガンガンコミックス)

無能なナナ(5) (ガンガンコミックス)

海獣の子供

3巻まで持っていたので,残りをそろえた. 映画を見る前の予習.

海獣の子供 (1) (IKKI COMIX)

海獣の子供 (1) (IKKI COMIX)

海獣の子供 (2) (IKKI COMIX)

海獣の子供 (2) (IKKI COMIX)

海獣の子供 (3) (IKKI COMIX)

海獣の子供 (3) (IKKI COMIX)

海獣の子供 4 (IKKI COMIX)

海獣の子供 4 (IKKI COMIX)

海獣の子供 (5) (IKKI COMIX)

海獣の子供 (5) (IKKI COMIX)

数学ガール 秘密ノート 行列

数学ガール 秘密ノート ビットとバイナリ

ビットとバイナリ 後半よくわからんかったので,読み返したい.

三体

めっちゃよかった. 暗黒森林(The dark forest)を読んでいる.

三体

三体

へんなものみっけ (3)

読んでてつらい気持ちになるが,それはそれとしておもしろかった.

へんなものみっけ! (3) (ビッグコミックス)

へんなものみっけ! (3) (ビッグコミックス)

PC自作メモ(2019年 4月)

4月にデスクトップを組んだ. 初自作.

古いラップトップが,換装したSSDDSP版のWindows 10 Pro が載っていてもったいなかった,というのが主な理由.

ケースが小さくて,特に電源回りが厳しかった,というの以外はすんなり組めた.

Windows はライセンスの再認証が必要になるが,これには移植前にMicrosoftアカウントでログインして認証しておく必要がある,というのがはまりポイント.

CPU Ryzen 2200G 10,695円

AMD CPU Ryzen 3 2200G with Wraith Stealth cooler YD2200C5FBBOX

AMD CPU Ryzen 3 2200G with Wraith Stealth cooler YD2200C5FBBOX

マザーボード ASRoxk A320M-ITX 10,886円

ASRock AMD A320チップセット搭載 Mini-ITXマザーボード A320M-ITX

ASRock AMD A320チップセット搭載 Mini-ITXマザーボード A320M-ITX

メモリ CORSAIR Vengeance LPX Series CMK16GX4M2A2666C16(ブラック)10,945円

電源 CORSAIR SF450 (SFX,450W,80PLUS GOLD) 11,498円

CORSAIR 450W SFX電源ユニット 80PLUS GOLD認証取得 1系統 SFシリーズ SF450

CORSAIR 450W SFX電源ユニット 80PLUS GOLD認証取得 1系統 SFシリーズ SF450

ケース SilverStone SST-ML06B 6,782円

SilverStone Milo Series Mini-ITX HTPCケース ブラック SST-ML06B

SilverStone Milo Series Mini-ITX HTPCケース ブラック SST-ML06B

ストレージ (SSD 240GB)と OS (Windows 10 Pro) (古いマシンから流用)

計 50,806円 だがポイント使いまくったので,実質2万ぐらいだったはず.