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

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

新規登録して質問してみよう
ただいま回答率
85.50%
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

C++

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

Q&A

0回答

458閲覧

蟻本の問題"Crane"の解説のコードの一部がわからない

rdld036

総合スコア16

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

C++

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

0グッド

0クリップ

投稿2023/02/07 01:44

実現したいこと

蟻本にCraneという問題が載っているのですが、解説コードを見ると以下のようになっていました。43行目ですが、なぜこの条件のときにang[v]の値を更新するのかイメージできません。わかりやすく教えていただけると幸いです。よろしくお願いします。

前提

・変数について
ang[i]...地面に垂直な線との角度 半時計回りが正 初期値は0
prv[i]...前の辺から半時計周りの角度 初期値はπ

該当のソースコード

C++

1#include <bits/stdc++.h> 2 3using namespace std; 4 5typedef long long ll; 6typedef long double ld; 7 8const int ST_SIZE = (1 << 15) - 1; 9int N, C; 10const int MAX_N = 10000, MAX_C = 10000; 11 12double vx[ST_SIZE], vy[ST_SIZE]; //各節点のベクトル 13double ang[ST_SIZE]; //各節点の角度 14 15double prv[MAX_N]; 16 17int L[MAX_N]; 18int S[MAX_C], A[MAX_N]; 19 20//kは節点番号、l, rはその節点が[l,r)んみ対応づいていることを表す。 21void init(int k, int l, int r){ 22 ang[k] = vx[k] = 0.0; 23 if(r - l == 1){ 24 vy[k] = L[l]; 25 } 26 else{ 27 int chl = k * 2 + 1, chr = k * 2 + 2; 28 init(chl, l, (l + r) / 2 ); 29 init(chr, (l + r) / 2, r); 30 vy[k] = vy[chl] + vy[chr]; 31 } 32} 33 34//場所kの角度がaだけ変更になった。 35//vは節点の場号、l,rはその節点が[l,r)に対応づいていることを表す。 36void change(int k, double a, int v, int l, int r){ 37 if(k <= 1) return; 38 else if(k < r){ 39 int chl = v * 2 + 1, chr = v * 2 + 2; 40 int m = (l + r) / 2; 41 change(k, a, chl, l, m); 42 change(k, a, chr, m, r); 43 if(k <= m) ang[v] += a; 44 45 double s = sin(ang[v]), c = cos(ang[v]); 46 vx[v] = vx[chl] + (c * vx[chr] - s * vy[chr]); 47 vy[v] = vy[chl] + (s * vx[chr] + c * vy[chr]); 48 } 49} 50 51void solve(){ 52 init(0, 0, N); 53 for(int i = 1; i < N; ++i) prv[i] = M_PI; 54 for(int i = 0; i < C; ++i){ 55 int s = S[i]; 56 double a = A[i] / 360.0 * 2 * M_PI; 57 change(s, a- prv[s], 0, 0, N); 58 prv[s] = a; 59 printf("%.2f %.2f\n", vx[0], vy[0]); 60 } 61} 62 63int main(){ 64 ios::sync_with_stdio(false); 65 cin.tie(0); 66}

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問