牛客OI周赛9-提高组题目记录
牛客OI周赛9-提高组题目记录
昨天晚上做了这一套比赛,觉得题目质量挺高,而且有一些非常有趣而且非常清奇的脑回路在里边,于是记录在此。
T1: 扫雷
设 \(f_i\) 表示扫到第 \(i\) 个雷的期望用时,那么我们要求的答案就是 \(f_n\)。
我们不难写出一个递推式:
\]
提出公因式 \(\left((f_i +1) \cdot \dfrac{a_i}{b_i}\right)\),我们可以将式子整理成:
\]
后面的式子其实就等于 \(\left(\dfrac{b_i}{a_i}\right)^2\),以下是我的一些推导:
设 \(x = \dfrac{b_i - a_i}{b_i}\),则我们要求的式子 \(S\) 可以表示为:
\[S = 1 + 2x + 3x^2 +4x^3 +\cdots
\]左右两边乘上 \(x\),则有
\[xS = x + 2x^2 + 3x^3 + 4x^4 + \cdots
\]上式减去下式,则可以得到
\[S = \dfrac{1 + x + x^2 + x^3 + x^4 +\cdots}{1 - x}
\]我们设 \(S' = 1 + x + x^2 + x^3 +\cdots\),也就是上式中的分子,那么左右两边乘上 \(x\),有
\[xS' = x + x^2 + x^3 + x^4 + x^5 + \cdots
\]同样的方法相减,可以得到
\[S' = \dfrac{1}{1 - x}
\]然后代入 \(S\),则有
\[S = \dfrac{1}{(1 - x)^2}
\]再将 \(x = \dfrac{b_i - a_i}{b_i}\) 代入 \(S\),稍加运算即可解出
\[S = \left(\dfrac{b_i}{a_i}\right)^2
\]
于是我们求出了这个非常简单的递推式:
\]
边递推边算逆元即可,时间复杂度 \(\mathcal{O}(n \log a_i)\)。
代码:
#include <cstdio>
const int MaxN = 1000000 + 5;
const int Mod = 1000000007;
int N;
int A[MaxN], B[MaxN];
inline int add(int x, int y) { return (x += y) >= Mod ? x - Mod : x; }
inline int mul(int x, int y) { return 1LL * x * y % Mod; }
inline int pw(int x, int y) { int z = 1; for (; y; y >>= 1, x = mul(x, x)) if (y & 1) z = mul(z, x); return z; }
inline int inv(int x) { return pw(x, Mod - 2); }
inline int sep(int x, int y) { return mul(x, inv(y)); }
void init() {
scanf("%d", &N);
for (int i = 1; i <= N; ++i) scanf("%d %d", &A[i], &B[i]);
}
void solve() {
int f = 0;
for (int i = 1; i <= N; ++i)
f = mul(add(f, 1), sep(B[i], A[i]));
printf("%d\n", f);
}
int main() {
init();
solve();
return 0;
}
PS
这题的 \(n\) 好像可以开到 \(10^7\)。(忽略读入的时间)
这里的 \(a_i\) 全部都知道了,可以在 \(\mathcal{O}(n + \log p)\) 的时间预处理出所有 \(a_i\) 的逆元。
大致做法就是求出 \(a_i\) 的前缀积数组 \(mul_i\),然后将 \(mul_n\) 拿去求逆元,得到 \(mul_n^{-1}\),然后 \(mul_n^{-1} \cdot mul_{n - 1}\) 就是 \(a_{n}^{-1}\);接下来将 \(mul_n^{-1}\) 乘上 \(a_n\) 就可以得到 \(mul_{n - 1}^{-1}\),继续做类似的事情即可,推回到 \(1\),就得到了所有 \(a_i\) 的逆元。
T2: 情书
我的做法好像和大家不太一样?
答案就是区间中每个子串答案之和除以子串个数,于是我们只需要求出每个字串的心动值之和即可。
首先有一个优雅的暴力。我们不枚举子串,只考虑这个区间内每个字符对答案的贡献。
作为子串中从左往右的第 \(i\) 个字符,假设值为 \(c\),那么这个字符对右边的每个位置,都能延伸出这么长的一个子串;对于左边的每个位置,都不妨碍右边的取值,即为一个倍数关系。
稍加思考可以写出答案的式子:(\(b\) 为题中给出的心动程度)
\]
这个东西显然是可以递推求的,而且修改也非常方便,直接修改对应的 \(c\) 值就好了。
但是多次询问,如果快速求出一个区间的答案呢?
注意到这个东西是可以递推的,也就是说我如果求出了前 \(i - 1\) 个的答案,我可以在 \(\mathcal{O}(1)\) 的时间内求出前 \(i\) 个的答案。
这说明在这个问题上,增量法是可以使用的。
我们又发现,对于一段区间,我们会重复扫过这些点很多次。于是我们希望处理出一些区间的答案。
这不难让人想到线段树。
但一个非常棘手的问题就出现了:如果我们求出了两个区间的答案,可以合并吗?又该如何合并?
(下面为了叙述直观,将采用一些不严谨的表达方式,请见谅)
为了方便找到规律,我们抛弃这些冗杂且抽象的式子,转为具体的——左右区间都只有三个元素。
我们设左区间的答案为 \(ans_l\),右区间的答案为 \(ans_r\)。
不难写出 \(ans_l\) 和 \(ans_r\) 的表达式:
ans_r = c_4 \cdot 111 + 2 \cdot c_5 \cdot 11 + 3 \cdot c_6 \cdot 1
\]
(其中的 \(111, 11, 1\) 都是 \(b\) 进制下的数,为了叙述直观,故如此表示。)
我们要求的 \(ans\) 值,应当是
\]
分别考虑左区间和右区间对这个最终值的贡献。显然最终值中含 \(c_1, c_2, c_3\) 的这三个单项式是从左区间贡献来的,而含 \(c_4, c_5, c_6\) 的单项式是从右区间贡献来的。
那么我们观察一下,从 \(c_1 \cdot 111 + 2 \cdot c_2 \cdot 11 + 3 \cdot c_2 \cdot 1\) 到 \(c_1 \cdot 111111 + 2 \cdot c_2 \cdot 11111 + 3 \cdot c_3 \cdot 1111\),这三项经历了什么。
首先它们全部乘上了 \(b^{rsize}\),其中 \(rsize\) 是右区间的长度,在这个例子中等于 \(3\)。
然后它们全部加上了 \(111 \times(c_1 + 2 \cdot c_2 + 3 \cdot c_3)\)。
于是我们发现我们又需要多递推两个式子:区间长度以及“区间带权和”(即 \(\sum_{i = 1}^n i \cdot c_i\))。
区间带权和的递推请自行脑补,或者参考后面代码中 Merge()
函数中的 \(c\) 项,指的就是区间带权和。值得一提的是,在递推这个的过程中,您会发现,我们还需要递推一个区间和,即 \(\sum_{i = 1}^n c_i\),对应 Merge()
函数中的 \(d\) 项。
再考虑右区间的贡献,从 \(c_4 \cdot 111 + 2 \cdot c_5 \cdot 11 + 3 \cdot c_6 \cdot 1\) 到 \(4 \cdot c_4 \cdot 111 +5 \cdot c_5 \cdot 11 + 6 \cdot c_6 \cdot 1\),这三项又经历了什么。
它们加上了 \(lsize \times (c_4 \cdot 111 + c_5 \cdot 11 +c_6 \cdot 1)\)。
于是我们发现我们又需要多递推一个式子:“区间不带权答案”(即 \(c_1 \cdot 11111... + c_2 \cdot 1111... + c_3 \cdot 111... + \cdots\))
区间不带权答案的递推类似,您可以参考后面代码中 Merge()
函数的 \(b\) 项的递推过程。
然后一堆数一起递推上去,合并一下即可。
这样 \(\texttt{pushup()}\) 函数终于完成了,其它方面就类似线段树做就好了。更新就单点更新然后 \(\texttt{pushup}\) 到根,询问就区间询问,然后如果有分隔区间的话调用 Merge()
函数合并一下答案即可。
时间复杂度 \(\mathcal{O}(n \log n)\),空间是卡着过的。
代码:第一次写有 14 个参数的函数,哭了
#include <cstdio>
const int MaxN = 200000 + 5, MaxV = 800000 + 5;
const int Mod = 1000000007;
inline int add(int x, int y) { return (x += y) >= Mod ? x - Mod : x; }
inline int mul(int x, int y) { return 1LL * x * y % Mod; }
inline int pw(int x, int y) { int z = 1; for (; y; y >>= 1, x = mul(x, x)) if (y & 1) z = mul(z, x); return z; }
inline int inv(int x) { return pw(x, Mod - 2); }
inline int sep(int x, int y) { return mul(x, inv(y)); }
int N, M, B;
int A[MaxN], F[MaxN], G[MaxN];
struct SegTree {
int L[MaxV], R[MaxV];
int Ans[MaxV], Sum[MaxV], Wht[MaxV], Wth[MaxV];
inline void Merge(int &a0, int &b0, int &c0, int &d0, int a1, int b1, int c1, int d1, int a2, int b2, int c2, int d2, int lsize, int rsize) {
d0 = add(d1, d2);
c0 = add(c1, add(c2, mul(lsize, d2)));
b0 = add(add(mul(b1, F[rsize]), mul(d1, G[rsize])), b2);
a0 = add(add(mul(a1, F[rsize]), mul(c1, G[rsize])), add(a2, mul(lsize, b2)));
}
inline void pushup(int i) {
int ls = i << 1, rs = i << 1 | 1;
int lSize = R[ls] - L[ls] + 1, rSize = R[rs] - L[rs] + 1;
Merge(Ans[i], Wth[i], Wht[i], Sum[i], Ans[ls], Wth[ls], Wht[ls], Sum[ls], Ans[rs], Wth[rs], Wht[rs], Sum[rs], lSize, rSize);
}
void Build_Tree(int left, int right, int i) {
L[i] = left, R[i] = right;
if (left == right) {
Sum[i] = Ans[i] = Wht[i] = Wth[i] = A[left];
return;
}
int mid = (L[i] + R[i]) >> 1;
Build_Tree(left, mid, i << 1);
Build_Tree(mid + 1, right, i << 1 | 1);
pushup(i);
}
void Update_Tree(int pos, int val, int i) {
if (L[i] == R[i]) {
Sum[i] = Ans[i] = Wht[i] = Wth[i] = val;
return;
}
int mid = (L[i] + R[i]) >> 1;
if (pos <= mid) Update_Tree(pos, val, i << 1);
else Update_Tree(pos, val, i << 1 | 1);
pushup(i);
}
void Query_Tree(int left, int right, int i, int &a, int &b, int &c, int &d) {
if (left == L[i] && right == R[i]) {
a = Ans[i], b = Wth[i], c = Wht[i], d = Sum[i];
return;
}
int mid = (L[i] + R[i]) >> 1;
if (right <= mid) Query_Tree(left, right, i << 1, a, b, c, d);
else if (left > mid) Query_Tree(left, right, i << 1 | 1, a, b, c, d);
else {
int a1, b1, c1, d1, a2, b2, c2, d2;
Query_Tree(left, mid, i << 1, a1, b1, c1, d1);
Query_Tree(mid + 1, right, i << 1 | 1, a2, b2, c2, d2);
Merge(a, b, c, d, a1, b1, c1, d1, a2, b2, c2, d2, mid - left + 1, right - mid);
}
}
} T;
void init() {
scanf("%d %d %d", &N, &M, &B);
char str[MaxN];
scanf("%s", str + 1);
for (int i = 1; i <= N; ++i) A[i] = str[i] - 'a' + 1;
F[0] = 1; G[0] = 0;
for (int i = 1; i <= N; ++i) {
F[i] = mul(F[i - 1], B);
G[i] = add(G[i - 1], F[i - 1]);
}
}
void solve() {
T.Build_Tree(1, N, 1);
for (int i = 1; i <= M; ++i) {
int opt; scanf("%d", &opt);
if (opt == 0) {
int a, b, c, d, l, r;
scanf("%d %d", &l, &r);
T.Query_Tree(l, r, 1, a, b, c, d);
int substrings = mul(r - l + 1, sep(r - l + 2, 2));
printf("%d\n", sep(a, substrings));
} else {
int x; char c;
scanf("%d %c", &x, &c);
T.Update_Tree(x, c - 'a' + 1, 1);
}
}
}
int main() {
init();
solve();
return 0;
}
T3: 学习
当时没有想出正解嘤嘤嘤。
对于 \(30\%\) 的数据 \(n ^ 2\) 暴力一下,也就是枚举每一个点,然后枚举子树内的数 \(\mathcal{O}(n)\) 转移一下。
对于一条链的情况,是个三维偏序问题,保证了 \(i < j\) 有序,然后 CDQ 套树状数组做一下就好了。
暴力代码:
#include <algorithm>
#include <cstdio>
const int MaxN = 100000 + 5;
struct Graph {
int cnte;
int Head[MaxN], To[MaxN], Next[MaxN];
inline void add_edge(int from, int to) {
cnte++; To[cnte] = to;
Next[cnte] = Head[from]; Head[from] = cnte;
}
};
int N;
int A[MaxN], B[MaxN], C[MaxN];
int Da[MaxN], Db[MaxN];
Graph G; bool isChain = true;
void init() {
scanf("%d", &N);
for (int i = 1; i <= N; ++i) {
scanf("%d %d %d", &A[i], &B[i], &C[i]);
Da[i] = A[i], Db[i] = B[i];
}
std::sort(Da + 1, Da + 1 + N);
std::sort(Db + 1, Db + 1 + N);
for (int i = 1; i <= N; ++i) {
A[i] = std::lower_bound(Da + 1, Da + 1 + N, A[i]) - Da;
B[i] = std::lower_bound(Db + 1, Db + 1 + N, B[i]) - Db;
}
for (int i = 1; i < N; ++i) {
int u, v;
scanf("%d %d", &u, &v);
if (u != v - 1) isChain = false;
G.add_edge(u, v);
}
}
// n <= 1000
namespace Subtask1 {
int cntv;
int id[MaxN], dfn[MaxN], siz[MaxN];
int dp[MaxN];
void dfs(int u) {
siz[u] = 1;
id[u] = ++cntv, dfn[cntv] = u;
for (int i = G.Head[u]; i; i = G.Next[i]) {
int v = G.To[i];
dfs(v);
siz[u] += siz[v];
}
dp[u] = C[u];
for (int i = id[u] + 1; i <= id[u] + siz[u] - 1; ++i) {
int v = dfn[i];
if (A[v] <= A[u] && B[v] <= B[u])
dp[u] = std::max(dp[u], dp[v] + C[u]);
}
}
void solve() {
dfs(1);
int ans = 0;
for (int i = 1; i <= N; ++i) ans = std::max(ans, dp[i]);
printf("%d\n", ans);
}
}
// chain
namespace Subtask2 {
int dp[MaxN], lnk[MaxN];
struct BIT {
int t[MaxN];
inline int lowbit(int i) {
return i & -i;
}
inline void clear(int x) {
for (int i = x; i <= N; i += lowbit(i))
t[i] = 0;
}
inline void update(int x, int v) {
for (int i = x; i <= N; i += lowbit(i))
t[i] = std::max(t[i], v);
}
inline int query(int x) {
int res = 0;
for (int i = x; i > 0; i -= lowbit(i))
res = std::max(res, t[i]);
return res;
}
} T;
inline bool cmp(int x, int y) {
return A[x] < A[y];
}
void cdq(int l, int r) {
if (l == r) {
dp[l] = std::max(dp[l], C[l]);
return;
}
int mid = (l + r) >> 1;
cdq(l, mid);
for (int i = l; i <= r; ++i) lnk[i] = i;
std::sort(lnk + l, lnk + 1 + mid, cmp); std::sort(lnk + 1 + mid, lnk + 1 + r, cmp);
for (int i = mid + 1, j = l; i <= r; ++i) {
while (j <= mid && A[lnk[j]] <= A[lnk[i]]) {
T.update(B[lnk[j]], dp[lnk[j]]);
j++;
}
dp[lnk[i]] = std::max(dp[lnk[i]], T.query(B[lnk[i]]) + C[lnk[i]]);
}
for (int i = l; i <= mid; ++i) T.clear(B[lnk[i]]);
cdq(mid + 1, r);
}
void solve() {
std::reverse(A + 1, A + 1 + N);
std::reverse(B + 1, B + 1 + N);
std::reverse(C + 1, C + 1 + N);
cdq(1, N);
int ans = 0;
for (int i = 1; i <= N; ++i)
ans = std::max(ans, dp[i]);
printf("%d\n", ans);
}
}
void solve() {
if (N > 1000 && isChain == true) Subtask2::solve();
else Subtask1::solve();
}
int main() {
init();
solve();
return 0;
}
看了一下别人的代码,发现正解是树套树。
本题要求的就是一条端点为根的链,要求选取这条链上的若干点,使得满足这些点按照深度从浅到深的顺序,\(A, B\) 序列单调不升,且权值和 \(C\) 最大。
树上的 DFS 有一个性质:搜索到一个点 \(u\) 时,在递归栈中的所有点,恰好是 \(u\) 到根节点简单路径上的所有点,也就是 \(u\) 号点的所有祖先。
于是从上往下进行动态规划。\(f_i\) 表示根节点到 \(i\) 的这条链上,强制选了 \(i\) 号点,最大的价值和。
然后每次递归到 \(u\) 时,往二维平面内加入一个 \((A_u, B_u)\),权值为 \(f_u\) 的点。\(f_u\) 的确定也很简单,用树套树找出左下角为 \((A_u, B_u)\),右上角为 \((+\infty, +\infty)\) 这个矩形内权值最大的点即可。
具体实现可以离散完然后使用可持久化线段树套动态开点线段树维护加入删除和求区间最大值。
时间复杂度 \(\mathcal{O}(n \log^2 n)\),常数不是太大的话应该能过得去。
代码:(这份代码常数比较大,会被第 \(5\) 个点卡。与上面暴力代码中的 \(\texttt{Subtask #2}\) 的链上直接 CDQ 结合一下即可 AC,这份代码太丑了就不贴在博客里了。)
#include <algorithm>
#include <cstdio>
const int MaxN = 100000 + 5;
const int MaxM = 2000000 + 5, MaxV = 40000000 + 5;
struct Graph {
int cnte;
int Head[MaxN], To[MaxN], Next[MaxN];
inline void add_edge(int from, int to) {
cnte++; To[cnte] = to;
Next[cnte] = Head[from]; Head[from] = cnte;
}
};
int N;
int A[MaxN], B[MaxN], C[MaxN];
int Da[MaxN], Db[MaxN];
int dp[MaxN];
Graph G;
struct dynamicSegTree {
int rt[MaxM], cntv;
int lson[MaxV], rson[MaxV];
int Mx[MaxV];
inline void pushup(int i) { Mx[i] = std::max(Mx[lson[i]], Mx[rson[i]]); }
void Update_Tree(int pos, int val, int &id, int baseid, int l = 1, int r = N) {
if (id == 0) id = ++cntv;
if (l == r) {
Mx[id] = std::max(Mx[baseid], val);
return;
}
int mid = (l + r) >> 1;
if (pos <= mid) {
Update_Tree(pos, val, lson[id], lson[baseid], l, mid);
rson[id] = rson[baseid];
} else {
Update_Tree(pos, val, rson[id], rson[baseid], mid + 1, r);
lson[id] = lson[baseid];
}
pushup(id);
}
int Query_Tree(int left, int right, int id, int l = 1, int r = N) {
if (left == l && right == r) return Mx[id];
int mid = (l + r) >> 1;
if (right <= mid) return Query_Tree(left, right, lson[id], l, mid);
else if (left > mid) return Query_Tree(left, right, rson[id], mid + 1, r);
else return std::max(Query_Tree(left, mid, lson[id], l, mid), Query_Tree(mid + 1, right, rson[id], mid + 1, r));
}
} P;
struct perSegTree {
int rt[MaxN], cntv;
int lson[MaxM], rson[MaxM];
void Update_Tree(int x, int y, int val, int &id, int base, int l = 1, int r = N) {
if (id == 0) id = ++cntv;
P.Update_Tree(y, val, P.rt[id], P.rt[base]);
if (l == r) return;
int mid = (l + r) >> 1;
if (x <= mid) {
Update_Tree(x, y, val, lson[id], lson[base], l, mid);
rson[id] = rson[base];
} else {
Update_Tree(x, y, val, rson[id], rson[base], mid + 1, r);
lson[id] = lson[base];
}
}
int Query_Tree(int xl, int xr, int yl, int yr, int id, int l = 1, int r = N) {
if (xl == l && xr == r) return P.Query_Tree(yl, yr, P.rt[id]);
int mid = (l + r) >> 1;
if (xr <= mid) return Query_Tree(xl, xr, yl, yr, lson[id], l, mid);
else if (xl > mid) return Query_Tree(xl, xr, yl, yr, rson[id], mid + 1, r);
else return std::max(Query_Tree(xl, mid, yl, yr, lson[id], l, mid), Query_Tree(mid + 1, xr, yl, yr, rson[id], mid + 1, r));
}
} T;
void dfs(int u, int f) {
dp[u] = T.Query_Tree(1, A[u], 1, B[u], T.rt[f]) + C[u];
T.Update_Tree(A[u], B[u], dp[u], T.rt[u], T.rt[f]);
for (int i = G.Head[u]; i; i = G.Next[i]) {
int v = G.To[i];
dfs(v, u);
}
}
void init() {
scanf("%d", &N);
for (int i = 1; i <= N; ++i) {
scanf("%d %d %d", &A[i], &B[i], &C[i]);
Da[i] = A[i], Db[i] = B[i];
}
std::sort(Da + 1, Da + 1 + N); std::sort(Db + 1, Db + 1 + N);
for (int i = 1; i <= N; ++i) {
A[i] = std::lower_bound(Da + 1, Da + 1 + N, A[i]) - Da;
B[i] = std::lower_bound(Db + 1, Db + 1 + N, B[i]) - Db;
A[i] = N - A[i] + 1;
B[i] = N - B[i] + 1;
}
for (int i = 1; i < N; ++i) {
int u, v;
scanf("%d %d", &u, &v);
G.add_edge(u, v);
}
}
void solve() {
dfs(1, 0);
int ans = 0;
for (int i = 1; i <= N; ++i) ans = std::max(ans, dp[i]);
printf("%d\n", ans);
}
int main() {
init();
solve();
return 0;
}
\]
牛客OI周赛9-提高组题目记录的更多相关文章
- 牛客OI周赛8-提高组A-用水填坑
牛客OI周赛8-提高组A-用水填坑 题目 链接: https://ac.nowcoder.com/acm/contest/403/A 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制: ...
- 牛客OI周赛2-提高组
A.游戏 链接:https://www.nowcoder.com/acm/contest/210/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语 ...
- 牛客OI周赛11-普及组 B Game with numbers (数学,预处理真因子)
链接:https://ac.nowcoder.com/acm/contest/942/B 来源:牛客网 Game with numbers 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C+ ...
- 牛客OI周赛7-提高组 A 小睿睿的等式
链接:https://ac.nowcoder.com/acm/contest/371/A来源:牛客网 小睿睿在游戏开始时有n根火柴棒,他想知道能摆成形如“A+B=n”的等式且使用的火柴棒数也恰好等于n ...
- 牛客OI周赛7-提高组 B小睿睿的询问(ST打表)
链接:https://ac.nowcoder.com/acm/contest/371/B来源:牛客网 小睿睿的n个妹纸排成一排,每个妹纸有一个颜值val[i].有m个询问,对于每一个询问,小睿睿想知道 ...
- 牛客OI周赛7-普及组 解题报告
出题人好评. 评测机差评. A 救救喵咪 二位偏序.如果数据范围大的话直接树状数组,不过才1000就\(O(n^2)\)暴力就ok了. #include <bits/stdc++.h> s ...
- 牛客OI周赛10-普及组-A眼花缭乱的街市-(加速+二分)
https://ac.nowcoder.com/acm/contest/901/A 很简单的一道题,全场只有20+AC,卡时间.新学了cin加速语法和数组二分查找的函数调用. 知道有个读写挂,可以加速 ...
- 牛客OI周赛8-普及组
https://ac.nowcoder.com/acm/contest/543#question A. 代码: #include <bits/stdc++.h> using namespa ...
- 补比赛——牛客OI周赛9-普及组
比赛地址 A 小Q想撸串 题目分析 普及T1水题惯例.字符串中找子串. Code #include<algorithm> #include<iostream> #include ...
随机推荐
- 浅谈最长上升子序列(LIS)
一.瞎扯的内容 给一个长度为n的序列,求它的最长上升子序列(LIS) 简单的dp n=read(); ;i<=n;i++) a[i]=read(); ;i<=n;i++) ;j<i; ...
- stm32f407以太网及USB OTG快速开发
stm32f407以太网及USB OTG快速开发 引言 想要快速完成网络协议栈和USB OTG功能,使用ST自家的工具STM32CubMx再好不过的了.如果你还不会使用,别着急下面我会一步一步的用图片 ...
- seafile ubuntu 安装相关
1,各种原因,需要安装 seafile,好,开始安装. 2,参考 https://github.com/haiwen/seafile-server-installer-cn 1,Ubuntu 16.0 ...
- python 不知道是啥
1.判断两个大文件是否是同一个文件 import os import hashlib import time start = time.time() path1 = r"E:\视频资料\el ...
- JavaWeb学习之三层架构实例(二)
引言 这个实例是上一个实例JavaWeb学习 三层架构实例(一)的加强版,实现的是在前端对数据库中student表的 增.删.改.查 操作.关于三层组成云云,这里就不再叙述. 实例 效果图 先来看一下 ...
- 【LeetCode每天一题】Rotate List(旋转链表)
Given a linked list, rotate the list to the right by k places, where k is non-negative. Example 1: I ...
- package,继承,访问修饰符
1.package 包(package),用于管理程序中的类,可用于处理类的同名问题. 1.1定义package的方法 package 包名; package用于定义包,必须写在源文件有效代码的第一句 ...
- ionic3 生命周期 之 ionViewWillLeave 坑
ionic3 生命周期 ionViewWillLeave,当页面关闭离开时 执行的事件, 从页面根部跳转 this.appCtrl.getRootNav().setRoot() 方法离开时是 不执行 ...
- OO第二单元总结(多线程的电梯调度)
经过第一单元作业的训练,在做第二单元的作业的时候,要更加的有条理.但是第二次作业多线程的运行,带来了更多的运行的不确定性.呈现出来就是程序会出现由于线程安全问题带来的不可复现的bug.本单元的作业也让 ...
- ES6,ES5,ES3,对比学习~
在简书上看到一个博主写的文章,感觉很有用.留下:https://www.jianshu.com/p/287e0bb867ae Excuse me?这个前端面试在搞事!https://zhuanlan ...