2020牛客寒假演算法基礎集訓營5 F題

2021-10-02 20:02:22 字數 1523 閱讀 9711

hello~偶又來啦,為啥要乙個題乙個題的發呢,是因為每個題目的題型不一樣呀,我要把他們分類,於是我就一篇一篇的發啦

這是一道dp題(我好像首次寫dp的部落格欸=-=不行,我要再接再厲ovo)

傳送門

題目的大概意思就是後台judge機制,有效的提交是這麼說=-=有ac,還有wa啦啥啥啥的,首先給你乙個數x,這個數是你提交wa之後隊友喊的次數,然後ac後你的隊友也會喊。然後給乙個數q,有q次查詢,接下來q行每行包括兩個數, l 和 r 代表乙個區間(閉區間)代表你隊友喊得次數,問這個閉區間中你隊友有多少種喊的可能。=-=(看到這裡就是乙個字首和問題,準備好了)

這個題目還有乙個前提條件:如果你的隊伍已經wa過一次了,那麼下一次絕對是ac。(心裡默默碼文:這只隊伍還挺牛=-=)

dp題最需要明白的是自己設定dp陣列的含義是什麼,初始化啊,轉移方程啊之類的。

我們考慮第i個題的狀態,有兩種狀態,一種是ac,一種是wa。奠定了我們dp是二維。假設dp[i][0]是指由dp[i - 1][0]ac過來的方案數,dp[i][1]是指由i - x時wa過來的方案數,因為到了i是wa過來的,所以i - x一定是ac狀態。好啦,我們的轉移方程出來啦~

dp[i][0] = dp[i - 1][0] + dp[i - 1][1]

dp[i][1] = dp[i - x][0]

然後初始化呢就是~

dp[0][0] = 1(假定從零開始ac的狀態是1)

dp[0][1] = 0(不可能還沒開始就wa了把=-=,所以是0)

然後我們考慮到有多次查詢,不如預處理一下,然後求的是區間和問題,用字首和來處理一下,方便起見,我們直接把dp[i][2]當作字首和把=-=

然後初始話dp[i][2] = 1,一種情況(因為要跟上面的假定匹配嘛~)

然後最後查詢一次就輸出一次,輸出區間和就是dp[r][2] - dp[l - 1][2]就是我們的答案啦。

然後題目要求對mod求餘,我們求字首和的時候求餘一下,然後計算結果的時候也需要求餘,(dp[r][2] - dp[l - 1][2]) % mod,這個地方可能為負數,然後再做一次操作就是:((dp[r][2] - dp[l - 1][2]) % mod + mod)% mod

這樣啦~

又到上**環節啦~

#include

using

namespace std;

typedef

long

long ll;

const

int n =

1e5+10;

const

int mod =

1e9+7;

ll dp[n][3

];int x;

int q;

int l, r;

intmain()

} dp[0]

[2]=

1;for(

int i =

1; i < n; i++

)while

(q--

)return0;

}

嘻嘻~

2020牛客寒假演算法基礎集訓營

長期更新,補完為止 2 g 判正誤 題意 t組資料。判斷a d b e c f是否等於g。1e9 a,b,c,g 1e9,0 d,e,f 1e9。保證不會出現指數和底數同為 0 的情況。思路 硬算會tle或mle。快速冪取模,為了增加過題概率,多取幾個模數判斷。includeusing namesp...

2020牛客寒假演算法基礎集訓營1

找規律,推公式 三角形個數為2 m n m n m 1 n 1 2 m n mn m 1 n 1 2 m n mn m 1 n 1 include include include include using namespace std typedef long long ll const int m...

2020牛客寒假演算法基礎集訓營1

h題 突然發現h題可以用好多種方法做的。方法一 雙指標,維護乙個修改次數小於等於k的區間 include using namespace std typedef long long ll const int mod 1e9 7 const int n 1e5 5 const int inf 0x3f...