質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++/CLI

C++/CLIは、.NET Frameworkの共通言語基盤であるCLI向けにC++を拡張したプログラム言語です。前身のC++マネージ拡張と比較するとシンプルで分かりやすい構文になっており、高い可読性を持ちます。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

2159閲覧

なぜ、配列をビットシフトして確保しているのか?(c++)

Juntendou

総合スコア1

C++/CLI

C++/CLIは、.NET Frameworkの共通言語基盤であるCLI向けにC++を拡張したプログラム言語です。前身のC++マネージ拡張と比較するとシンプルで分かりやすい構文になっており、高い可読性を持ちます。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2021/06/28 17:17

Atcoderの競プロ典型 90 問の第一問目について

競プロ90 問の第一問目の

#include <iostream> using namespace std; long long N, K, L; long long A[1 << 18];

において、

long long A[1 << 18];

のビットシフトで確保する理由とメカニズムが理解できないので、ご教授願います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

1 << 182の18乗です。C++に冪乗演算子**があれば、long long A[2**18];と書くのでしょうが、そういう演算子は無いのでlong long A[1<<18];と書く事になる。
(処理系によってはlong long A[(int)pow(2,18)];も可能)

普通のプログラマーは、「1 << 182の18乗」を脳内で一瞬で変換します。

投稿2021/06/28 17:44

otn

総合スコア84507

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

コンパイラは、定数の計算であれば計算結果で置き換えてコンパイルしますから、ソース上に1<<18と書いてあればそれは262144と書いてあるのと同じことです。
普通は、その値の「意味」を表したい時にそういう書き方をするのですが...例えば1日の秒数を表したい場合に606024 みたいに書けば86400という数字が書いてあるよりも「意味」が読み取りやすいですよね。(コメントも添えますけれど)

ちょっと話を変えて

解答サンプルの全体を見渡すと、その後に出てくるAのインデックスは

C++

1 for (int i = 1; i <= N; i++) { 2 if (A[i] - pre >= M && L - A[i] >= M) { 3 cnt += 1; 4 pre = A[i]; 5 } 6 }

C++

1 for (int i = 1; i <= N; i++) { 2 cin >> A[i]; 3 }

だけです。
ここで、問題としてN<10^5と規定されています。このプログラムではNを超える値は添字として与えられることはありません。
(付け加えるなら、A[i]<L<10^9というのも規定されています。つまり、Aの要素は(intが4byteの系であれば)intでもいいはず、少なくともlongであれば十分なはず)
ということで、配列の宣言は
long A[100000+1];//+1しているのはA[0]を使ってないから。これも「式で書く」例。
で良かったはずです。ちゃんと躾けられたプログラマならさらに「マジックナンバー」を嫌って

C++

1const int MAX_L=100000; //切れ目の最大個数 2long A[MAX_L+1]; //A[0]は使用せずMAX_L個の要素を使用

とでもするところでしょう。

ではなぜ1<<18なのか。
Aの要素数真面目に考えるのめんどくさい。思考停止しよう。なんでもいいから、大きな値、そうだ1<<18だったらきっと十分大きいよね、というのが1<<18の意味であり、意図なのでしょう。

競技プログラミングってそういう世界なのかなぁ? だったら染まって欲しくないなぁ。

投稿2021/06/28 22:55

編集2021/06/28 22:59
thkana

総合スコア7637

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問