从这里开始

Day 1

Problem A

  考虑贪心地选取极大非 0 段减少。

  如果两次操作有交,并且不是包含关系,那么把其中一次操作的,但另一次没有操作的移过去,然后就变成了上面那个贪心了。

Code

#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
typedef bool boolean; const int N = 1e5 + 5; int n;
int res = 0;
int ar[N]; inline void init() {
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d", ar + i);
} inline void solve() {
int lst = 0;
for (int i = 1; i <= n; i++) {
if (ar[i] > lst)
res += ar[i] - lst;
lst = ar[i];
}
printf("%d\n", res);
} int main() {
freopen("road.in", "r", stdin);
freopen("road.out", "w", stdout);
init();
solve();
return 0;
}

Problem B

  考虑从小到达确定 $b$ 中的面额。不难发现:

  • $b$ 一定是 $a$ 的子集。
  • $a$ 中一种面值不在 $b$ 中当且仅当它能被除掉它之后的面额表示出来。

Code

#include <bits/stdc++.h>
using namespace std;
typedef bool boolean; const int N = 105, M = 25005; int T;
int n, m;
int a[N];
bitset<M> f; void solve() {
scanf("%d", &n);
m = 0;
for (int i = 1; i <= n; i++) {
scanf("%d", a + i);
m = max(m, a[i]);
}
sort(a + 1, a + n + 1);
f.reset();
f.set(0);
int ans = 0;
for (int i = 1; i <= n; i++) {
if (!f.test(a[i])) {
for (int j = a[i]; j <= m; j++) {
if (f.test(j - a[i])) {
f.set(j);
}
}
ans++;
}
}
printf("%d\n", ans);
} int main() {
freopen("money.in", "r", stdin);
freopen("money.out", "w", stdout);
scanf("%d", &T);
while (T--) {
solve();
}
return 0;
}

Problem C

  考虑二分答案。考虑在每个子树内决策,每个子树内最多有一条未完成的路径对父节点有贡献。

  首先需要最大化数量,不难证明这样不会更劣。

  首先已经满足条件的可以直接算入答案,没有满足条件考虑两两配对。这个从大的开始考虑,每次和最小的能够匹配的配对。

  考虑如何在数量最大的情况下,最大化对父节点的贡献。考虑最大没有匹配的路径,考虑用它替换掉某组匹配中的较大值。

  时间复杂度 $O(n\log V\log n)$。

