2019紀中集訓Day20 解題報告

2022-05-07 01:00:11 字數 4425 閱讀 6450

題目鏈結

給定整數 \(n \ (n \leq 2 \times 10 ^ 5)\) 和 \(x \ (x \leq 10 ^ 9)\),以及乙個長度為 \(n\) 的序列 \(a \ (a_i \leq 10 ^ 9)\);

你可以選擇乙個區間 \([l,r]\),然後令 \(a_i = a_i + d \ (i \in [l,r] \bigcap \z)\),其中 \(d\) 滿足 \(|d|<=x\);

要求最大化 \(a\) 的最長上公升子串行的長度,並輸出該值。

有乙個比較明顯的性質:

給 \([l, r]\) 加 \(d\) 不比 給 \([l, n]\) 加 \(d\) 優;

給 \([l, r]\) 減 \(d\) 不比 給 \([1, r]\) 加 \(d\) 優。

而且給乙個字首減 \(d\) 和給乙個字尾加 \(d\) 本質是一樣的。

預處理前字尾的 \(lis\),從左至右列舉字尾的起點,用權值線段樹維護字首 \(lis\) 長度最大值即可。

由於權值過大,離散化後樹狀陣列常數會小一點,但是我懶線段樹也很優秀。

時間複雜度 \(o(n \log_2 n + n \log_2 a_i)\)。

#include #include #include int in() 

templateinline void chk_min(t &_, t __)

templateinline void chk_max(t &_, t __)

inline int max(int _, int __)

const int n = 2e5 + 5, m = 2e9;

int n, x, a[n], res;

int f[n], len;

int pre[n], suf[n];

struct segment_tree

inline int new_node()

void modify(int pos, int k, int tl, int tr, int &p)

int query_max(int l, int r, int tl, int tr, int &p)

} t;

void work() else

pre[i] = p;

}res = pre[n];

t.modify(a[n], 1, -m, m, t.rt);

len = suf[n] = 1, f[n] = a[n];

for (int i = n - 1, p; i; --i) else

suf[i] = n - p + 1;

chk_max(res, pre[i] + t.query_max(a[i] - x + 1, m, -m, m, t.rt));

t.modify(a[i], suf[i], -m, m, t.rt);

}}int main()

題目鏈結

給定乙個 \(r \ (r \leq 300)\) 行 \(c \ (c \leq 300)\) 列的矩陣,每個格仔裡都有乙個正整數。

問如果從左上角走到右下角,且每次只能向右或向下走到相鄰格仔,那麼使得路徑上所有數的乘積不小於 \(n \ (n \leq 10 ^ 6)\) 的路徑有多少條?

由於答案可能很大,所以請輸出答案對 \(10^9+7\) 取模的結果。

\(time \ limits: 6000 ms\)

\(memory \ limits: 64 mb\)

答案等於 \(\tbinom\) - 乘積 \(\leq n - 1\) 的路徑數。

顯然有乙個暴力 \(dp\):\(f_\) 表示到 \((i, j)\) 路徑乘積為 \(k\) 的方案數,轉移是顯然的。

考慮優化狀態數,記 \(f_\) 表示到 \((i, j)\) 還有 \(k\) 可以用來被格仔上的數除;

\(\lfloor \frac \rfloor } \rfloor = \lfloor \frac \rfloor\),所以這樣是對的。

學過數論分塊的話一定知道,這樣的 \(k\) (即 \(\lfloor \frac \rfloor\)) 有乙個上界 \(2 \sqrt\)。

\(prf\):

當 \(i \leq \sqrt\) 時,\(\lfloor \frac \rfloor\) 不會超過 \(\sqrt\) 種;

當 \(i > \sqrt\) 時,\(\lfloor \frac \rfloor < \sqrt\),不會超過 \(\sqrt\) 種。

\(q.e.d.\)

時間複雜度 \(o(r c \sqrt)\),空間複雜度 \(o((r + c) \sqrt)\)。

#include #include #include #include int in() 

