題意:給你乙個3個數a, b, c問有多少對pair(i, j),1 <= i <= a, 1 <= j <= b, i and j > c或 i xor j < c。a, b, c範圍為1e9.
思路:場上一看以為是推式子加什麼篩做,無果。之後才知道是數字dp(以下思路來自學長的**orz)。首先,我們可以把問題轉化為求i and j < c並且 i xor j > c的數對個數,用總數(a* b)減去這個數。我們在dp過程中設定幾個變數:ok1, 之前已經填的i 和 j的位是否已經滿足i and j < c, ok2同理。lim1表示i是否可以隨便填,lim2同理。zero1表示上面填的位是否全是0,zero2同理。dp的時候,記憶化搜尋就行。dp過程很直觀就不解釋了。(寫了那麼多數字dp賽場上想不到,太菜了qaq)
**:
#include #define ll long longusing namespace std;
const int maxn = 55;
int a[maxn], b[maxn], c[maxn];
ll dp[maxn][2][2][2][2][2][2];
ll dfs(int dep, bool ok1, bool ok2, bool lim1, bool lim2, bool zero1, bool zero2)
if(dp[dep][ok1][ok2][lim1][lim2][zero1][zero2] != -1)
int mx1, mx2;
if(lim1) mx1 = a[dep];
else mx1 = 1;
if(lim2) mx2 = b[dep];
else mx2 = 1;
ll ans = 0;
for (int i = 0; i <= mx1; i++)
} dp[dep][ok1][ok2][lim1][lim2][zero1][zero2] = ans;
return ans;
}ll solve(ll a, ll b, ll c)
return res - dfs(35, 0, 0, 1, 1, 1, 1);
}int main()
}
2019牛客多校第七場
給定乙個01串,求最少的劃分次數,使得每部分的01串都是迴圈字典序最小。從最長的整個串貪心,暴力判斷是否是迴圈字典序最小,若是,直接輸出前面的串,然後後面的串再進行新一輪判斷。include using namespace std const int n 205 int t string s vec...
H pair 2019牛客多校第七場
傳送門 這題一直忘了補。今天沒比賽剛好補了 比賽的時候看見以為是撒高階數論計數題,然而怎麼過了這麼多人,最後沒想到是數字dp。我們知道對於位運算來說,當高位 c 或者 高位 所以從高位開始數字dp dp pos dc xc sta stb az bz 表示從最高位到pos 1位所有列舉的情況 的 值...
牛客多校第七場E Find the median
題意 每次在乙個空區間內加入 l,r 區間內所有的數,然後問每次加入後的中位數是什麼。題解 一道線段樹的題目。a 線段樹的葉子節點維護了乙個區間,這個區間是 l,r 1 為什麼是這區間?因為這樣能不重不漏的包含所有的區間,每次查詢的時候也不會漏掉,自己畫一顆線段樹基本能明白了 b 然後查詢的時候,記...