Code

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <vector>
using namespace std;
typedef bool boolean; template <typename T>
void pfill(T* pst, const T* ped, T val) {
for ( ; pst != ped; *(pst++) = val);
} typedef class Edge {
public:
int ed, nx, w; Edge(int ed = 0, int nx = 0, int w = 0):ed(ed), nx(nx), w(w) { }
}Edge; typedef class MapManager {
public:
int ce;
int* h;
Edge* es; MapManager() : ce(-1), h(NULL), es(NULL) { }
MapManager(int n, int m) : ce(-1) {
h = new int[(n + 1)];
es = new Edge[(m + 1)];
pfill(h, h + n + 1, -1);
} void addEdge(int u, int v, int w) {
es[++ce] = Edge(v, h[u], w);
h[u] = ce;
} Edge& operator [] (int p) {
return es[p];
}
}MapManager; template <typename T>
class Pool {
public:
int sz;
T *p;
T *tp; Pool(int sz) : sz(sz) {
p = new T[sz + 1];
tp = p;
} void reset() {
tp = p;
} T* alloc(int len) {
T* rt = tp;
tp += len;
// cerr << tp - p << '\n';
return rt;
}
}; typedef pair<int, int> pii; const int N = 5e4 + 3; int n, m;
int deg[N];
MapManager g;
Pool<int> pl1(N << 2);
Pool<pii> pl2(N << 2);
Pool<boolean> pl3(N << 2); inline void init() {
scanf("%d%d", &n, &m);
g = MapManager(n, n << 1);
pfill(deg + 1, deg + n + 1, 0);
for (int i = 1, u, v, w; i < n; i++) {
scanf("%d%d%d", &u, &v, &w);
g.addEdge(u, v, w);
g.addEdge(v, u, w);
deg[u]++, deg[v]++;
}
} //int cnt;
pii dfs(int p, int fa, int mid) {
int* a = pl1.alloc(deg[p] + 1);
pii* m = pl2.alloc(deg[p] + 1);
boolean* vis = pl3.alloc(deg[p] + 1);
// cerr << ++cnt << '\n'; int rt = 0, tp = 0;
for (int i = g.h[p], e; ~i; i = g[i].nx) {
if ((e = g[i].ed) == fa)
continue;
pii x = dfs(e, p, mid);
rt += x.first, a[++tp] = (x.second + g[i].w);
} sort(a + 1, a + tp + 1);
while (tp && a[tp] >= mid)
tp--, rt++; if (!tp)
return pii(rt, 0); for (int i = 0; i <= tp; i++)
vis[i] = false; int l = 1, r = tp, _tp = 0;
while (l < r) {
while (l < r && a[l] + a[r] < mid)
l++;
if (l < r) {
m[++_tp] = pii(a[l], a[r]);
vis[l] = vis[r] = true;
l++, r--, rt++;
}
} while (r && vis[r])
r--; if (!r)
return pii(rt, 0); int b = a[r];
for (int i = _tp; i; i--)
if (m[i].first + b >= mid)
return pii(rt, m[i].second);
return pii(rt, b);
} boolean check(int mid) {
// cnt = 0;
pl1.reset();
pl2.reset();
pl3.reset();
return dfs(1, 0, mid).first >= m;
} inline void solve() {
int l = 1, r = 5e8, mid;
while (l <= r) {
mid = (l + r) >> 1;
if (check(mid))
l = mid + 1;
else
r = mid - 1;
}
printf("%d\n", l - 1);
} int main() {
freopen("track.in", "r", stdin);
freopen("track.out", "w", stdout);
init();
solve();
return 0;
}

Day 2

Problem A

  暴力枚举断掉环上的哪一条边。

Code

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <stack>
using namespace std;
typedef bool boolean; const int N = 5005; int n, m;
int tp;
int ans[N];
int cmp[N];
vector<int> g[N]; inline void init() {
scanf("%d%d", &n, &m);
for (int i = 1, u, v; i <= m; i++) {
scanf("%d%d", &u, &v);
g[u].push_back(v);
g[v].push_back(u);
}
} namespace tree { void dfs(int p, int fa) {
ans[++tp] = p;
for (int i = 0, e; i < (signed) g[p].size(); i++)
if ((e = g[p][i]) ^ fa)
dfs(e, p);
} inline void solve() {
tp = 0;
for (int i = 1; i <= n; i++)
sort(g[i].begin(), g[i].end());
dfs(1, 0);
for (int i = 1; i <= n; i++)
printf("%d%c", ans[i], (i == n) ? ('\n') : (' '));
} } namespace circle { stack<int> s;
boolean vis[N];
vector<int> cir; boolean dfs1(int p, int fa) {
if (vis[p]) {
int cur;
do {
cur = s.top();
s.pop();
cir.push_back(cur);
} while (cur != p);
return true;
}
s.push(p), vis[p] = true;
for (int i = 0, e; i < (signed) g[p].size(); i++)
if (((e = g[p][i]) ^ fa) && dfs1(e, p))
return true;
s.pop();
return false;
} void dfs(int p, int fa, int banu, int banv) {
cmp[++tp] = p;
// cerr << p << " " << tp << '\n';
boolean sgn1 = (p == banu || p == banv);
for (int i = 0, e; i < (signed) g[p].size(); i++) {
e = g[p][i];
if ((e ^ fa) && !(sgn1 && (e == banu || e == banv)))
dfs(e, p, banu, banv);
}
} boolean check_update() {
for (int i = 1; i <= n; i++)
if (ans[i] ^ cmp[i])
return cmp[i] < ans[i];
return false;
} inline void solve() {
for (int i = 1; i <= n; i++)
sort(g[i].begin(), g[i].end());
dfs1(1, 0);
signed int s = (signed) cir.size();
tp = 0;
dfs(1, 0, cir[0], cir[1]);
for (int j = 1; j <= n; j++)
ans[j] = cmp[j];
for (int i = 1; i < s; i++) {
// cerr << cir[i] << '\n';
tp = 0;
dfs(1, 0, cir[i], cir[(i + 1) % s]);
if (check_update())
for (int j = 1; j <= n; j++)
ans[j] = cmp[j];
}
for (int i = 1; i <= n; i++)
printf("%d%c", ans[i], (i == n) ? ('\n') : (' '));
} } int main() {
freopen("travel.in", "r", stdin);
freopen("travel.out", "w", stdout);
init();
if (n == m)
circle :: solve();
else
tree :: solve();
return 0;
}

  好像校内 oj 上测,最慢一个点 978ms,Emm......

  其实考虑在环上每一个位置往回走的下一个标号是确定的。然后就能 $O(n\log n)$ 了。

  最近手残得比较厉害,sad.....

