題目鏈結。
此題涉及到區間所有向量的同一角度旋轉,使用普通陣列維護會超時,因此我們使用線段樹維護,乙個節點維護該區間所有向量的和,最後我們的所求結果就是根節點所維護的向量和。關於線段樹講解可以見此部落格。
#include#include#define pi acos(-1)
using namespace std;
int n, c;
const int maxn = 10000 + 5;
int l[maxn];
int pre[maxn];
int s, a;
struct node
segment_tree[4 * maxn];
void build_tree(int start, int end, int index)
int mid = (start + end) >> 1;
int left = (index << 1) + 1;
int right = (index << 1) + 2;
build_tree(start, mid, left);
build_tree(mid, end, right);
segment_tree[index].vx = segment_tree[left].vx + segment_tree[right].vx;
segment_tree[index].vy = segment_tree[left].vy + segment_tree[right].vy;
return;
}void rotate_degree(double &x, double &y, double degree)
void push_down(int index)
}void update_seg(int s, double ang, int index)
int left = (index << 1) + 1;
int right = (index << 1) + 2;
push_down(index);
update_seg(s, ang, left);
update_seg(s, ang, right);
segment_tree[index].vx = segment_tree[left].vx + segment_tree[right].vx;
segment_tree[index].vy = segment_tree[left].vy + segment_tree[right].vy;
return;
}int main()
build_tree(0, n, 0);
for(int i=0; i
}return 0;
}
Crane POJ 2991 線段樹 計算幾何
題目鏈結 本題可以用線段樹來做.線段樹的每個區間維護的值如下.1 該區間的第一段豎直放置時,從該區間頭端指向尾端的向量.2 拼接兩個子區間 如果有子區間的話 時,右兒子需要旋轉的角度.這裡說明一下,當乙個子區間被修改時,如果它是父區間的右兒子,則父區間維護的角度不用變,如果它是父區間的左兒子,則父區...
POJ 2991 Crane(線段樹 計算幾何)
description 有一台起重機。我們把起重機看作由n條線段依次首尾相接而成。第i條線段的長度是li。最開始,所有的線段都筆直連線,指向上方。現有c條操縱起重機的指令。指令i給出兩個整數si和ai,效果是使線段si和si 1之間的角度變成ao度。其中角度指的是從線段si開始沿逆時針方向旋轉到si...
POJ 2991 Crane(計算幾何 線段樹)
題目位址 題意 你有乙個挖掘機,他的臂由n根小臂組成,最初的時候挖掘機的臂是垂直向上的,然後有n次操作,每次操作告訴你把第a和第a 1根臂之間的角度旋轉為b 不是旋轉角度為b 每次操作之後把最後那個臂的座標輸出 思路 用線段樹去維護每個臂的向量,然後把第a和第a 1個臂之間的角度旋轉為b這個操作就是...