傳送門
有 mm
m 個小球,n
nn 個島。其中第乙個、最後乙個島以及中間的第 k
kk 個島 (
1<
k (1< k< n) (1< k是固定的,其餘島是懸浮的。一開始所有小球都在第乙個島,你的目標是把他們都移動到最後乙個島,並且使用的步數盡量小。 每回合你可以移動乙個小球到它左邊或者右邊的那個平台,但是有一些限制: 移動的小球必須是移動前它所在的平台上編號最小的; 移動的小球必須是移動後它所在的平台上編號最小的; 如果乙個小球移動到了乙個浮動平台上,那下一回合必須將這個小球移走,否則它就會掉下去。 有 qq q 個詢問,每次給出乙個時刻,你需要回答在最優方案中,這個時刻正在跳躍的是哪個小紅球。 保證詢問給出的時刻小於等於最優方案數,且保證答案小於等於 30 3030 。資料範圍:n≤1 08 n≤10^8 n≤108,m ≤1000 m≤1000 m≤1000 ,q ≤5000 q≤5000 q≤5000 。這應該就是漢諾塔問題的變種。 如果有 i ii 個點,那麼最優方案為 fi= 3fi− 1+(n −1 )f_i=3f_+(n-1) fi=3f i−1 +(n− 1)。而 m ≤1000 m\le 1000 m≤1000 ,貌似直接高精是不行的。 考慮打個表找規律(或者自己手推),如下:(n-
1) 個 1
(k-1
) 個 2
(n-1
) 個 1
(n-k) 個 2
(n-1
) 個 1
(k-1
) 個 3
(n-1
) 個 1
(n-k) 個 2
(n-1
) 個 1
(k-1
) 個 2
(n-1
) 個 1
(n-k) 個 3..
.如果再打多點,會發現:
由於 2×3
302\times 3^
2×33
0 大約是 1014
10^10
14左右,是在 long long 範圍的,可以預處理一下。
然後就可以用高精做了,時間複雜度 o(q
×len
×30
)o(q\times len\times 30)
o(q×le
n×30
)。
#include
#define ll long long
using
namespace std;
int n,m,k,q;
struct bignum
friend bignum operator+(
const bignum &a,
const bignum &b)
if(c.num[c.n+1]
) c.n++
;return c;
}friend bignum operator/(
const bignum &a,ll b)
while
(c.n&&
!c.num[c.n]
) c.n--
;return c;
}friend ll operator%(
const bignum &a,ll b)
return ans;
}void
read()
}one,p;
ll mod,f[35]
;void
init()
void
adjust()
intmain()
}return0;
}
十二省聯考2019 D1T1異或粽子
嘟嘟嘟 做這題之前,強烈推薦先把這道題切了p1631序列合併。這兩道題思路基本一模一樣。首先把異或處理成字首異或,然後維護乙個大根堆,每一次取出堆頂加到答案裡面,然後把堆頂所在元素的次大的異或值放進堆裡。這樣迴圈 k 次,就是答案。關鍵在於對於數 sum i 怎麼找異或第幾大。眾人皆知是建01tri...
CSP S2019 D1T3 樹上的數
給定乙個大小為 n nn 的樹,它共有 n nn 個結點與 n 1 n 1 n 1 條邊,結點從 1 n 1 sim n 1 n 編號。初始時每個結點上都有乙個 1 n 1 sim n 1 n 的數字,且每個 1 n 1 sim n 1 n 的數字都只在恰好乙個結點上出現。接下來你需要進行恰好 n ...
NOIP2016 D1T1 玩具謎題
洛谷p1563 看完了noip2017覺得noip2016是真的簡單 2017第一題就卡住2016第一題10分鐘ac m 100000很明顯暴力模擬就可以 唯一有一點點難度的地方就是小人的朝向對位置的影響 寫個函式用if else直接判斷也可以但這裡提供乙個更簡單的方法 將指令儲存在陣列中 題目給的...