Code

#include <bits/stdc++.h>
using namespace std;
typedef bool boolean; const int N = 5e3 + 5; int n, m;
vector<int> ans;
vector<int> G[N]; void dfs(int p, int fa, vector<int> &ans = ::ans) {
ans.push_back(p);
for (int _ = 0, e; _ < (signed) G[p].size(); _++) {
if ((e = G[p][_]) ^ fa) {
dfs(e, p);
}
}
} boolean vis[N];
vector<int> cir;
boolean findcir(int p, int fa) {
if (vis[p]) {
vector<int>::iterator it = --cir.end();
while (*it ^ p)
it--;
cir.erase(cir.begin(), it);
return true;
}
vis[p] = true;
cir.push_back(p);
for (int _ = 0, e; _ < (signed) G[p].size(); _++) {
if (((e = G[p][_]) ^ fa) && findcir(e, p)) {
return true;
}
}
cir.pop_back();
return false;
} void finderase(vector<int>& a, int x) {
vector<int>::iterator it = a.begin();
while (*it ^ x)
it++;
a.erase(it);
} int main() {
freopen("travel.in", "r", stdin);
freopen("travel.out", "w", stdout);
scanf("%d%d", &n, &m);
for (int i = 1, u, v; i <= m; i++) {
scanf("%d%d", &u, &v);
G[u].push_back(v);
G[v].push_back(u);
}
for (int i = 1; i <= n; i++)
sort(G[i].begin(), G[i].end());
if (n == m) {
findcir(1, 0);
int nxt = *upper_bound(G[cir[0]].begin(), G[cir[0]].end(), cir[1]);
for (int i = 1, x, y; ; i++) {
x = cir[i];
if (x >= nxt) {
y = cir[i - 1];
finderase(G[x], y);
finderase(G[y], x);
// cerr << x << " " << y << " " << nxt << '\n';
break;
}
vector<int>::iterator it = upper_bound(G[x].begin(), G[x].end(), cir[i + 1]);
if (it != G[x].end() && *it == cir[i - 1])
it++;
if (it != G[x].end())
nxt = *it;
}
}
dfs(1, 0, ans);
for (int i = 0; i < n; i++)
printf("%d ", ans[i]);
return 0;
}

