CSP校內集訓 reverse(數字DP)

2022-03-16 23:58:09 字數 1227 閱讀 7962

給乙個範圍[l,r],求滿足\(l\leq n \leq r\) 且 \(l\leq rev(n) \leq r\)的\(n\)的個數,其中\(rev(n)\)表示將\(n\)翻轉\((123->321)\),多組詢問\((l,r\leq 2^64-1)\)

長這樣的計數問題,沒什麼懸念考慮數字dp

只設\(f_\)表示處理到第\(i\)位是否頂上界似乎不太夠,因為在轉移過程中還需要知道倒過來的數的狀態,所以再用個變數\(lim2\)記錄倒過來的數的狀況

因為從前向後確定數倒過來看是從後向前確定數,所以\(lim2\)有三個值:比當前上界小,頂上界,暫時大於上界,用\(0,1,2\)表示

僅僅這樣做並不能很好的處理字首0的情況(如0001倒過來看會變成1000,但實際上應該為1),所以我還用了乙個變數\(zer\)表示第乙個非零數出現的位置

狀態即為\(f_\),一遍數字dp即可求出答案,遞迴邊界返回值為1的條件為\(lim2 \neq 2\) 或 倒過來的限制r的位數比l多1

本題毒瘤,\(l,r\)會炸longlong,需要用unsigned longlong來做,隨時都需要注意爆邊界的情況qwq

考試的標程都是錯的幾個意思

#include#define min(x,y) ((x)<(y)?(x):(y))

#define max(x,y) ((x)>(y)?(x):(y))

using namespace std;

typedef unsigned long long ll;

int t,t1,t2,d;

ll l,r,wei[25];

ll dp[70][23][2][3];//第乙個不是0的位置

//0:沒碰到上界,1:頂上界,2:過上界

template void read(t &x)

int gw(ll x,int w)

int get_dep(ll x)

return ret;

}ll dfs(int stp,int zer,int lim1,int lim2,ll l,ll r)//正數第stp位,第乙個非零位置,頂上界,逆向

} else }

return dp[stp][zer][lim1][lim2]=ret;

}ll solve(ll l,ll r)//翻轉前<=l,翻轉後<=r

int main()

return 0;

}

CSP校內集訓 打撲克

有 n 堆大小為1的撲克,支援合併兩堆撲克和查詢有多少對撲克堆滿足 size i size j leq c c 不確定 暴力做法 開桶記錄當前存在有多少個大小為 i 的堆,查詢可用樹狀陣列或者雙指標,時間複雜度 o m 2logn 或者 o m 2 優化 發現列舉大小的桶有很多是空的,實際上,可以證...

CSP校內集訓 kat(期望DP)

一本有n道題的練習冊,katarina大佬每天都會做k道題。第一天做第1k題,第二天做第2k 1題 第n k 1天做第n k 1 n道題。每道題有它的難度值,假設今天katarina大佬做的題目中最大難度為t,那麼今天katarina大佬的勞累度就是 w t 做完這本書的勞累值就是每天的勞累值之和。...

CSP校內集訓 替換遊戲(tarjan 離散化)

給乙個範圍 0,n 有兩種變換方式,k 或者給定的 m 個 x y 但必須保證變換前後的數始終在範圍內,給乙個數 x 求出它一直變換下去 注意不能得到了乙個數之後返回上一步 可以得到的所有數的和的最大值 n leq 10 8 m leq 10 5 k leq n 多組詢問 對兩種方式建邊,顯然乙個強...