poj 2991 線段樹 成段更新 向量旋轉

2021-07-25 03:54:17 字數 1401 閱讀 3496

輸入資料:

n條線段,c條指令

n條線段的長度li(最初的線段都是在y軸上的)

c條的指令是s,a,表示第s條線段和第s+1條線段的夾角調整為a度

每執行完一條命令輸出最後一條線段末尾的座標

注意:輸出的時候,c++

中用%lf

,g++中用%f。

keep[maxn]儲存第i條邊與i-1邊的夾角(初始化為180°)

每次線段要旋轉的角度由a-keep[s]得到(記得更新keep[s]=a)

向量公式

t= a-keep[s];//t的正負不影響結果

x1=x0*cos(t*pi/180) - y0*sin(t*pi/180);

y1=y0*cos(t*pi/180) + x0*sin(t*pi/180);      

#include #include #include #include #include #include using namespace std;

const int maxn = 10010;

const double pi = acos(-1.0);//求出π的值

struct node

tree[maxn*4];

int n,c;

int len[maxn];

int keep[maxn];

void turn(int p,int t)

void create(int p,int l,int r)

intmid = (l+r)>>1;

create(p<<1,l,mid);

create(p<<1|1,mid+1,r);

tree[p].x= 0;

tree[p].y= tree[p<<1].y + tree[p<<1|1].y;

tree[p].angle= 0;

}void pushdown(int p)}

void update(int p, int l, int r, int turna)

pushdown(p);

intmid = (tree[p].l+tree[p].r)>>1;

if(r<= mid)

update(p<<1,l,r,turna);

elseif(l > mid)

update(p<<1|1,l,r,turna);

else

tree[p].x= tree[p<<1].x + tree[p<<1|1].x;

tree[p].y= tree[p<<1].y + tree[p<<1|1].y;}

int main()

create(1,1,n);

for(inti = 0; i < c; i++)

}return0;

}

POJ 2991 線段樹區間更新

每個葉子節點儲存每個線段的向量。那麼答案就是線段樹區間和。每次操作就是對向量進行旋轉,線段樹的區間更新加上向量旋轉公式搞定。設有向量 x0,y0 逆時針旋轉a度後的向量為 x1,y1 有 x1 x0 cos a y0 sin a y1 x0 sin a y0 cos a include includ...

POJ 3468 線段樹成段更新

題意就是給了一串行的數.然後不斷的問一段的值或者在一段上每個數加乙個數.輸出每次詢問的值.初看這題感覺就是最一般的線段樹成段更新的應用.但下手後發現很多細節.對於一向很粗心的我調了很久才給調出來.成段更新前一文已經提到過.這裡再通過這一題補充一些很值得注意的地方 1 前乙個題因為只有最後才要輸出一段...

poj 3467 線段樹成段更新

題意 略 分析 可設一另設兩個域sum 和d分別表示該區間的當前和與該區間的每個元素的增量,之後維護線段樹即可!再次感慨 能力 include using namespace std int64 sum1 int a 100005 struct node tree 1000000 void crea...