Problem B

  请欣赏神仙行为:

  • 早上教练发题,神仙 jerome_wei 说难道这题能做,下午发成绩,rk 1 cdqz-wyp 100 100 100 300
  • 早上教练发题,神仙 jerome_wei 说咕了咕了,下午发成绩,rk 1 cdqz-wyp 100 100 100 300
  • 一天,神仙  jerome_wei 看到了这道题,说这什么鬼题,跑了跑了,不久之后博客上出现了详细题解和证明

  不难发现 $a_{x, y} \geqslant a_{x - 1, y + 1}$。

  考虑一处不合法的路径,如果存在一定是字典序相邻的一对,这样话就是考虑把最后一个不在最后一行的 R 替换成 D,大概是这样的:

  你发现如果第二个位置相等,由于在另一条路径下方的权值一定是小于等于它的,由此可以推出它们字典序相等。那么右下角的大矩形内每一对 $x + y$ 相等的 $a_{x, y}$ 都是相同的。

  随便 dp 一下应该能拿到 65 分的好成绩。(枚举 $x + y$ 的值,状压一下当前的满足 $a_{x, y} = a_{x - 1, y + 1}$ 以及横纵坐标和等于 $x + y + 1$ 的状态)

  不难注意到,当 $m$ 比较大的时候,中间的有效状态只有常数个,考虑 $x = 0, 1$ 总是可行的,当 $x \geqslant 3, y \geqslant 2$ 的时候,这些格子必须满足 $a_{x, y} = a_{x - 1, y + 1}$。因为:

  因为红格子和蓝格子以及蓝格子和黄格子不可能同时都不同。

  理论上中间暴力 dp 能过,不过写个矩乘快速幂怎么都能过,我好像有地方写菜了,然后好像就过不了?因为我非常地懒,众所周知,打表可得当 $m \geqslant n + 1$ 的时候当 $m$ 每增加 1,答案乘上 3。

  如果我 csp 后没退役再来填这个规律的坑好了。

Code

#include <bits/stdc++.h>
using namespace std;
typedef bool boolean; #define ll long long void exgcd(int a, int b, int& x, int& y) {
if (!b) {
x = 1, y = 0;
} else {
exgcd(b, a % b, y, x);
y -= (a / b) * x;
}
} int inv(int a, int n) {
int x, y;
exgcd(a, n, x, y);
return (x < 0) ? (x + n) : (x);
} const int Mod = 1e9 + 7; template <const int Mod = :: Mod>
class Z {
public:
int v; Z() : v(0) { }
Z(int x) : v(x){ }
Z(ll x) : v(x % Mod) { } friend Z operator + (const Z& a, const Z& b) {
int x;
return Z(((x = a.v + b.v) >= Mod) ? (x - Mod) : (x));
}
friend Z operator - (const Z& a, const Z& b) {
int x;
return Z(((x = a.v - b.v) < 0) ? (x + Mod) : (x));
}
friend Z operator * (const Z& a, const Z& b) {
return Z(a.v * 1ll * b.v);
}
friend Z operator ~(const Z& a) {
return inv(a.v, Mod);
}
friend Z operator - (const Z& a) {
return Z(0) - a;
}
Z& operator += (Z b) {
return *this = *this + b;
}
Z& operator -= (Z b) {
return *this = *this - b;
}
Z& operator *= (Z b) {
return *this = *this * b;
}
friend boolean operator == (const Z& a, const Z& b) {
return a.v == b.v;
}
}; Z<> qpow(Z<> a, int p) {
Z<> rt = Z<>(1), pa = a;
for ( ; p; p >>= 1, pa = pa * pa) {
if (p & 1) {
rt = rt * pa;
}
}
return rt;
} typedef Z<> Zi; #define pii pair<int, int> const int N = 1e6 + 10; int n, m;
int Lx[N], Rx[N];
map<pii, Zi> G[N]; int opt(int sum, int s, int x) {
if (x <= Lx[sum] || x > Rx[sum])
return s;
return s | (1 << x);
} Zi dp(int sum, int s0, int s1) {
if (sum == n + m - 2)
return 2;
if (G[sum].count(pii(s0, s1))) {
return G[sum][pii(s0, s1)];
}
Zi rt = 0;
int ns0 = s1;
for (int i = Lx[sum]; i <= Rx[sum]; i++) {
if ((s0 >> i) & 1) {
ns0 = opt(sum + 1, ns0, i);
ns0 = opt(sum + 1, ns0, i + 1);
}
}
for (int i = Lx[sum]; i <= Rx[sum] + 1; i++) {
if ((s0 >> i) & 1)
continue;
int ns1 = 0;
for (int j = Lx[sum] + 1; j <= i && j <= Rx[sum]; j++)
ns1 = opt(sum + 2, ns1, j + 1);
for (int j = i + 2; j <= Rx[sum]; j++)
ns1 = opt(sum + 2, ns1, j + 1);
rt += dp(sum + 1, ns0, ns1);
}
// cerr << sum << " " << s0 << " " << s1 << " " << rt.v << '\n';
return G[sum][pii(s0, s1)] = rt;
} Zi solve(int n, int m) {
if (n > m)
swap(n, m);
if (n == m || m == n + 1) {
::n = n, ::m = m;
for (int i = 0; i < m + 10; i++) {
Lx[i] = 20, Rx[i] = 0;
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
Lx[i + j] = min(Lx[i + j], i);
Rx[i + j] = max(Rx[i + j], i);
}
}
return dp(0, 0, 0);
}
if (n == 1)
return qpow(2, m);
return solve(n, n + 1) * qpow(3, m - n - 1);
} int main() {
freopen("game.in", "r", stdin);
freopen("game.out", "w", stdout);
scanf("%d%d", &n, &m);
printf("%d\n", solve(n, m).v);
return 0;
}

