POJ 2991 Crane

大体理解した。
完全にソラで書けるように何回か復習すべきである。

問題

N個の線分が接続されたクレーンがある。
それぞれの線分の長さはL[i]で与えられる。


はじめは全ての線分がまっすぐ上を向いて接続されている。


ここにC個の命令がくる。命令iは二つの整数Si,Aiにより与えられ、
線分Siと線分Si+1の間の角度をAiにせよという意味である。


このとき、各命令の後で、クレーンの先端がどこにあるかを出力せよ。

制約条件

N≦10000

方針

蟻本p157〜の解説の通り。
Segment Treeを使う。


ノードは連続する線分の集合に対応し、各情報を持つ。

  • 対応する線分を最初の線分を垂直にしてつなげた際の、最初の端点から最後の端点へのベクトル
  • 子ノードをもつとき、二つの子ノードの対応する部分をつなげる際に右の子ノードを回転させる角度


Segment Treeの更新は次のように行う
changeという関数を、
change(int s,double a,int v,int l,int r)として、
s≦lのときは何もしない。
s<rのとき(線分が折れ曲がる箇所が区間の内側に入っている)、
左右の子ノードについてchangeを呼び出し再帰的に更新。
その後、sが中間より左ならang[v]にaを足す。
最後にlからrへのベクトルを更新する。

ソースコード

写経なので略。