(題面來自acwing)
城市的規劃在城市建設中是個大問題。
不幸的是,很多城市在開始建設的時候並沒有很好的規劃,城市規模擴大之後規劃不合理的問題就開始顯現。
而這座名為 fractal 的城市設想了這樣的乙個規劃方案,如下圖所示:
當城區規模擴大之後,fractal 的解決方案是把和原來城區結構一樣的區域按照圖中的方式建設在城市周圍,提公升城市的等級。
對於任意等級的城市,我們把正方形街區從左上角開始按照道路標號。
雖然這個方案很爛,fractal 規劃部門的人員還是想知道,如果城市發展到了等級 n,編號為 a 和 b 的兩個街區的直線距離是多少。
街區的距離指的是街區的中心點之間的距離,每個街區都是邊長為 10 公尺的正方形。
輸入格式
第一行輸入正整數n
'>n
,表示測試資料的數目。
以下n'>n
行,輸入n組測試資料,每組一行。
每組資料報括三個整數 nn,a
,b'>,a,b
, 表示城市等級以及兩個街區的編號,整數之間用空格隔開。
輸出格式
一共輸出n
'>n
行資料,每行對應一組測試資料的輸出結果,結果四捨五入到整數。
資料範圍1≤
n≤31'>1≤n≤31,1
≤a,b
≤22n
'>1≤a,b≤22n,1
≤n≤1000
'>1≤n≤1000
分形指的是一種無限包含更小尺度下的自身的幾何結構。當然,題中的城市是有最小尺寸邊界的,即n = 0時。
該題的難點是在這樣的圖中根據房屋編號找到它的座標位置。我們發現,城市擴建只是扭轉了左上、左下第n-1級城市的方向,城市本身的結構沒有變化,而每個房屋旋轉後的座標是有規律的。因此,我們想要確定房屋a在第n級城市中的位置,只需要先確定出它在哪個次級的n-1級城市裡,求出它在這個子城市中的座標,然後分情況討論這個子城市中的房屋在構成現在城市時發生的座標變化即可。邊界:n = 0時,座標為(0, 0)。總時間複雜度為o(n * n)。確定子城市可以用編號除以子城市大小size(2的(2n-2)次方),確定a在子城市中的編號則可以用編號對size取模得到。為了這一步運算方便,我們把房屋改為從0到n-1編號。具體的座標變化規律見**。
在計算距離的時候遇到了鍋,所以想強調一下資料範圍。int的最大值是2^31 - 1,剛好夠記錄城市直徑(從0行開始),但是平方級別的編號會炸。所以在記錄城市尺寸、房屋編號的時候要記得開long long。
**:#include
#include
#include
#include
#include
#define fst first
#define sec second
#define mp make_pair
typedef long long ll;
using namespace std;
int n, t;
ll a, b;
pairsolve(int n, ll pos)
} double calc(paira, pairb)
int main()
return 0;
}
AcWing 98 分形之城
原題鏈結 考察 分治 令人嘔吐的分治 思路 直觀思路是找到a,b的直角座標,然後求距離和.這裡的分治是遞迴到最底層,然後根據等級i到等級i 1的座標變化,算出直角座標.可以發現將圖分為4個模組時,每個等級的變換規則相同.include include include using namespace ...
遞推與遞迴 分形之城
城市的規劃在城市建設中是個大問題。不幸的是,很多城市在開始建設的時候並沒有很好的規劃,城市規模擴大之後規劃不合理的問題就開始顯現。而這座名為 fractal 的城市設想了這樣的乙個規劃方案,如下圖所示 當城區規模擴大之後,fractal 的解決方案是把和原來城區結構一樣的區域按照圖中的方式建設在城市...
演算法競賽高階指南 分形之城
題目鏈結 把左上角的座標看做 0 0 右上角的座標為 0,2 n 1 左下角的座標為 2 n 1,0 右下角座標為 2 n 1,2 n 1 街區的標號也從 0 開始。現在對於給定的兩個距離,我們要分別求出他們的座標。現在給出等級為 2 距離為 10 如何求座標呢?等級為 1 的城市中有 4 座街區,...