Problem C

  ddp 板题。

  考察选手能否熟练地敲打 ddp 板子。

Code

#include <bits/stdc++.h>
using namespace std;
typedef bool boolean; const int N = 1e5 + 5; #define ll long long template <typename T>
T smin(T a, T b) {
return min(a, b);
}
template <typename T, typename ...Q>
T smin(T a, const Q &...args) {
return min(a, smin(args...));
} const ll llf = 1e12; typedef class Data {
public:
ll a[2][2]; Data() { }
Data(ll x) {
a[0][0] = llf, a[0][1] = 0;
a[1][0] = x, a[1][1] = x;
}
Data(ll x, ll y, ll z, ll w) {
a[0][0] = x, a[0][1] = y;
a[1][0] = z, a[1][1] = w;
} Data get() {
ll g = min(a[0][0], a[0][1]);
ll f = min(a[1][0], a[1][1]);
g = min(g, f);
return Data(f, f, g, g);
}
ll* operator [] (int p) {
return a[p];
}
friend Data operator * (Data a, Data b) {
Data rt;
rt[0][0] = min(a[0][0] + b[0][0], a[0][1] + b[1][0]);
rt[0][1] = min(a[0][0] + b[0][1], a[0][1] + b[1][1]);
rt[1][0] = min(a[1][0] + b[0][0], a[1][1] + b[1][0]);
rt[1][1] = min(a[1][0] + b[0][1], a[1][1] + b[1][1]);
return rt;
}
friend Data operator + (Data a, Data b) {
Data rt;
rt[0][0] = a[0][0] + b[0][0];
rt[0][1] = a[0][1] + b[0][1];
rt[1][0] = a[1][0] + b[1][0];
rt[1][1] = a[1][1] + b[1][1];
return rt;
}
friend Data operator - (Data a, Data b) {
Data rt;
rt[0][0] = a[0][0] - b[0][0];
rt[0][1] = a[0][1] - b[0][1];
rt[1][0] = a[1][0] - b[1][0];
rt[1][1] = a[1][1] - b[1][1];
return rt;
}
ll get_ans() {
ll rt = smin(a[0][0], a[0][1], a[1][0], a[1][1]);
return (rt >= llf) ? (-1) : (rt);
}
} Data; typedef class SegTreeNode {
public:
Data d;
SegTreeNode *fa;
SegTreeNode *l, *r; void push_up() {
d = l->d * r->d;
}
} SegTreeNode; typedef class Chain {
public:
SegTreeNode *st;
int len, top; Chain() { }
Chain(int top); void update(int, Data, Data);
} Chain; SegTreeNode pool[N << 1];
SegTreeNode *_top = pool; int S[N];
Data dat[N]; int tp;
Chain *ch[N];
SegTreeNode *tr[N]; void build(SegTreeNode*& p, int l, int r) {
p = _top++;
if (l == r) {
p->d = dat[S[l]];
tr[S[l]] = p;
return;
}
int mid = (l + r) >> 1;
build(p->l, l, mid);
build(p->r, mid + 1, r);
p->push_up();
p->l->fa = p;
p->r->fa = p;
} Chain::Chain(int top) : st(_top), len(tp), top(top) {
reverse(S + 1, S + tp + 1);
build(st, 1, len);
for (int i = 1; i <= len; i++) {
ch[S[i]] = this;
}
if (top) {
dat[top] = dat[top] + st->d.get();
}
} void Chain::update(int x, Data old_d, Data new_d) {
Data nold_d = st->d.get();
tr[x]->d = tr[x]->d - old_d + new_d;
for (SegTreeNode *p = tr[x]->fa; p; p = p->fa)
p->push_up();
if (top) {
ch[top]->update(top, nold_d, st->d.get());
}
} int n, m;
int p[N];
int sz[N], zson[N];
vector<int> G[N]; void dfs1(int p, int fa) {
int mx = 0, &id = zson[p];
sz[p] = 1;
for (auto e : G[p]) {
if (e ^ fa) {
dfs1(e, p);
sz[p] += sz[e];
if (mx < sz[e]) {
mx = sz[e];
id = e;
}
}
}
} void dfs2(int p, int fa) {
if (zson[p]) {
for (auto e : G[p]) {
if ((e ^ fa) && (e ^ zson[p])) {
dfs2(e, p);
new Chain(p);
}
}
dfs2(zson[p], p);
} else {
tp = 0;
}
S[++tp] = p;
} int main() {
freopen("defense.in", "r", stdin);
freopen("defense.out", "w", stdout);
scanf("%d%d%*s", &n, &m);
for (int i = 1, x; i <= n; i++) {
scanf("%d", &x);
dat[i] = x;
p[i] = x;
}
for (int i = 1, u, v; i < n; i++) {
scanf("%d%d", &u, &v);
G[u].push_back(v);
G[v].push_back(u);
}
dfs1(1, 0);
dfs2(1, 0);
new Chain(0);
int a, x, b, y;
while (m--) {
scanf("%d%d%d%d", &a, &x, &b, &y);
Data olda = p[a], oldb = p[b];
Data na = Data(llf * (1 - x)), nb = Data(llf * (1 - y));
ch[a]->update(a, olda, na);
ch[b]->update(b, oldb, nb);
ll ans = ch[1]->st->d.get_ans() + olda[1][0] * x + oldb[1][0] * y;
ch[a]->update(a, na, olda);
ch[b]->update(b, nb, oldb);
printf("%lld\n", ans);
}
return 0;
}

