Vimキーバインドの$と0を入れ替える
Vimのマッピングのなかで唯一気に入らないキーバインドがあります。
それが0
と$
です。
0
: カーソルがある行の先頭へ移動$
: カーソルがある行の末尾へ移動
ようは0
は左端に移動、$
は右端に移動です。でもね、キーボードの配列では0
が右側、$
が左側にあるんです!!!!!!!!!!!!!!!!!!!!()
これと似たようなものにI
とA
がありますが、これはまだ納得できるんですよ。i
とI
、a
とA
ででそれぞれ「入る側」が同じだから。頭より先に手がすっと理解してくれる。
(さすがにi
はキーボード右側にあるのにカーソル左側でインサートモードに入ることには文句つけません。「insert mode」のi
なのにカーソル右側に入られたら嫌でしょう)
けど、0
と$
はなんの脈絡も無くだよ!!ちょっと覚えにくすぎないですか???
というわけで0
と$
の役割を入れ替えましょう。
nnoremap 0 $ nnoremap $ 0
はい解決すっきり。これですっきり。
mapは遅い場合があるのでsetやunorderedを検討する
対象の問題
https://atcoder.jp/contests/joi2007ho/tasks/joi2007ho_c
略解
2頂点決まれば、あともう2頂点の座標は計算で出せるので、そういう2頂点が存在するかを調べれば良い。 したがって、2頂点の存在を適切なデータ構造で確認すれば で解ける
適切なデータ構造 として map<pair<int, int>>
を選んだが、これだとTLEだった
解決方法
set
や unordered_set
を使う。map
よりも高速に動作する。
特に unordered_set
は格納順が規定されていないためより高速。
以下メモ的コード例です
// 要素の追加 mp[Key] = 1; // map st.insert(Key); // set u_ut.insert(Key); // unordered_set // 要素が存在するか if (mp[Key] == 1) { ... } if (st.find(Key) != st.end()) { ... } if (u_st.find(Key) != u_st.end()) { ... }
ただし、 unorderd_set<pair<int, int>>
などはエラーが出るため以下のように解決する
(参考: std::unordered_setはデフォルトではpairが使えない[自分用メモ] - Qiita)
struct phash { inline size_t operator ()(const pair<int,int>& p) const { const auto h1 = hash<int>()(p.first); const auto h2 = hash<int>()(p.second); return h1 ^ (h2 << 1); } }; int main() { unordered_set<pair<int, int>, phash> u_set; }
同じ失敗を繰り返さないために
map<Key, bool>
と定義したくなったら set
や unordered_set
を検討する
- 特にソートされている必要がないなら
unorderd_set
を検討する
参考
正答コード
プロコン参加日誌 #procon30
どうも、んぐです。
プロコンの参加記を書きます。
疲れた()ので、簡単にだけ書き留めます。
- 情報
- 大会まで
- 大会当日
- 1日目
- 2日目
- 対戦終了後
- 移動部門
- プログラムの実装について
- 最後に
LaTeXでプログラムのソースコードを綺麗に出力
完全に筆不精のんぐです。
この記事ではLaTeXでプログラムのソースコードを綺麗に出力する方法を書きます。
思ったより調べるのに苦労したので、1つでも参考資料を多くするという意味も込めて書き残します。
環境
の環境って何をどこまで書けばいいのかよく分かりませんねー。 一応環境は書いておきましたけど、他の環境でも同じような方法でできると思います。
jlistingの導入
ソースコードの表示には主に listing
というものを使うんですが、日本語が含まれるソースコードを書く場合には jlisting
が必要になります。まぁなくても問題ないんですが、日本語のコメントアウトの表示がバグったりするらしいので入れておきます。
こちらのサイトからダウンロードさせていただきましょう → https://osdn.net/projects/mytexpert/downloads/26068/jlisting.sty.bz2/
ダウンロードして解凍したら jlisting.sty
が入っているのが確認できると思います。
これを C:/w32tex/share/texmf-dist/tex/latex/listings/
の中にぶち込んでください。ここは環境によって変わると思いますが、WindowsでW32TeXをインストールしてたら、まずこのパスだと思います。
これで環境構築は完了です。
ちなみにこのあとコマンドプロンプトで mktexlsr
を叩いたほうが良い説はあります。僕は叩きましたが意味はわかっていないので各自調べてください。
[参考]
TeX文書を書く
ここからは多種多様かと思いますが、一例を示します。以下の画像のような感じにすることを目指します。
少し長いですが、以下のコードを挿入してください。 例の文書から、ソースコードの表示を制御している部分だけ抜き出してきました。雛形として利用してください。
\usepackage{listings, jlisting, color} \definecolor{OliveGreen}{rgb}{0.0,0.6,0.0} \definecolor{Orenge}{rgb}{0.89,0.55,0} \definecolor{SkyBlue}{rgb}{0.28, 0.28, 0.95} \lstset{ language={C++}, % 言語の指定 basicstyle={\ttfamily}, identifierstyle={\small}, commentstyle={\smallitshape}, keywordstyle={\small\bfseries}, ndkeywordstyle={\small}, stringstyle={\small\ttfamily}, frame={tb}, breaklines=true, columns=[l]{fullflexible}, numbers=left, xrightmargin=0zw, xleftmargin=3zw, numberstyle={\scriptsize}, stepnumber=1, numbersep=1zw, lineskip=-0.5ex, keywordstyle={\color{SkyBlue}}, %キーワード(int, ifなど)の書体指定 commentstyle={\color{OliveGreen}}, %注釈の書体 stringstyle=\color{Orenge} %文字列 }
当然\begin{document}をする前の部分に挿入してください。
一つの文書で複数の言語を利用する場合は、
\lstset{ ..., language={C++}, ... }
の部分を削除して、本文中で\begin{lstlisting}[language=Python]
などというようにlistingを記述する毎に言語を指定するのが良いと思います。その例は「まとめ」の項に出てくる「全体のTeX文書例とその出力結果」を参考にしてください。
実際にコードを書く部分は以下のような感じです。
\begin{document} \begin{lstlisting}[caption=, label=, language=C++] # include <iostream> using namespace std; int main() { cout << "Hello, World!" << endl; return 0; } \end{lstlisting} \end{document}
キャプション(caption)とラベル(label)を省略していますが、当然書くこともできます。デフォルトの設定では listing 1
というキャプションが付きます。
キャプションの listing
の部分を変更したい場合は \renewcommand{\lstlistingname}{Code}
などというコードを追加してください。
まとめ
最後に全体の全体のTeX文書例とその出力結果を載せておきます。適宜参考にしてください。 drive.google.com
参考
listingが対応している言語一覧 tex2e.github.io
所望の言語がlistingに対応していない場合