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...