NYOJ 298 相變點(矩陣高速功率)

2021-09-07 01:22:29 字數 1600 閱讀 5769

時間限制:

2000 ms  |  記憶體限制:

65535 kb

難度:5

描寫敘述

平面上有不超過10000個點。座標都是已知的。如今可能對全部的點做下面幾種操作:

平移一定距離(m),相對x軸上下翻轉(x),相對y軸左右翻轉(y),座標縮小或放大一定的倍數(s),全部點對座標原點逆時針旋轉一定角度(r)。    

操作的次數不超過1000000次,求終於全部點的座標。

輸入

僅僅有一組測試資料

測試資料的第一行是兩個整數n,m,分別表示點的個數與操作的個數(n<=10000,m<=1000000)

隨後的一行有n對數對,每乙個數對的第乙個數表示乙個點的x座標,第二個數表示y座標。這些點初始座標大小絕對值不超過100。

隨後的m行,每行代表一種操作,行首是乙個字元:

首字元假設是m,則表示平移操作。該行後面將跟兩個數x,y。表示把全部點按向量(x,y)平移;

首字元假設是x。則表示把全部點相對於x軸進行上下翻轉;

首字元假設是y,則表示把全部點相對於y軸進行左右翻轉;

首字元假設是s。則隨後將跟乙個數p,表示座標放大p倍;

首字元假設是r,則隨後將跟乙個數a,表示全部點相對座標原點逆時針旋轉一定的角度a(單位是度)

輸出每行輸出兩個數。表示乙個點的座標(對結果四捨五入到小數點後1位,輸出一位小數字)

點的輸出順序應與輸入順序保持一致

例子輸入

2 5

1.0 2.0 2.0 3.0xy

m 2.0 3.0

s 2.0

r 180

例子輸出

-2.0 -2.0

0.0 0.0

分析:假設依照題目描寫敘述的那樣模擬。肯定會超時。這時就要找一種高速變換的方法。

這樣就能夠先算出經過m次變換後形成的終於矩形,然後用點的座標乘以矩形就能夠求出答案。

#include #include #include #define pi acos(-1.0)

struct matrix

matrix multi(matrix a, matrix b) }}

return res;

}matrix translation(matrix a, double p, double q)

matrix scale(matrix a, double p)

matrix turn_ud(matrix a)

matrix turn_lr(matrix a)

matrix rotate(matrix a, double angle)

};struct point p[10005];

int main()

else if(op[0] == 's')

else if(op[0] == 'r')

}for(int i = 0; i < n; i++)

return 0;

}

NYOJ 298 點的變換 矩陣乘法

最好還是自己手推一下矩陣式子.不算太難.但是有一些小知識 首先當然是矩陣的細節.矩陣是不支援交換率的.所以如圖的式子乘進去時要放在左邊.還有的比如說 cmath裡的sin函式用的是弧度制.需要把度數 180 m pi m pi是cmath裡定義的常數 double在取固定小數字的時候小負數四捨五入會...

座標字元NYOJ 298 點的變換 矩陣快速冪

在寫這篇文章之前,已經寫過了幾篇關於改座標字元主題的文章,想要了解的朋友可以去翻一下之前的文章 時光制約 2000 ms 記憶體制約 65535 kb 難度 5 每日一道理 聰明人學習,像搏擊長空的雄鷹,仰視一望無際的大地 愚笨的人學習,漫無目的,猶如亂飛亂撞的無頭飛蛾 刻苦的人學習,像彎彎的河流,...

矩陣十題1(nyoj298)

繼續深造矩陣類題目,看到大佬們都有矩陣十題部落格,我也學習了,只有題目,沒有解析系列1 通過矩陣變換將所有操作都存到矩陣中,最後輸出答案即可。矩陣的構造方法 直接上 include include include include include include include include a 3...