演算法競賽高階指南 分形之城

2022-06-27 17:57:15 字數 1815 閱讀 1107

題目鏈結

把左上角的座標看做 \((0 , 0)\),右上角的座標為 \((0,2^n-1)\),左下角的座標為 \((2^n-1,0)\),右下角座標為 \((2^n-1,2^n-1)\)。

街區的標號也從 \(0\) 開始。

現在對於給定的兩個距離,我們要分別求出他們的座標。

現在給出等級為 \(2\),距離為 \(10\),如何求座標呢?

等級為 \(1\) 的城市中有 \(4\) 座街區,通過 \(10/4 = 2\),可以知道這個街區在 等級為 \(2\) 的右下角,即圖中 \(4\) 部分。

這時如果可以求出它在 \(4\) 中的座標,橫縱座標都加上 \(2\),就得到了它在等級為 \(2\) 的城市中的座標。

求其在 \(4\) 中的座標可以轉化為求在等級 \(1\) 中,距離為 \(10\%4\) 的座標(因為 \(4\) 部分是直接複製的等級為 \(1\) 的城市)

這樣問題就可以遞迴解決。

定義函式 \(cal(n,m) 表示求在 n 級城市中,距離起點距離為 m 的座標\)

求 \(cal(n,m)\) 時,\(n-1\) 級城市有 \(2^\) 座街區,先遞迴求解 \(cal(n-1,m mod\ 2^)\)

注意這時還要進行座標變換:\(4\)部分沒有進行是因為它是直接從 \(n-1\) 級城市複製得到的。

假如在 \(1\) 部分,通過觀察可以知道,\(1\) 部分是 \(n-1\) 級城市 順時針旋轉,然後水平翻轉得到的。

如果在 \(2\) 部分,也不需要變換

如果在 \(3\) 部分,先逆時針旋轉90度,然後水平翻轉。

如果在 \(4\) 部分,不需要變換。

這時已經得到該點在 \(n-1\) 級城市中的座標。

那麼針對這 \(4\) 部分的點,橫縱座標加上不同的值即可。

\(1\) 部分不需要加

\(2\) 部分縱座標加上 \(n-1\) 級城市的邊長

\(3\) 部分橫座標加上 \(n-1\) 級城市的邊長

\(4\) 部分橫縱座標均加上 \(n-1\) 級城市的邊長

#include #define pb push_back

using namespace std;

typedef long long ll;

typedef unsigned long long ull;

const int mod = 1e9 + 7;

const double eps = 1e-6;

const int inf = 0x3f3f3f3f;

const int n = 2e5 + 10;

paircal(ll n, ll now)

; ll len = 1ll << (n - 1), cnt = 1ll << (2 * n - 2);

pairpre = cal(n - 1, now % cnt);

ll x = pre.first, y = pre.second;

int tmp = now / cnt;

if (tmp == 0) ;

} else if (tmp == 1) ;

} else if (tmp == 2) ;

} else ;

}}int main()

return 0;

}

《演算法競賽高階指南》 防曬

有c頭奶牛進行日光浴,第i頭奶牛需要minspf i 到maxspf i 單位強度之間的陽光。每頭奶牛在日光浴前必須塗防曬霜,防曬霜有l種,塗上第i種之後,身體接收到的陽光強度就會穩定為spf i 第i種防曬霜有cover i 瓶。求最多可以滿足多少頭奶牛進行日光浴。輸入格式 第一行輸入整數c和l。...

《演算法競賽高階指南》蚯蚓

蛐蛐國最近蚯蚓成災了!隔壁跳蚤國的跳蚤也拿蚯蚓們沒辦法,蛐蛐國王只好去請神刀手來幫他們消滅蚯蚓。蛐蛐國裡現在共有 n 只蚯蚓,第 i 只蚯蚓的長度為 ai 所有蚯蚓的長度都是非負整數,即可能存在長度為0的蚯蚓。每一秒,神刀手會在所有的蚯蚓中,準確地找到最長的那乙隻,將其切成兩段。若有多隻最長的,則任...

演算法競賽高階指南筆記

原碼 原碼就是符號位加上真值的絕對值,即用第一位表示符號,其餘位表示值.比如如果是8位二進位制 其中,第一位為1是負數 1 0000 0001 原 1 1000 0001 原 因此,8位二進位制數的取值範圍 127,127 補碼正數的補碼是其本身 負數的補碼是在其原碼的基礎上,符號位不變,其餘各位取...