すぐすぐすぐすぐすぐ~のぶろぐ

似非競プロの話をします

C++で**演算子を使いたい話

はじめに

すぐです。PythonRubyでよく使われている**演算子C/C++でも使ってみたくないですか?というか、C++って++演算子(インクリメント)はあるのに**演算子がないのって変だと思っています。かといって、自分で長い宣言をするのはめんどくさいので特別なコードを書きたくない!!!!!(おい)

ほんへ

さっそくコードを見せていきます。

#include<bits/stdc++.h>
using namespace std;
 
int main(){
    int a = 2,x = 2;
    int *b = &x;
    cout << a**b << endl;
    return 0;
}

これを実行すると、2^2=4より正しいです。やったね。

 

このように、こんな感じでコードを組みましたが、当然**演算子なんて存在しませんから、どういう仕組みなのかを見ていきます。

まず、bはint型のポインタで、xという変数のアドレスを入れています。そして、1個目のアスタリスクを乗算演算子,2個目のアスタリスクとbで xを呼び出すことで、結局a*xの計算をしています。

さいごに

乗算演算子とポインタ変数の記号にアスタリスクを使うのは、ダメだろ。

三角形の外心の座標を求める

はじめに

 こんにちは。Sugsugarです。さて、今回は三角形の外心の座標を求める、ということですが、この問題(ABC151-F)を解くときに三角形の外心の座標を求める必要があったので、どうせなら一般化しようということでえいえい計算しました。途中はだらだら計算しているだけなので、結果をすぐに知りたい人は最後あたりまで飛んでいただけるとありがたいです。

本題

 では、さっそく求めていきましょう。もっと数学ができる人ならベクトルを使えば~などいうと思いますが、僕はそんなに高度なことはできないので当然1次関数をこねくり回す感じでやっていきます。以下、具体的な方針です。

  1. 3点 (x_1,y_1),(x_2,y_2),(x_3,y_3) があり、これを直線で結んでできる三角形の外心の座標を求めたい。
  2. その三角形のうち2辺の方程式を求め、それによって垂直二等分線の方程式を求める。
  3. それによってできた2つの直線の交点の座標を求める。それがこの三角形の外心である。

 これによって外心が求められることは証明しません(暇だったら証明してみてください)。

 まず2点 (x_1,y_2),(x_2,y_2) の直線の方程式について求めていきます。これは

(x_2-x_1)y-(y_2-y_1)x+a=0

とあらわすことができます。今回、この直線について傾きしか必要ないので、定数のところはaとして計算を軽くしています。また、この形式で表してることについてはx=0,y=0のときでも対応できるように、という意味があります。

では、これの垂直二等分線の方程式を求めます。この直線は

(\frac{x_1+x_2}{2},\frac{y_1+y_2}{2})

を通るので、

2(y_2-y_1)y+2(x_2-x_1)x+(x_1^2-x_2^2)+(y_1^2-y_2^2)=0

とあらわすことができます。同様にして、

2(y_3-y_2)y+2(x_3-x_2)x+(x_2^2-x_3^2)+(y_2^2-y_3^2)=0

も求められます。さて、この2つの1次方程式を連立させて解いていきます。

これを解くと(両辺のyの係数をそろえて消せばよいです)、

3辺が1直線上になく、三角形が存在しているとき

x=-\frac{y_1(x_3^2+y_3^2-x_2^2-y_2^2)+y_2(x_1^2+y_1^2-x_3^2-y_3^2)+y_3(x_2^2+y_2^2-x_1^2-y_1^2)}{2(x_3y_2-x_2y_3+x_1y_3-x_3y_1+x_2y_1-x_1y_2)}

です。三角形が存在する条件は

x_3y_2-x_2y_3+x_1y_3-x_3y_1+x_2y_1-x_1y_2 \neq 0

です(実際、3点がy=ax+b上にあるとして値を代入したらちょうど0になり三角形が存在しないことと同値となります)。yの座標は、このxについての式のx_iy_i (1 \leq i \leq 3)を交換した値がy座標の値となります。

 

よって、三角形の外心の座標を求められました。途中経過のところも見せたかったのですが、書くのがめんどくさかったとても汚くなったので、一部の重要な部分だけ見せることにしました。1次関数をごりごりすることで複雑ながらもきれいな式が出てきて面白かったです。

AtCoderで逆ボーダーを取った時に読むもの

はじめに

 初めまして、Sugsugarです。中2です。僕は今趣味でAtCoderというものをやっていて、レートは1199です。まさかはてブで初めて書く記事がこういうものになるとは思いもよりませんでした。本当はAtCoder水色になって色変の記事を書こうと思っていたんですけどね。現状のレートグラフについて一応参考までに。

f:id:Sugsugar:20210323015442p:plain

いかにも凡人のあげ方ですね。これまでに出たRatedコンテストの回数はなんと68回です、多い...

 さて、本題に入る前に逆ボーダーの定義をしておきます。逆ボーダーとは、

(AtCoder上での色が変わるレート - 1)のレート

とします。すなわち、レートが399,799,1199,1599...などのことです。また、逆ボーダー後のコンテストとは

逆ボーダーを取った後の直近1回のRatedのコンテスト

とします。僕は今回のABC196で1617という高パフォーマンスを取り、レートが1199となってしまいました。これで3回目なので、逆ボーダーを取った時の心構えなどについて書こうと思います。

逆ボーダーをとったときの心境

 まず、逆ボーダーをとったときは基本的にレートが上がっている場合が多いです。なので、レートは上がってうれしいのにあと1足りなくて悔しいという複雑な気持ちになります。しかし、1つ上の色から落ちて逆ボーダーになってしまった場合は冷えた上であと1あれば耐えてたので、悔しさはさらに増すと思います。幸い色落ち逆ボーダーにはなったことがありませんが...

