約 7,945 件
https://w.atwiki.jp/suffix/pages/628.html
メモリ確保等の時に使用できる。 int* a = (int*)malloc(sizeof(int) * 個数); といった形で使うことが多い。 ちなみに int a[50]; for(int i = 0; i sizeof(a) / sizeof(a[0]); i++) { } といったように性的配列の個数を知るためにsizeof(変数名)/sizeof(変数名[0]) というのはよく使われる。 ただし、上の行のように動的配列の場合にはうまくいかない。 mallocしたaに対し、sizeofをするとaの配列の個数ではなく int型の長さの4が返るので注意。
https://w.atwiki.jp/execute01/pages/48.html
メモ ノベルエンジンについて 10/27 スクリプトを一文字ずつ読み込んで、描画を繰り返す。 メッセージを一度に表示しようとすると、その間にキャラや背景を動かすことができなくてつまらない。 ただし、画面全体のクリア時に、描画していた文字が消えてしまうため、メッセージ配列に保存して おき、再度描画してやる必要がある。(最新の一文字だけ表示される状態になってしまうため) だが、その際改行のタイミングが不明となる。 そこで、メッセージは2次元配列に保存するようにし、改行は1次元目配列の番号を進めることで 表現する。つまり改行タグ(@r)が来たときに、1次元目配列を一つ進める。 1行につき、1配列を使う感じ message[行番号][文字列] また、メッセージスピードによる待ちのためにWaitTimer()を使うと、 ゲーム自体が止まってしまうために、結局そこで待っている間は何も動かせない。 なので、メッセージを一文字表示後、現在時間を取得しておき、次回そこに来たときに、 前回の時間取得時から30ms経っていたら文字を表示する、などという処理をする。 つまり以下のようになる if( (現在の時間 - 前回の時間) 30 ) then 文字表示するよん これにより非同期処理が可能になる、はずである。気がする。 ちなみに時間計測は、Windowsが起動した次点からのms精度のタイマーを使う。 戻り値はInt型のため、2147483647msを超えた次点でマイナス値になる。 大体1月以上PCつけっぱにしてると超える。まあ考えてみたら超えても問題なかった。 立ち絵は逐次スクリプト文が来た次点での読み込みとする。 コントローラで読み込みしちゃっていいのかな? まあいっか。しらんわ。 キャラクターレイヤ番号を指定し、そこに当てはめる画像を読み込む、という仕様の予定。 過去ログ ■進捗 日付 作業内容 進み具合 10/11 キャラクターレイヤークラスの作成 30%ぐらい。まだちょっとこれでいいのか悩み中……。 10/13 キャラクターレイヤークラスの作成 概ね完成。まあとりあえずいいんじゃないでしょうか。 10/16 メモリ管理バグ修正 しばらくやってみたが原因わからず。知り合いにも調査依頼中。 10/22 メモリ管理バグ修正 やっと修正完了……。デストラクタをvirtualにするとか知らんわw 10/23 マップチップ配置テスト とりあえずSimSceneの表面実装完了。マップチップ配置テスト中 10/24 マップ配置及びスクロールテスト 画面スクロール実装。なかなか調子良さげ 10/25 ノベルエンジン作成 基本機能実装したものの、イマイチなのでやり直し濃厚 10/26 ノベルエンジン作成 やり直しし、順調に進む。ただしメイン部分と組み合わせにくくなった 10/27 ノベルエンジン作成 なんというか予想通り問題発生 10/29 ノベルエンジン作成 逐次画面クリアに対応 10/30 シーン設計の見直し 大幅に変更する可能性が大 10/31 シーン設計の見直し コントローラボックスを用意する方向で考え中。 日付 作業内容 コメント 11/01 シーン設計の見直し /^o^\フッジサーン 11/03 シーン設計の見直し 突破口がやっと見えてきた。ゴールしてもいいよね…。 11/05 シーン設計の見直し ゴー…ル…… 11/06 ソースコード整理 そろそろごちゃごちゃなので纏める 11/07 シーン設計 コントローラの有効無効の設定 11/08 移動処理作成 算数できない(^q^) 11/10 ソースコード整理 これだけで10時間かかるだろ…… 11/13 移動処理作成 移動処理の前にやることたくさんあった/^o^\ 11/17 ノベルシーン作成 移動処理が進まずこっちをやってしもうた 11/23 移動処理作成 まあ大体できた 11/30 コレクションシーン作成 あとちょっとでいけそう ・SRPGの移動処理を作成する →ユニットクラスの作成する OK →カーソル座標とユニット座標を実装 OK →マス座標からピクセル座標に変換し描画 OK →重なっていたときにキーが押されたら移動処理をする。OK →移動力に従って移動範囲を作成 OK →その前にマップクラスの作成 OK →マップ地形クラスの配列、マップステージ配列を持たせる OK →マップ地形クラスには、地形の画像及び移動コスト、特殊効果等を持たせる OK →移動経路の作成 OK →移動処理 OK ・CVSからのマップ読み込みに対応する →配列からの読み込みには対応。 →CVSファイルから読み込み、配列に入れればOK ・命令タグのリソース指定に対応する。 →検索用関数をつくればOK ■課題・問題点 ・マップ全体の形が菱形でなく長方形と予想されるため、ベストな方法を模索中。 ・マップチップの配置ってX座標+1したほうがいいのかなぁ……。 ・マップチップ等を上から順に描画しなければいけない。 ・ノベルエンジンのスクリプト仕様を考案中。 ・メイン部分にどうやって実装しようか考え中。 →メッセージスピードの変更や、非同期の処理(メッセージ表示しながらキャラクタを 動かす等)は可能になったと思われる。 ・逐次画面クリアするのでメッセージ配列は全て保存しておかなくて はいけないという問題発生。うーん、どっちがいいんだか。 ■その他・予定変更など ・ドット絵素材のサイズは、基本的に8の倍数が良いかと思います。 理由は色々ありますが、主な理由は、「すべて8の倍数のサイズで」という風に決めておかないと、 マップチップ上に配置したときにわずかにずれてしまいます。後々そのズレが大きくなる可能性 もあるので、基本は8の倍数で描かれることが多くなっています。
https://w.atwiki.jp/kohei-hasegawa/pages/74.html
2-3.繰り返しの基礎を学ぼう 人間が苦手だけど,コンピューターが得意なこと,それは繰り返しと一貫性です.何かの計算を1万回間違いなく解いてと言われてできる人はおそらくいません.しかし,コンピューターであれば適切な式と命令が与えられれば,ものにもよりますが5秒程度で全ての計算が終わることでしょう.つまり,膨大な量のデータを瞬時に処理できるということです.繰り返し処理を学ぶことでこれまで処理できなかった膨大で複雑な計算を必要とするタスクも容易にこなすことができるようになるでしょう. (1)配列(リスト)とインデックス 繰り返し文の学習に入る前に配列の作り方を学ぶ必要があります.配列は[ ]と,を使って表現します.[ ]で配列を囲い,,でそれぞれの要素を分けています.例えば,Pythonで使う配列は以下のように表現します.配列には数値も文字列も入れることが出来ます. a = [1, 56, 25, 46] b = [“Brazil”, ”Russia”, “India”, “China”, “South Africa”] では,変数aから25を,変数bからChinaを出力させたいとします.こうするにはどうしたら良いでしょうか?配列からその要素を抽出するには配列番号(インデックス)を知る必要があります.例えば,上記のケースでは以下のように目的の要素を表示させます. print(a[2]) print(b[3]) 上記のように表示できるのには,配列のそれぞれの要素に0から始まる数字が対応して付与されているからです.変数aの要素と要素番号の関係を以下に示します. 要素番号 0 1 2 3 要素 1 65 25 46 ここで特に注意しなくてはならないのが.インデックスは0から始まるということです.初心者はここを勘違いしてプログラムからエラーを出されることが多いので覚えておきましょう. なお,インデックスは後ろから数えることも出来ます.先程の例のように変数aの25を表示させたい時は配列の一番右側を[-1]からスタートし,以下のように表現します. print(a[-2]) (3)for…inを活用する さて,ここからようやくfor文の出番です.for文はその後のinとセットで使われます.for…inの定義は以下のとおりです. for variables in list 配列list内の要素variablesを順次抜き出し,その数だけforブロック内の処理を実行します. 例として,前ページの変数aを使ってforの簡単なプログラムを作成します.ここで,プログラム中のiやjがvariables,配列aがlistに相当します. for_1.py a = [1, 56, 25, 46] for i in a print(i) for i, j in enumerate(a) print(i, j) enumerate(list) 配列list内の要素と要素番号を同時に対象の変数に格納します. for_1.pyの出力 1 56 25 46 0 1 1 56 2 25 3 46 出力にあるように,配列の各要素を抜き出し,その数だけ繰り返しを行っていることが見て取れます.更に,enumerate()関数を使うことで変数iに要素番号を,変数jに要素をそれぞれリストから吐き出し順次計算を行っていることが分かるかと思います.このようにfor…inを使うことでリストから繰り返しの動作を行えるようになりました. (4)Whileで条件付き繰り返し for…inだけではなく,whileという文を使うことで繰り返しを行なうことが出来ます. while conditional expression 条件式conditional expressionがTureである限りネスト内を繰り返す ここで,while文を使った簡単なゲーム風戦闘シーンを再現しましょう. Game_Battle.py import random Man = 15 # hit point Monster = 20 Nturns = 1 # Number of turns while Man = 0 and Monster = 0 # iterate code among nests as long as condition is “True” while Man = 0 and Monster = 0 # iterate code among nests as long as condition is “True” Attack_Man = random.randint(1,8) # determine striking power Attack_Monster = random.randint(1,5) Man -= Attack_Monster # equal to Man = Man - Attack_Monster Monster -= Attack_Man print(“Man is damaged ”, str(Attack_Monster)) print(“Monster is damaged ”, str(Attack_Man)) Nturns += 1 # retrieve who is deadprint(“At turn”,str(Nturns))if Man 0 print(“Man is dead”)else print(“Monster is dead”) random.randint(start,end) 一様分布に従ってstartからendまでの範囲で整数をランダムに生成する ここで初めてimportという文章が出てきました.importは外部ライブラリを呼び出すコードです.ここでの外部ライブラリはrandomです.random は乱数生成に関する関数が内包されたライブラリです. ここで,#の後に変数の説明があることが分かるかと思います.これを「コメントアウト」と言います.#以後のコメントはその行内においてプログラムの実行には関わりません.これを応用すると,テストやバグ箇所の確認のために途中のコードをコメントアウトすることが出来ます.Atomでは,コメントアウトしたい範囲を選択してCtrl+/を押すとその範囲のコードを全てコメントアウト出来ます. (5)BreakとContinue 繰り返し文で結構使用することが多いのがBreakとContinueです.前者は繰り返しを中断させるコマンド,後者は該当する処理だけをスキップするものです.下にBreakとContinueの例を示します. Breakの例 array = [1,2,3,4,5] for i in array if i == 4 break print(i) Continueの例 array = [1,2,3,4,5]for i in array if i == 4 continue print(i) 左側は出力として1,2,3なります.右側は1,2,3,5となります.前者は条件式の4を迎えた時点で繰り返しが中断されています.後者は条件式の4を迎えたらその場合のprint(i)を実行せず,i=5の繰り返しに向かいます.breakの実用的な例としては,配列から特定の値を見つけ出したらもうこれ以上繰り返しを行う必要がないといったものです.具体的には以下のようなものがあります. Array = [45,68,100,56,29,56,88,69,92]for i in Array if i 80 print(Found target value ,i) break Found target value 100 コラム3.メモ帳を使う猛者 プログラムを作る際にはプログラム開発に特化したエディタを使用することをおすすめします.しかし,一方でメモ帳を使ってプログラムを作る猛者を時々見かけます.エディタを使わないことによるデメリットは色々ありますが,特にプログラムの実行が面倒です.エディタを使えばエディタの内部でキーボードを一回クリックするだけで直ぐに開発したプログラムの実行内容を確認できます. しかし,メモ帳を使った場合,プログラムを保存→コマンドプロンプトを実行→プログラムを指定して実行,というプロセスを踏まなくてはなりません.これらがエディタを使うことを推奨する理由の一つです. コラム4.for _ の正体 時々コードを探しているとfor _ in range(5)のような表現を見かけます。普通はfor i in range(5)のように書くと思いますが、これはどう言う意味で、どういった動作を行うものなのでしょうか。 例えば、print(“TMU”)というコードを5回実行するプログラムでは、for _ in range(5) print(“TMU“)もfor i in range(5) print(“TMU“)も同じ結果を出します。ここでは、for文のネストに変数iが影響する動作はありません。ループの中でi=1,2,3...と変わっていってはいますが、これはprintとは無関係です。_の場合は変数は生成せずに指定された回数だけループ内の動作を実行します。 私はこれが好きで、「ループ内で変数が変わることはありませんよ」というメッセージをアンダーバー(_)から伝える事ができます。 ちなみに、ループ内の動作が一つだけであれば上記のようにfor文と動作を一行で書くことができます。 次へ
https://w.atwiki.jp/dewfalse/pages/16.html
enum(列挙型)とint(数値)の相互変換方法 enum→int ordinalで順番を取得して数値に変換する。 enum EnumTest {A, B, C}; EnumTest e = EnumTest.A; int i = e.ordinal(); int→enum valuesで配列を取得し配列アクセスで列挙型に変換する。 配列境界チェックを超えるとArrayIndexOutOfBoundsException例外が発生するので自力でなんとかすること。 enum EnumTest {A, B, C}; int i = 0; if(0 = i i EnumTest.values().length) { EnumTest e = EnumTest.values()[i]; } else { // ArrayIndexOutOfBoundsException }
https://w.atwiki.jp/cschola/pages/47.html
C言語スコーラ このページはC言語スコーラ前期のC言語の取りまとめページです。 C++のページはこちら カリキュラム 序章 スコーラの進め方 第一回 プログラムの作り方 文字出力 コメントアウト 第二回 数値の表示 変数 変数の種類 入力を求める インデント 第三回 if文 switch文 第四回 while文 for文 第五回 ここまでのおさらい 練習問題とTIPS 第六回 配列 多次元配列 文字の配列 第七回 関数 値を返さない関数 標準ライブラリ関数 第八回 構造体 列挙型 復習問題 第九回 ファイル分け ヘッダの使い方 extern変数 第十回 ポインタ ポインタ応用編 構造体のポインタ 第十一回 bool型 おまけ ゲーム制作 管理人メモ
https://w.atwiki.jp/multilingual/pages/37.html
「多言語タイピングを初めてみたいけど、何から手を付ければいいかわからない」 「多言語タイピングWikiの情報が多すぎて、どこを見ればいいかわからない」 ・・・近頃、そんな声を耳にするようになりました。 そんなあなたにお勧めするのがこのページ!この一連の記事だけ見れば、あなたもすぐに多言語タイパーになれます! 日本国内だけでタイピングを競っているのはもったいない! ぜひあなたも次回のInterstenoで多言語タイパーデビューしましょう!!! まず配列を準備しましょう 多言語を始める上でまず直面するのが、使用する配列の問題です。 初めて多言語を打つ人にとっては選択肢が多すぎて、どの配列を選べばいいのかよくわからないですよね? そこで今回はparaphrohnさん・たのんさんのお二人が、初心者向けの配列を作成してくれました!「変換キー」あるいは「無変換キー」を押しながら上記の画像の対応するキーを押すことで、それぞれの特殊文字が入力できる配列です。 (例:変換/無変換キー+ a→ä 変換/無変換キー+z→à) 母音はそれぞれ同じ列に揃え、同じ種類の記号を同じ段にまとめることで、学習効率が高い配列となっています。 この配列一つで、イタリア語・スペイン語・オランダ語・ドイツ語・フィンランド語の5言語を打つことができます。 さて、それでは早速配列を導入してみましょう!! 1.tanophrohn.zipをダウンロード 2.解凍し、中に入っているtanophrohn.exeを実行 タスクバーにアイコンが表示されたら、すでに多言語が打てる状態になっています! 早速、変換キーor無変換キーを押しながら、色々なキーを打ってみましょう! 変換キーと無変換キーはどちらも同じ機能を持たせてありますので、どちらでも押しやすい方を使ってください。 (ソフトを終了、または機能を一時停止する際はタスクバーのアイコンを右クリックして、Exitなどを選択してください) それではこの配列を使って、多言語を実際に打ってみましょう! (心の弱さはすべて消し去れ) ダンテ『神曲』-ogne viltà convien che qui sia morta; 01.イタリア語 イタリア語は子音と母音のリズムが日本語に近く、特殊な記号もほとんど使われないことから、多言語入門に最適な言語です。 イタリア語で使われる特殊文字は以下の通りです。 グレイヴ・アクセント àèìòù アキュート・アクセント é イタリア語でアキュート・アクセントが使われるのはeだけです。 グレイヴ・アクセントという記号がメインで使われる言語だということですね。 eだけはèとéの両方が出てきてややこしいですが、そこだけはがんばって慣れてください! オレンジ色の部分がイタリア語で使われる特殊キーです。 基本的には下段を使用し、eだけ上段も使用すると覚えておいてください。 イタリア語入力の練習サイトとしては、TypeRacerや10FastFingers、あるいはいきなりInterstenoの練習ページに挑戦してみるのもいいでしょう。 ここでは適度な文章の長さと記号の出現頻度から、Keyheroをお勧めしておきます。 慣れてきたら10FastFingersでCompetitionを開いてもいいですし、他の人を誘ってTypeRacerで対戦してみるのも面白いでしょう。 あるいは10FastFingersやInterstenoの記録をTwitterに貼ってみると、思わぬライバルが現れるかもしれません。 元々Qwertyを打てる人であれば、しばらくは打てば打つほど伸びるはずです。このサクサク成長する楽しさが味わえるのも、多言語タイピングの醍醐味の一つです。ぜひ、多言語タイピングを気軽に楽しんでみてください。 (私は不可能なことをやる。なぜなら可能なことは誰にでもできるからだ) パブロ・ピカソ-Yo hago lo imposible, porque lo posible lo hace cualquiera. 02.スペイン語 スペイン語もイタリア語と同様、多言語入門に最適な言語です。 スペイン語で使われる特殊文字は以下の通りです。 アキュート・アクセント áéíóú トレマ ü チルダ ñ イタリア語と異なり、上段のアキュートアクセントが大活躍します。 グレイヴ・アクセントが出てこない代わりに、トレマ付きのuや、チルダ付きのnという特殊な文字が出てきます。 オレンジ色の部分が、スペイン語配列で使用するキーです。 上段が中心ですが、üとñでは中段や下段も少し使います。 またスペイン語では、疑問符(?)や感嘆符(!)を逆にした、逆疑問符(¿)や逆感嘆符(¡)が文頭に出てくることがあります。 上記画像の緑色の部分、つまり通常の!や?と同じ位置に置いてありますので、変換or無変換キーと一緒にそれぞれのキーを打鍵してください。 (偉業は小さなことの積み重ねによって成し遂げられる)ゴッホ-Grootse dingen worden gemaakt als een reeks kleine dingen bij elkaar is gebracht. 03.オランダ語 オランダ語は、ゲルマン語派特有の打ちにくさは少しあるものの、英語を除けば特殊文字の比率が最も少ない言語です。配列導入なしでもある程度ゴリ押しができることから、初心者オススメの言語として真っ先に挙げられるのがこのオランダ語ですね。 オランダ語で使われる特殊文字は以下の通りです。 アキュート・アクセント áéíóú グレイヴ・アクセント è トレマ äëïöü ・・・意外と特殊文字が多いですね。 そう、なんとなく打つのは圧倒的に簡単な反面、まともに打とうとすると意外とめんどくさいのがこのオランダ語です。 画像で見ても、幅広くキーを使うことがわかるかと思います(それぞれの使用頻度はかなり少ないのですが)。 まずは他のイタリア語やスペイン語、ドイツ語などでそれぞれの特殊文字に慣れてからオランダ語を練習するようにすると、オランダ語でたまに出てくる特殊文字にも対応しやすくなると思います。今回の配列はその辺りの相乗効果も狙って作っているので、ぜひ並行して練習してみてください。 -Üben Sie es nur recht fleißig, so wird es schon gehen; Sie haben ja fünf eben so gesunde Finger an jeder Hand wie ich.(ただ勤勉に練習しなさい、そうすれば上手くいく。君は私の指とそっくり同じの健康な5本の指が両手にあるのだから) J.S.Bach 04.ドイツ語 ドイツ語は英語やオランダ語と同じ語派に属しています。 単語同士がくっついて長くなることや、固有名詞以外の名詞もすべて大文字で始まることで少し打ちにくく感じられますが、特殊文字の種類は少ないので多言語初心者には比較的入りやすい言語でしょう。 ドイツ語で使われる特殊文字は以下の通りです。 ウムラウト äöü エスツェット ß 特殊文字は4つだけ。これまでで最少ですね。 ちなみにドイツ語で使うウムラウト(変音記号)というのは、厳密にはトレマ(分音記号)とは役割が異なるのですが、文字の形としてはトレマとまったく同じなのでタイピングする上では気にしなくてもいいです。 ただ、ドイツ語の時はちゃんとウムラウトと言っておくと「おっ、ちゃんとドイツ語わかってるな」と思わせることができます。 すべてホームポジションに置いてありますので、慣れればそれほど苦労しないと思います。 (ソーセージはフィンランド人に一番好まれている野菜である) フィンランドのことわざ-Makkara on suosituin suomalaisen vihannes. 05.フィンランド語 フィンランド語は、これまでの言語とは大きく異なるグループに属する言葉です。打ってみると、雰囲気がまったく異なることにすぐに気づくと思います。 同音連打の多さや単語認識の難しさなど、タイピングとしては難しい要素を持っていますが、特殊文字の種類は圧倒的に少ないので、ぜひ挑戦してみてほしい言語です。 フィンランド語で使われる特殊文字は以下の通りです。 ウムラウト äö リング å フィンランド語の特殊文字はなんと、たった3つです。しかもリングはまず出てこないので、実質2つと言ってもいいでしょう。 (リングの登場頻度は非常に少ないので薄く塗りました) ウムラウトが連続で出てくることから、インターナショナル配列ではフィンランド語は非常に打ちにくいと言われてきました。 しかしこの配列では、ウムラウトがホームポジションに配置されており、無変換/変換キーを押しながら連続で打つこともできるので、かなり打ちやすくなっているはずです。 インターナショナル配列でフィンランド語に挫折した方も、ぜひまた挑戦してみてください。
https://w.atwiki.jp/memorandum_book/pages/40.html
DRAW_LINE ラインで結ぶ DRAW_SECTION 配列内のEmptyValue以外の数値をラインで結ぶ表示を制御する為にSetIndexEmptyValue()関数を使用する。 DRAW_HISTGRAM 棒グラフのように表示 DRAW_ARROW シンボルをプロット DRAW_ZIGZAG 2つの配列を参照し有効な値を結ぶ使用する配列は両方ともDRAW_ZIGZAGを指定同じ時間に対して2つとも有効な値を保持していたら当然垂直な線がひかれる今のところは何に使用するか思いつかない… DRAW_NONE 表示はしない
https://w.atwiki.jp/nenaiko/pages/17.html
◆多次元vector vectorで多次元配列を実装する ◆使い方 // int型の2次元配列 std vector std vector int number; // 横5,縦3の2次元配列を用意する場合 std vector std vector int number; number.resize(5, 0); for (int i = 0; i test.size(); i++) test[i].resize(3, 0); ◆注意 push_backを使うなら縦サクの下に要素を追加していくイメージ 初期化のときは注意 http //www50.atwiki.jp/nenaiko?cmd=upload act=open pageid=17 file=vectorvector.png
https://w.atwiki.jp/icpctrain/pages/28.html
AOJ2331 A Way to Invite Friends サイト http //judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2331 解説 以下の三種類の解法を示す いもす法 セグメント木 Fenwick木 解法 いもす法 問題文は以下のように解釈してみると良いかもしれない。 まず人数を軸に取った数直線を考える。 入力で与えられるそれぞれの人が許容できる友達の人数を表す区間の線分を数直線に重ねてみる。 そのとき大きい区間が小さい区間を出来るだけすべて包含出来るように整理して重ねる。 ------------------------------------- n人 ------------------ ----------- -------------- -- ------- ------------ とあれば、 ------------------------------------- n人 ------------------ ----------- -- -------------- ------------ ------- とまとめるイメージをしてみる。これより、重なりのもっとも多い部分が誘える友達の人数でありそうだと思える。数字列に置き換えると 00122123444444433332011111111111000000... これより上のような累積和を表す数字列を配列で示せれば、「基本的には」その配列の最大の値を見ると解が分かる。「基本的には」と書いたが、これについては後で詳しく追記予定。(上の例のような線分がうまく重なり合う以外に、上の線分が下の線分を包めないようなものがあるということ) しかしO(N*T)の二重ループで実装するのは時間がかかり過ぎてしまうので別の方法を考える。 ここで、いもす法を用いる。 まずそれぞれの許容できる友達の人数区間の最小と最大のみ考える。上の図で言うと線分の端点のみに着目している。 ここで例えばある人がa人以上b人以下が許容できるなら v[a]++ v[b+1]-- として、あるa人以上b人以下の友達を許容出来る人の区間の端点情報のみ用いて、まずは求めたい配列上で数の増減のみを記録させておく。 ここで、b人までは許容できるがb+1人は許容できないのでv[b+1]においてデクリメントしているという意味があることに注意しておく。 このようにして例えば一人分の情報を用いると、以下のような1と-1のチェックが入った配列を得ることができる。 00100000000000000000000000000000-1000000... これをN人分重ねて繰り返す。結果以下のような配列ができあがる O(N) 00110-1111000000-1000-1-210000000000-100000... 各数字に左隣の数字を足していくと目的の数字列を示す配列が手に入る O(T) 00122123444444433332011111111111000000... 結果O(N+T)で答えが得られそうである。 しかし注意点として最終的な解はhogehoge 解法 セグメント木 (編集中) 解法 Fenwick木 (編集中)
https://w.atwiki.jp/kohei-hasegawa/pages/73.html
関数リスト Python-native 目的 関数 Python外部からデータを手打ちで入力する input(strings,[prompt]) データ型を知る type(object) 最大値を取得する max(iterable) 最小値を取得する min(iterable) 要素番号と要素を同時に出力する enumerate(list) 複数のリストから要素を同時に出力する zip(*iterables) リストの要素数を取得する len(list) 整数の順列を確保する range([start,]stop[,step]) 特定の値と一致するリストの要素の要素番号を取得する list.index(variable) リストに要素を結合する list.append(x) or list.extend(x) 整数をランダムに生成する random.randint(start,end) 乗数を計算する pow(a,b) 特定の要素を削除する list.remove(a) 数学系 import math 目的 関数 指数の計算 math.exp(x) 自然対数の計算 math.log(x[, base]) 乗数の計算 math.pow(x, y) 平方根の計算 math.sqrt(x) 逆双曲線余弦の計算 math.acosh(x) 乱数系 import random 目的 関数 整数順列を取得 random. randrange(start, stop[, step]) 整数を取得 random.randint(a, b) 乱数を取得 random.random( ) 範囲を指定して乱数を取得 random.uniform(a,b) 乱数列を初期化する random.seed(a = None [,integer]) 組み合わせ系 import itertools 目的 関数 配列の累積値を取得 accumulate(p) 重複ありの組み合わせを取得 product(p,repeat = r) 重複なしの組み合わせ取得 permutations(p,q) 重複なしの順列組み合わせを取得 combinations(p,q) 重複ありの順列組み合わせを取得 combinations_with_replacement(p,q) ディレクトリ系 import os 目的 関数 備考 カレントディレクトリを表示 .getcwd ディレクトリを表示 .dirname ディレクトリを移動する .chdir ディレクトリを作る .mkdir or .makedirs( ) .makedirs(exists=True)がおすすめ ディレクトリの中を全てリストにする .listdir ファイルを削除する .remove() listdirとfor文でフォルダ内一括ファイル削除が可能 ディレクトリかどうか .path.isdir パスが存在するかどうか .path.exists() ホームドライブを取得する getenv("HOMEDRIVE") ホームパス(ユーザーフォルダ)を取得する getenv("HOMEPATH") 時間管理 import datetime 目的 関数 現在時刻のフル情報を取得 .datetime.now( ) 日付と時刻を取得 .datetime( ) 日付を取得 .date( ) 時刻を取得 .time( ) 時間差を取得 .timedelta( ) 日時オブジェクトを文字列に変換 .strftime( ) テキスト管理 目的 関数 テキストファイルを開く open(path) テキストファイル全体を読み込む file.read() テキストファイルを閉じる file.close() 文字列を指定して分割する split(strings) 改行記号ごとに文字列を分割して取り込む file.readlines() 読み書きモードを指定してテキストを開く With open open(path, mode) 辞書系 目的 関数 keyのリストを返す keys(dict) valueのリストを返す values(dict) numpy 配列生成系 目的 関数 特定の値で満たされた配列を生成 np.full(shape, (fill_value)) 指定した配列サイズのメモリを確保する np.empty(shape) 0で初期化された配列を作成 np.zeros(shape , dtype = float…) 1で初期化された配列を作成 np.ones(shape , dtype = float…) 浅いコピーを生成 np.copy(X…) 深いコピーを生成 X.view( dtype = None…) 連番の整数を生成 np.arange([start, ]stop[,step][,dtype = None]) 等差級数を作成 np.linspace(start, stop, [num = 50,] [endpoint = True,] [retstep = False,] [dtype = None]) 入出力系 目的 関数 配列をcsvとして入力する np.loadtxt(fname...) 配列をcsvとして出力する np.savetxt(fname,X,delimiter...) 数学系 目的 関数 対数の計算 np.log(X…) 乗数の計算 np.power(X,Y…) 指数の計算 np.exp(X,…) 内積を計算 np.dot(X,Y…) 逆数を計算 np.reciprocal(X…) 四捨五入系 目的 関数 小数点以下を切り捨て,小さい方の整数に np.floor(X…) 小数点以下を切り捨て np.trunc(X…) 小数点以下を切り捨て,大きい方の整数に np.ceil(X…) 四捨五入 np.round(X…) 0 に近い方向の整数をとります np.fix(X…) 絶対値を取得 np.abs(X…) or np.absolute(X…) 参照系 目的 関数 最大値を取得 np. max(X[,axis = None]…) or X.max() 最小値を取得 np.min(X[,axis = None]…) or X.min() 最大値の要素番号を取得 np.argmax(X[,axis = None]…) or X.argmax() 要素番号を一次元から多次元に変換 np.unravel_index(indices,dim…) 最小値の要素番号を取得 np.argmin(X[,axis = None]…) or X.argmin() ゼロでない要素の要素番号を取得 np.nonzero(X) 整理整頓系 目的 関数 縦ベクトルへの変換 np.c_[X1[,X2]…] 垂直方向への結合 np.vstack(X1[,X2]…) 水平方向の結合 np.hstack(X1[,X2]…) 配列を変形する X.reshape or np.reshape(X,newshape) 配列を一次元に変換する X.flatten 配列の要素を特定の範囲に収める np.clip(X, min,max…) 配列の要素を昇順に並び替える np.sort(X, axis = None…) ソートした場合の要素番号を取得する np.argsort(X, axis = None…) ヒストグラムの元配列を作成する np.histogram(X[,nbins,density…]) 乱数系 import numpy.random 目的 関数 0から1の範囲で乱数を生成する np.random.rand(shape) 整数の乱数を生成する np.random.randint(low, high=None[, size=None]…) 標準正規分布に沿って乱数を生成する np.random.randn([size = None]…) 正規分布に沿って乱数を生成する np.random.normal(loc=0.0, scale=1.0[, size=None] 乱数列を初期化する np.random.seed(a = None [,integer]) オリジナルの乱数リストから乱数を生成する numpy.random.choice(a[, size=None][, replace=True][, p=None]) ポアソン分布に従って乱数を生成する np.random.poisson (lam=1.0, size=None) 特定の範囲で乱数を生成する numpy.random.uniform([low=0.0][, high=1.0,] size=None) 対数正規分布に従って乱数を生成する np.random.lognormal(mean=0.0, sigma=1.0, size=None) 演算系 目的 関数 総積を取得 np.prod(a[, axis=None]…) 累積和を取得する np.cumsum(a[, axis=None]…) 累積積を取得する np.cumprod(a[, axis=None]…) 集合系 目的 関数 重複要素を取り除いた集合を生成する np.unique(X[, axis=None][,return_index=False][, return_counts=False]…) 配列の要素が比較する配列にあるかを確認 np.in1d(X1,X2[,invert=False]…) 配列同士の共通要素を取得 np.intersect1d(X1,X2…) 比較対象にある要素を除外した配列を生成 np.setdiff1d(X1,X2[, assume_unique=False]…) 双方で共通する要素を出力 np.setxor1d(X1,X2[, assume_unique=False]…) 双方の要素を結合して出力 np.union1d(X1,X2) matplotlib 描画系 目的 関数 折れ線の書き出し plt.plot(x,y) グラフの画面出力 plt.show( ) 散布図の出力 plt.scatter(x,y) ズームグラフオブジェクトの生成 mpl_toolkits.axes_grid1.inset_locator. zoomed_inset_axes(axes, multiplier, loc = None,bbox_to_anchor=None…) ズームグラフの囲み線と引き出し線を作成 mpl_toolkits.axes_grid1.inset_locator. mark_inset(axes, inset_axes, loc1,loc2…) 棒グラフの書き出し axes.bar(x,y[,width=0.8]…, **kwargs) ヒストグラムの書き出し axes.hist(x[,nbins=10][,range][,normed=False][,cumulative=False]…, **kwargs) 横棒グラフの書き出し matplotlib.axes.Axes.barh(y,width[,height]…) 信頼範囲/面グラフの書き出し axes. fill_between ( x, y1, y2=0, where=None… **kwargs ) 直線を引く axes.hlines, axes.vlines 折れ線の確率密度を示す axes.vlines 凡例を自作する Lines.Line2D オブジェクト系 目的 関数 Figureオブジェクトの生成 plt.figure([figsize=None][,dpi=None][,facecolor=None][,edgecolor=None]…) Axesオブジェクトの生成 fig.add_subplot(N,M,Number…) Axesオブジェクトの生成 fig.axes(arg=None, **kwargs) 好きなところにグラフを配置する matplotlib.pyplot.axes(arg = [left, bottom, width,hight ]…) 凡例オブジェクトを作成する Lines.Line2D ax.legend 体裁系 目的 関数 軸ラベルの設定 ax.set_xlabel(“xaxis”), ax.set_ylabel(“yaxis”) 軸目盛りの設定 axes.axis.set_tick_params( ),ax.tick_params( ) 軸範囲の設定 ax.set_xlim(bottom=None, top=None, emit=True, auto=False, *, ymin=None, ymax=None), ax.set_ylim( ) グラフの位置を調整する fig.subplots_adjust( ) テキストを挿入する ax.set_title(), matplotlib.axes.Axes.text(x, y, s … *kwargs) 目盛りラベルを設定する Axes.axis.set_ticklabels( ) 軸目盛りを挿入する matplotlib.axes.set_○ticks(list[,minor=False]) 軸オブジェクトを生成する matplotlib.ticker.FixedLocator (locs, nbins=None) 軸線の表示を操作する axes.spines["place"] 直線を引く axes.hlines, axes.vlines 特殊文字 目的 関数 斜体 $\it{word}$ 上付き $^{word}$ Matplotlibにおけるその他の数学表現は 公式テキスト を参照 Matplotlibの チートシート その他 目的 関数 配列を見やすく表示する pprint.pprint