POJ 2991 Crane(計算幾何 線段樹)

2021-08-05 19:10:04 字數 1524 閱讀 1500

題目位址

題意:你有乙個挖掘機,他的臂由n根小臂組成,最初的時候挖掘機的臂是垂直向上的,然後有n次操作,每次操作告訴你把第a和第a+1根臂之間的角度旋轉為b(不是旋轉角度為b),每次操作之後把最後那個臂的座標輸出

思路:用線段樹去維護每個臂的向量,然後把第a和第a+1個臂之間的角度旋轉為b這個操作就是將a+1到n個臂旋轉b-rad[a]就好了,最後輸出sum[1].x和sum[1].y就是最後那個臂的向量座標

吐槽一下:為什麼poj要卡g++的時間,搞得tle,還有自己太久沒有用c了居然有個地方忘了加&,re了乙個下午(浪費了乙個下午)

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define n 10005

#define ll __int64

#define inf 0x3f3f3f3f

#define lson l,mid,ans<<1

#define rson mid+1,r,ans<<1|1

#define getmid (l+r)>>1

#define movel ans<<1

#define mover ans<<1|1

using

namespace

std;

const ll mod = 1e9 + 7;

const

double eps = 1e-8;

const

double pi = acos(-1.0);

struct node sum[n << 2];//線段樹主體

double rad[n];

void rotate(double &x, double &y, double r)

struct segment__tree

void pushdown(int ans)

}void build(int l, int r, int ans)

int mid = getmid;

build(lson);

build(rson);

pushup(ans);

}void updata(int l, int r, int ans, double nums)

pushdown(ans);

int mid = getmid;

if (midelse

if (mid >= y)

else

pushup(ans);

}};int main()

else flag = true;

tree.build(1, n, 1);

while (m--)

}return

0;}

POJ 2991 Crane(線段樹 計算幾何)

description 有一台起重機。我們把起重機看作由n條線段依次首尾相接而成。第i條線段的長度是li。最開始,所有的線段都筆直連線,指向上方。現有c條操縱起重機的指令。指令i給出兩個整數si和ai,效果是使線段si和si 1之間的角度變成ao度。其中角度指的是從線段si開始沿逆時針方向旋轉到si...

POJ 2991 Crane(區間更新 向量旋轉)

題目大意 n個向量首尾相連,每次操作使某個區間中的所有向量都旋轉同樣的角度。每次操作後都回答最後乙個向量的座標。題目分析 區間維護向量資訊。向量旋 x1 x0 cos t y0 sin t y1 x0 sin t y0 cos t 其中t為旋轉的角度。如下 include include inclu...

ACM Poj 2991 計算幾何 線段樹

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