水色逆ボーダーを取ったコンテスト -ABC196-

 さて、コンテスト中はac-predictorというものでコンテスト中にパフォーマンスとコンテスト後の推定のレートを見ることができます(AtCoder的にはグレーらしいです)。今回のABC196ではA,B,Cを遅く解き、その後D,Eも解けずなかばあきらめていました。しかし、なんとEが94分で解けてしまったため一気に色変チャンスとなりました。このとき、推定レートは1204でした。

 なんとしてでも色変したいですがほかの問題はもう解けないのであとは祈るしかありません。ここでペナルティを含めると129分。どんどん抜かされるばかりです。1分ごとにページを更新すると、じわじわ推定レートが減っていきます。怖い。最後の1分で推定は1200レートとなり、必死に祈ります。

 そして、コンテストは終了しました。ページを更新してみてみると...推定レートは1199でした。しかし、predictorはかならずしも正確とは限らないと信じ込み、レート更新までずっと祈っていました。

 

 

 そしてレートが更新されたら...

 ご存じの通り逆ボーダーになってしまいました。僕の感想は

 です。すぐ色変できないなあ。しかもこの回は冷えを覚悟していましたし(本来はもっと冷えるはずだったのに94分でいきなりレートが結構上がるようになるし)、土壇場で色変チャンスになったのでかなり混乱していました。逆ボーダーはつらい。

逆ボーダーを取った時の心構え

 ここからが本題です。今まで逆ボーダーを3回取ってきた者として、いろいろ気を付けないといけないことがあります。

  • "1つ上の色のパフォーマンスを取れば色変できる"ことで無駄にプレッシャーを感じたり油断したりしない。
  • 普段通りのコンディションでコンテストに出る。
  • 問題を解いてるときに"これが解けなければ色変できない"と焦らない。(2つ目と多少かぶるかもしれません)

さて、1つ1つの項目について説明をしていきたいと思います。

"1つ上の色のパフォーマンスを取れば色変できる"ことで無駄にプレッシャーを感じたり油断したりしない

 これが一番大事だと思っています。どういうことかというと、今までのレートだと、

「あと〇色まで+100くらい必要だし色変は無理かな」

「〇色まではあと+35くらいなので今回のコンテストでもしかしたらいけるかもしれない」

といわば楽に考えることができましたが、逆ボーダーだと、

「〇色のパフォーマンスをとればほぼ確実に〇色になれる」

「〇色より下のパフォーマンスを取ると確実に色変が遠のく」

ということが明確にわかってしまうため、実はほかのレートのときよりも僕は緊張します。また、これで緊張しなくても油断は禁物です。意外と1つ上のパフォを取るのって難しいんですよ。

普段通りのコンディションでコンテストに出る

 これも大事です。無駄にもったいぶったコーディング方法だったり縛りプレイだったりはしないほうがいいと思います。普段通りです。慣れないことをすると失敗します。

問題を解いてるときに"これが解けなければ色変できない"と焦らない

 焦ると失敗するとはよく言われたものです。逆ボーダーの重圧、かけられた期待、そういうもので考えすぎて問題が何一つ見えなくなったら困ります。全力で頑張ってください。順位表をみたらほかの人がめっちゃ通してるのに自分だけ...とか思ってしまうので見ないのもよいかもしれません。いずれにせよ、緊張せず普段通りでできる方法を選んでいきましょう。

逆ボーダー後のコンテストの振り返り

 僕は今まで逆ボーダーは3回、逆ボーダー後のコンテスト(つまり色変をかけたコンテスト)は2回経験していますが、それについて分析していきたいと思います。

茶色逆ボーダー後のコンテスト -ABC164-

 僕の茶色逆ボーダー後のコンテストはRated参加回数25回目のABC164でした。この回はA,B,Cを11分と早解きし、またDが水diffと壁になっていたため、パフォーマンスが結構出て当時としては高めの830というパフォーマンスが出て色変できました。正直このときは色がついてとてもうれしかったです。今見返すと、AとBの提出間隔が15秒と小tourist出しをしていますね。ださい。

緑色逆ボーダー後のコンテスト -ABC181-

 僕の緑色逆ボーダー後のコンテストはRated参加回数48回目のABC181でした。この回はA,B,Dを40分で解き、その後ずっとEを考えていました。この回のCはただの全探索なのになぜ飛ばしたのか今となっては全く分かりません(もちろん、ちゃんと解いていたら色変のチャンスもありました)。

 これは、色変しないといけないという焦りによるものだったと考えられます。普通だったらCを解けば色変はできるはずなのに、無理してEを解こうとすることでちゃんと色変をしようと考えていました。考察する問題よりもちゃんと実装すれば解ける問題はぱっと解く、というのが教訓です。ちなみに、その直後のコンテストで入緑できたのでにっこり。

次のコンテストに向けて

 次回のAtCoderのRatedコンテストの予定はABC197です。この回でちゃんと水色のパフォーマンス(正確には1205以上)を取れば僕は晴れて水色になることができます。そのために、普段通りできる力を出すこと、変な問題の解き方はしないことを心掛けて絶対に入水します!!!!!!!

 

頑張ります!!!!!!!!

 

あとがき

 初めての記事、いかがだったでしょうか。つたない文章であったり表記のゆれ、誤字脱字があったりなどするかもしれませんが最初の記事なので目をつむってください(なお、書いたのは深夜の1時くらいです)。この記事を読んでためになる人は本当に限られてくると思いますが、それでも今逆ボーダーである自分が役に立つようなものにはなったんじゃないかな、と思ってはいます。こんなネタ記事を最後まで読んでくださいまして、本当にありがとうございました!!