Open19

よわよわ緑コーダーだけど入水したい

yy

なんとか入水したい。問題の記録など。
現在のレート(2024/7/15)
2024/7/15のレート

yy

PAST1_M

6/22 PAST本1-1より.

  • A~Dなどをllで持っていたせいでcheck関数内でdoubleが変なことになっていたっぽい.1WA
  • 二分探索の探索範囲について
    • 範囲で回す方法でしか解いたことがなかった.小数だけど絞り込みどうするんだろう?と思ったので覚えておく.
    • 誤差で見る方法もある:許容が1e6なのでright-left<0.000001でもOK
  • 式変形がパッと思いつかなかった.
    • いったん詰まったら数学的にできないか考えてみたい.(苦手で避けがちなので.)

https://atcoder.jp/contests/past201912-open/submissions/54786969

yy

ABC207_C

https://atcoder.jp/contests/abc207/tasks/abc207_c
灰diffだけど詰まってしまったので。

  • 開区間の時に+-0.5をすることで大小のみで共通部分を求められるようにしている
  • max(l1,l2)<=min(r1,r2)で共通部分を求められる。
    • 開始地点より小さい終了地点が存在しない。
      • もう一方の区間が始まる前に一つの区間が終了してしまわないように。

https://atcoder.jp/contests/abc207/submissions/55184142

yy

ABC225-C

灰diffだがやたら引っかかってしまった。

  • 7行をはみ出るケース
  • 列を(B-1)/7にしなければならないのにB/7にして変なところで改行が挟まるような形にしてしまった。

こういうので落としたくないな〜〜〜〜〜

https://atcoder.jp/contests/abc225/submissions/55486868


今回はどっちにしろ位置を間違えていたので違っただろうけど、解説のようにB[0][0]の基準が何番目か求めて、以降もB[i][j]が元の行列の何番目にいたかを見たほうが楽かも。
https://atcoder.jp/contests/abc225/submissions/55486999

yy

ddcc2020_qual-C

https://atcoder.jp/contests/ddcc2020-qual

  • 長方形に切り分ける問題。
  • 解説のシミュレーションが綺麗だった。
  1. いちごにナンバリング
  2. 自分より左のナンバリングされてないマスを全て自分のナンバーに割り当て
    • 右のマスも同様に行う→いちごがある行は全て割り当て済みに
  3. 次に上下でも同様に行う
    • 横にいちごがある行はすでに割り当て済みで、割り当ててないマスの行は必ず全て割り当てられていない
      →上下を見た時に長方形が干渉しない!

https://atcoder.jp/contests/ddcc2020-qual/submissions/56173323

yy

ABC265-D

https://atcoder.jp/contests/abc265/tasks/abc265_d

  • 累積和+にぶたんで連続する3区間の和がどうなるかを調べる。想定回通り。

  • 解説に興味深い記述があった。

実装上はSをsetで保持することで、明示的に二分探索を行う必要がなくなります

https://atcoder.jp/contests/abc265/editorial/4591

  • 累積和をsetで持たせておいて,xをxまでの和とすることで累積和でx+pのものが存在すればそうなるようなyが存在,...と言うようなことをしている。
    • 単調増加よりx+pがあれば必ずxから連続で和がPの区間になる。
for(auto x:s){
    if(s.find(x+p)!=s.end() && s.find(x+p+q)!=s.end() && s.find(x+p+q+r)!=s.end()){
        cout << "Yes" << endl;
        return 0;
    }
}

https://atcoder.jp/contests/abc265/submissions/56596529

yy

ABC269-C

https://atcoder.jp/contests/abc269/tasks/abc269_c

  • 1<<(nの桁数+1)での全探索しようかと思ったけど判定とかの計算量もあるし無理くない...?とか思ってました。解法AC。
  • 集合を利用。Ni桁目が1の時に、今までの条件を満たすもののi桁目を1にしたものを加える。
    • 答えとなる条件は"i桁目が1の時Ni桁目が1である"なので必ずこれを満たす。
  • 各桁ごとに見れば良いが60桁なので桁のループは大したことがない。
    https://atcoder.jp/contests/abc269/editorial/4844

https://atcoder.jp/contests/abc269/submissions/56621654

yy

ABC237-D

https://atcoder.jp/contests/abc237/tasks/abc237_d

  1. これっぽいことを再帰でやってTLEした。別に再帰でやる必要なかったので再帰をやめたら通った。
    多分再帰でも参照渡しにすれば通る気がする。
    解説:https://atcoder.jp/contests/abc237/editorial/3323
    AC:https://atcoder.jp/contests/abc237/submissions/56716075

  1. 解説AC。なんで後ろから操作するとそうなるんだ?
    解説:https://atcoder.jp/contests/abc237/editorial/3319
    AC:https://atcoder.jp/contests/abc237/submissions/56715937
  • 優先度みたいに考えればいい?値の大きい方が後に優先的に入る
    • ... 2 3 ... (R)
    • ... 2 4 3 ... (L)
    • ... 2 4 5 3 ...(R)
  • L,Rはその前の数にしか影響していないから?(nとn-1の関係を表しているだけ)
yy

ABC275-C

https://atcoder.jp/contests/abc275/tasks/abc275_c

  • ポーンの座標を全て配列に入れて4つ選んで正方形か調べた。
  • 長さ4のvector<pair<ll,ll>>をもらって正方形か返すプログラムをGPTに書かせてしまった。

typedef pair<ll, ll> Point;

ll distanceSquared(const Point &p1, const Point &p2) {
    return (p1.first - p2.first) * (p1.first - p2.first) +
           (p1.second - p2.second) * (p1.second - p2.second);
}

bool check(vector<Point> &points) {
    if (points.size() != 4) return false;

    // 全ての距離を計算する
    vector<ll> distances;
    for (int i = 0; i < 4; i++) {
        for (int j = i + 1; j < 4; j++) {
            distances.push_back(distanceSquared(points[i], points[j]));
        }
    }

    // 距離を昇順にソート
    sort(distances.begin(), distances.end());

    // 2つの対角線の距離が等しいかつ、4つの隣接する辺の距離が等しいことを確認
    return (distances[0] == distances[1] &&  // 辺の長さ1
            distances[1] == distances[2] &&  // 辺の長さ2
            distances[2] == distances[3] &&  // 辺の長さ3
            distances[4] == distances[5] &&  // 対角線の長さが等しい
            distances[0] > 0); // 辺の長さが正の値であることを確認
}

https://atcoder.jp/contests/abc275/submissions/56919696