SCOI 2019 D1T1 跳躍遊戲

2021-09-28 23:21:52 字數 2111 閱讀 5311

傳送門

有 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直接判斷也可以但這裡提供乙個更簡單的方法 將指令儲存在陣列中 題目給的...