ACM Poj 2991 計算幾何 線段樹

2021-09-24 04:03:54 字數 1514 閱讀 2239

題目鏈結。

此題涉及到區間所有向量的同一角度旋轉,使用普通陣列維護會超時,因此我們使用線段樹維護,乙個節點維護該區間所有向量的和,最後我們的所求結果就是根節點所維護的向量和。關於線段樹講解可以見此部落格。

#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這個操作就是...