塞克斯斯是六兄弟中的老六,他喜歡老大福斯特,他希望福斯特
高興。所以他要幫福斯特寫作業。作業如下:
給 n 個正方形,正方形有兩種:
a 型:平行於座標軸,中心位於(x,y),邊長為偶數 a;
b 型:和座標軸成 45 度夾角,中心位於(x,y),對角線長為偶數 d。
求這些正方形覆蓋的面積總大小。
第一行乙個整數 n。
接下來 n 行每行描述乙個正方形,共有乙個字元和三個整數。如
果字元為 a 表示是 a 型正方形,接下來輸入 x,y 和 a。如果字元為 b
表示是 b 型正方形,接下來輸入 x,y 和 d。
一行乙個實數表示答案,保留 2 位小數。
資料保證|x|,|y|,a,d≤1000,且 a 和 d 一定為正偶數。
資料分為三個子任務。
子任務一:20 分,保證 n≤1000。
子任務二:30 分,保證 n≤200000,只有 a 型正方形。
子任務三:50 分,保證 n≤200000。
因為座標範圍很小,所以就想能不能列舉格仔統計面積
我們用點的座標包括上它右上角的格仔
對於a型矩形(正放的矩形),字首和維護每個格仔上被多少個矩形覆蓋。所以對於每個矩形,在矩形的左下角的格仔權值加一,矩形的左上角的上面乙個格仔和矩形的右下角的右邊乙個格仔的權值各減一,矩形的右上角的右上角格仔的權值加一。最後兩個迴圈以字首和的方式掃瞄過去,每個格仔上的權值就是它被多少個矩形覆蓋
對於b型矩形(斜放的矩形),一樣用字首和,只不過用另乙個陣列記錄。並且我們把座標系也斜過去,把斜過去之後的一單位長度定位原座標系的\(\sqrt2\)長度,那麼我們就發現原座標系裡的\((x,y)\)在新座標系裡的座標是\((x+y,x-y)\)(根據點到直線的距離公式直接求)。
最後統一掃瞄的時候,先掃瞄b的字首和,再在掃瞄a的字首和的時候統計答案。我們把每個格仔拆成四個三角形。如果這個格仔在a的字首和中已經被覆蓋過了,那麼\(ans\)直接加4。否則找它斜過去後對應的b的字首和中的四個格仔,有多少格仔被覆蓋,那麼\(ans\)加多少值
最後\(ans\)除4
(注意,因為b的座標系的單位長度小,所以它的整個大小是a的座標系的兩倍)
#include#define ll long long
const int abs=1500+10,maxn=abs<<1;
int s1[maxn][maxn],s2[maxn<<1][maxn<<1],n;
double ans;
templateinline void read(t &x)
templateinline void write(t x,char c='\0')
templateinline void chkmin(t &x,t y)
templateinline t min(t x,t y)
int main()
if(opt=='b')
}for(register int i=1;i
for(register int j=1;j
for(register int i=1;i
for(register int j=1;j
int nx=i+j,ny=i-j+maxn;
if(s2[nx][ny])ans++;
if(s2[nx+1][ny])ans++;
if(s2[nx][ny-1])ans++;
if(s2[nx+1][ny-1])ans++;
} ans/=4.0;
printf("%.2f\n",ans);
return 0;
}
模考3 笨笨連線遊戲
一天,媽媽在黑板上畫了乙個大大的圓,然後又在圓弧上標上1,2 3,2n 個數。然後讓笨笨任意選取一對數 兩個不同的數 上連一條直線。然後再任意選取一對數,再邊一條直線,但這條直線不能和任何別的直線相交。每個數都要恰好與另乙個數連一條直線。笨笨費了好大的勁才找出一種連線方案。媽媽在旁邊問笨笨 給出n ...
2018程設模考2
a 分別記錄紙幣剩餘數量判斷是否能找零,因為資料比較弱所以對於5 5 5的情況沒考慮也過了。includeusing namespace std int main else else else if flag printf true return 0 b 因為一次只能搬一塊或者兩塊磚頭,所以對於n塊...
gmat模考 GMAT備考如何進行模考練習
準備gmat考試的考生,大多會在備考中進行幾次模考練習。模考練習也的確給人回報高和真實度高的印象。老師喜歡模考,因為模考能幫助他們更好的了解學生的學習情況 學生參加模考,是因為模考能讓他們更清晰的認識到自己的優勢和不足。但如何正確使用模考材料,避免低效率浪費寶貴的學習資源和備考時間,讓每次模考都發揮...