給乙個範圍[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 多組詢問 對兩種方式建邊,顯然乙個強...