NOIP 2018 简要题解的更多相关文章

  1. JXOI 2018 简要题解

    目录 「JXOI2018」游戏 题意 题解 代码 「JXOI2018」守卫 题意 题解 代码 「JXOI2018」排序问题 题意 题解 代码 总结 「JXOI2018」游戏 题意 可怜公司有 \(n\ ...

  2. NOIP 2018 day1 题解

    今年noip的题和去年绝对是比较坑的题了,但是打好的话就算是普通水准也能350分以上吧. t1: 很显然这是一个简单的dp即可. #include<iostream> #include&l ...

  3. codechef February Challenge 2018 简要题解

    比赛链接:https://www.codechef.com/FEB18,题面和提交记录是公开的,这里就不再贴了 Chef And His Characters 模拟题 Chef And The Pat ...

  4. HNOI 2018 简要题解

    寻宝游戏 毒瘤题. 估计考试只会前30pts30pts30pts暴力然后果断走人. 正解是考虑到一个数&1\&1&1和∣0|0∣0都没有变化,&0\&0& ...

  5. NOIP 2018旅行题解

    从佳木斯回来刷一刷去年没A的题 题目描述 小 Y 是一个爱好旅行的 OIer.她来到 X 国,打算将各个城市都玩一遍. 小Y了解到, X国的 nn 个城市之间有 mm 条双向道路.每条双向道路连接两个 ...

  6. Noip 2014酱油记+简要题解

    好吧,day2T1把d默认为1也是醉了,现在只能期待数据弱然后怒卡一等线吧QAQ Day0 第一次下午出发啊真是不错,才2小时左右就到了233,在车上把sao和fate补掉就到了= = 然后到宾馆之后 ...

  7. Tsinghua 2018 DSA PA2简要题解

    反正没时间写,先把简要题解(嘴巴A题)都给他写了记录一下. upd:任务倒是完成了,我也自闭了. CST2018 2-1 Meteorites: 乘法版的石子合并,堆 + 高精度. 写起来有点烦貌似. ...

  8. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  9. CQOI2018简要题解

    CQOI2018简要题解 D1T1 破解 D-H 协议 题意 Diffie-Hellman 密钥交换协议是一种简单有效的密钥交换方法.它可以让通讯双方在没有事先约定密钥(密码)的情况下,通过不安全的信 ...

随机推荐

  1. jQuery 源码解析(三) pushStack方法 详解

    该函数用于创建一个新的jQuery对象,然后将一个DOM元素集合加入到jQuery栈中,最后返回该jQuery对象,有三个参数,如下: elems Array类型 将要压入 jQuery 栈的数组元素 ...

  2. python threading ThreadPoolExecutor源码解析

    future: 未来对象,或task的返回容器 1. 当submit后: def submit(self, fn, *args, **kwargs): with self._shutdown_lock ...

  3. React及Nextjs相关知识点小结

    React及Nextjs知识点小结 函数式组件和类组件区别是什么 1.函数式组件是用于创建无状态的组件,组件不会被实例化,无法访问this中的对象,无法访问生命周期方法,是无副作用的,相比于类组件函数 ...

  4. 解决移动端ios下overflow-x scroll无法隐藏滚动条的问题

    这次有个需求是在web首页添加分类菜单,一共是8个分类,在移动端水平展示,可以左右滚动. 最后在手机上微信浏览器看到是有个滚动条,非常影响美观. 主要通过以下代码实现水平滚动 white-space: ...

  5. 【UOJ#60】【UR #5】怎样提高智商

    [UOJ#60][UR #5]怎样提高智商 题面 UOJ 题解 首先猜猜答案是\(4*3^{n-1}\).即前面的选啥都行,后面的搞搞就行了. 而打表(看题解),可以知道答案就是这个,并且每个问题都是 ...

  6. 利用Chrome开发者工具功能进行网页整页截图的方法

    第一步:打开chrome开发者工具. 打开你想截图的网页,然后按下 F12(macOS 是 option + command + i)调出开发者工具,接着按「Ctrl + Shift + P」(mac ...

  7. PDO封装增删改查

    <?phpclass db{ public $table=null; public $pdo; public $where=null; //where 条件 public $field=null ...

  8. 虚拟机中安装Kali遇到的问题及解决方法

    title: 虚拟机中安装Kali遇到的问题及解决方法 date: 2018-11-25 12:25:43 tags: 安全 --- 关于Kali版本选择 kail官方下载页面 虚拟机中当然就下载虚拟 ...

  9. maven 学习---Maven构建生命周期

    构建生命周期是一组阶段的序列(sequence of phases),每个阶段定义了目标被执行的顺序.这里的阶段是生命周期的一部分. 举例说明,一个典型的 Maven 构建生命周期是由以下几个阶段的序 ...

  10. maven 学习---定制库到Maven本地资源库

    这里有2个案例,需要手动发出Maven命令包括一个 jar 到 Maven 的本地资源库. 要使用的 jar 不存在于 Maven 的中心储存库中. 您创建了一个自定义的 jar ,而另一个 Mave ...