題目鏈結
給定整數 \(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 對...