2021/02/06

Attack to a Tree

atcoder.jp

橙diff

木の2乗DPということは事前に知っている状態で解いた。

dp[i][j][k]:頂点iの部分木でj回切断を行った時のiと連結しているAの和の最小値(k=0の場合は全てのAが正)とした。遷移させた後に初期化が必要。

遷移元と遷移先が一致する場合が存在するので注意。

Circle Lattice Points

atcoder.jp

青diff

本番中に解けなかった。誤差が怖いので10000倍して整数で考える。

負の割り算は、正の値の時と同じ様に扱ってたらバグる時がある(例えばC++では(-12)/10=-1となる)。下のようにしたら頭に優しかった。

    for(ll h=(y-r)-(y-r)%10000-man*2/*(余分にマイナス)*/;h<=y+r;h+=10000){
        if(h<y-rcontinue; //帳尻合わせ
        ll tate=abs(y-h);
        ll yoko=0,ng=1e15;
        while(ng-yoko!=1){
            ll mid=(yoko+ng)/2;
            if(mid*mid+tate*tate<=r*ryoko=mid;
            else ng=mid;
        }
        ll up=(yoko+x)/man*man+man*2;/*(余分にプラス)*/
        ll down=(x-yoko)/man*man-man*2;/*(余分にマイナス)*/
        while(up>yoko+xup-=man;//帳尻合わせ
        while(down<x-yokodown+=man;//帳尻合わせ
        ret+=up/man-down/man+1;
    }
 
その他

ABC191に参加してレート+6だった。Dが解けなかったの悔しい。