牛客網提高五練習

2022-04-29 06:45:07 字數 2994 閱讀 9349

吉老師的題,出的很有水平(應該是t1,t2難度)

給出 \(l1, l2, r1, r2, m\) 詢問 \(\displaystyle \sum_^ \sum_^ [m | i \oplus j]\)

對於前 \(30\) 分,我們可以簡單列舉

對於第二個點,我們已知乙個數

顯然對於 \(10 ^ \) 的資料範圍,我們只能考慮 \(o(1)\) 或者 \(o(logn)\) 的演算法

由於如果需要列舉 \([l, r]\) 中的數,時間複雜度將會乘上 \(o(n)\),我們需要考慮直接進行計算

因為確定了 \(x\) ,不同 \(y\) 的值與 \(x\) 異或的值一定不一樣,並且一定是緊密排布的

因此我們可以直接計算出這些數的開頭以及結尾,還有 \(m\) 的倍數的個數

對於所有資料

我們考慮將這個問題轉換為字首問題

記 \(f(x, y)\) 為 \(\displaystyle \sum_^ \sum_^ [m | i \oplus j]\)

那麼我們可以將原問題轉換為 \(f(r1, r2) - f(l1, r2) - f(r1, l2) + f(l1, l2)\)

\(f(x, y)\) 可以通過二進位制分解後選取一部分做上一種情況來求解

#include #include using namespace std;

#define qword long long

qword l1, l2, r1, r2, p, ans = 0;

#define m 998244353ll

qword solve(qword l, qword r, qword p)

qword solve(qword a, qword b)

return res;

}int main()

} else ans = solve(++r1, ++r2) - solve(l1, r2) - solve(r1, l2) + solve(l1, l2);

cout << (ans + m) % m << endl;

}

每條邊至少走一次,從 \(1\) 出發回到 \(1\)

應為這是乙個閉合迴路,如果我們將重複走的邊進行拆分,那這張圖就是個尤拉迴路

因此,我們要保證每個點的度都是偶數

考慮新增哪些邊使得每個點的度是偶數

由於每加一條邊,只會改變兩個點的度,並且這個度是可以傳遞的 最短路 + dp? 時間暴了

發現由於邊權全部是 \(2\) 的冪次,並且冪次高的一定比所有冪次小的的和大,所以我們只要選取了高冪次的,我們就可以通過選取低冪次來降低總的 \(ans\)

由此,我們可以發現我們最終選取的值全部都在這個圖的mst

那麼原問題將轉變成選取那些邊,可以使得這棵樹上所有的點的權值全是偶數

簡單dfs即可

注意取模

#include #include using namespace std;

#define qword long long

const int maxn = 5e5 + 10;

int n, m, u[maxn], v[maxn], w[maxn], fa[maxn], d[maxn], ver[maxn << 1], head[maxn << 1], next[maxn << 1];

long long mi[maxn], tot = 0, ans = 0, edge[maxn << 1];

bool vis[maxn];

#define ch ch = getchar()

const int q = 998244353;

template inline void read(t &x)

int find(int x)

inline void addedge(int x, int y, int z)

int dfs(int x)

if (d[x] & 1) return 1;

else return 0;

}int main()

for (int i = 1; i <= m; ++ i)

dfs(1);

cout << ans << endl;

}

如題所述

\(t\) 是從 \(s\) 中刪除一些字元得到的,\(t\) 一共有 \(\binom\) 種

考慮逆過程,我們在 \(t\) 上面插入 \(a-c\) 個 \(0\),\(b-d\) 個 \(1\) 來得到 \(s\)

但是直接插入會計算重複,比如 \(t\) 是 \(000\),插入乙個 \(0\) 有 \(4\) 種位置,但是得 到的都是相同的結果

為了避免計算重複,我們限制所有統計的插入方案,必須對應著 \(t\) 在 \(s\) 中最 靠前的一次出現,比如在上面的例子中,我們只統計 \(0\) 插入到最末尾的情況。

顯然在這樣的要求下, \(0\) 只能插入到 \(1\) 前面或者末尾,\(1\) 只能插入到 \(0\) 前面或者末尾。因此在一共 \(c+d+1\) 個間隔中,除了末尾以外,其他間隔都只能插入一種數字

可以列舉末尾有幾個 \(0\) 幾個 \(1\),然後用插板法統計方案

#include #define qword long long

const int p = 1e9 + 7;

const int maxn = 2010;

int ans, c[maxn << 1][maxn], a, b, c, d;

int main()

if(!c || !d)

for (int i = 0; i <= a - c; ++ i)

for (int j = 0; j <= b - d; ++ j)

printf("%d", ans);

}

牛客網練習30

眾所周知,小k是nowcoder的 苟管理,所以小k很擅長踢樹,雖然本題與踢樹無關 小k喜歡將日期排列成yyyy mm dd的形式 位數不足添零補齊 的形式,雖然這與小k只會做回文字串這道水題無關,但小k覺得日期組成的回文串也是挺可愛的。作為乙個涼心出題人,小k決定給你乙個可愛的問題 給你兩個日期,...

牛客網程式設計 五

在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。publicboolean duplicate int number...

牛客網專項練習(七)

1 以下哪個資料結構不是多型資料型別 正確答案 d 棧廣義表有向圖字串分析 多型就是資料元素的型別不確定,字串的每個元素始終都是字元 char 而不會是別的型別。比如棧可以是整數棧 字元棧 物件棧等等。但是字串,它的元素必然是字元。2 以下資料結構中,是非線性資料結構 正確答案 a 你的答案 a 正...