templateinline void chk_min(t &_, t __)

templateinline void chk_max(t &_, t __)

const int n = 305, mod = 1e9 + 7;

int r, c, n, mp[n][n], f[2][n + n][2005];

int nn, num[2005], id[1000005];

inline void add(int &_, int __)

int qpow(int base, int b, int ret = 1)

int combination(const int n, const int m)

int main()

int cur = 0;

f[1][1][id[(n - 1) / mp[1][1]]] = 1;

for (int i = 2; i <= r + c - 1; ++i, cur ^= 1) }}

cur ^= 1;

int res = 0;

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

add(res, f[cur][r][i]);

printf("%d\n", (combination(r + c - 2, c - 1) - res + mod) % mod);

return 0;

}

題目鏈結

定義兩個序列對應位置上不同的值的個數不超過 \(k\),則可稱為 \(k\) 相似。

現在有乙個長度為 \(n \ (n \leq 10 ^ 4)\) 的序列 \(a\),它有 \(n−l+1\) 個長度為 \(l \ (l \leq 10 ^ 4)\) 的子串(第 \(i\) 個子串為 \([i, i + l - 1]\))。

\(q \ (q \leq 100)\) 組詢問,第 \(j\) 組詢問給出乙個 \(k_j \ (k_j \leq l)\),求每個子串與多少個其它的子串可稱為 \(k_j\) 相似。

\(memory \ limits: 32mb\)

知道 \([x, x + l - 1], [y, y + l - 1] \ (x \ne y)\) 的相似度,可以 \(o(2)\) (逃) 得出 \([x + 1, x + l], [y + 1, y + l]\) 的相似度。

記 \(f_\) 表示與第 \(i\) 個子串 \(j\) 相似的子串數量,空間複雜度 \(o(n^2)\) ,顯然不行;

注意到詢問數不超過 \(100\),可以預處理,將詢問排序,空間複雜度降為 \(o(nq)\),可以通過。

時間複雜度 \(o(l \log_2 q + n ^ 2 + n q)\)。

#include #include #include int in() 

templateinline void chk_min(t &_, t __)

templateinline void chk_max(t &_, t __)

const int n = 1e4 + 5;

struct query b[105];

int n, l, q, a[n], id[n];

int mp[n][105], res[n];

inline bool cmp_id(const query &i, const query &j)

inline bool cmp_k(const query &i, const query &j)

void work() , cmp_k) - b;

for (int i = 1, now; i <= n - l; ++i)

}for (int i = 1; i <= n - l + 1; ++i)

for (int j = 1; j <= q; ++j)

mp[i][j] += mp[i][j - 1];

std::sort(b + 1, b + 1 + q, cmp_id);

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

}void input() ;

}int main()

紀中集訓 Day 3

這幾天一直堅持寫blog 加油吧!早上醒來,說了 我要ak 其實只是蒟蒻的妄想罷了qaq 然後為了不立flag,改成了我要rank 1 然後依舊是有一題不會做qaq 好弱,爭取有一次能全會做吧qaq 然後就230了 rank1 第3題果真是爆搜不過就算寫也難寫啦啦啦 a組的題又是喪病,t1數學題什麼...

紀中集訓 Day7 Day8

t1 大水題呀!t2 還好 又少判斷了,emmmm t3 t4 放棄掙扎 權勢二進位制 題目 乙個十進位制整數被叫做權勢二進位制,當他的十進位制表示的時候只由0或1組成。例如0,1,101,110011都是權勢二進位制而2,12,900不是。當給定乙個n nn的時候,計算一下最少要多少個權勢二進位制...

8 18 紀中集訓 Day18

第一行乙個整數n,表示除根節點之外的其他節點的數量。接下來n行,第i 1行有三個整數fi ei wi,分別表示i號節點的父節點 i號節點上封印石的能量需求 連線節點i與fi的邊最多能傳遞多少能量。最多能滿足多少顆封印石的能量需求。4 0 3 2 0 100 100 1 1 1 2 75 80 2 對...