Codeforces Round 917 (Div. 2) A~F

news2024/11/30 2:38:23

A.Least Product(思维)

题意:

给出一个数组 a 1 , a 2 , . . . , a n a_1, a_2, ..., a_n a1,a2,...,an,你可以进行若干次以下操作:

  • 选择数组中的一个元素 a i a_i ai,将这个数字修改为 0 ∼ a i 0 \sim a_i 0ai之间的任意数字。

问,最少需要多少次操作可以使得 ∏ i = 1 n a i \prod\limits_{i = 1}^{n}a_i i=1nai的结果最小,并输出对应的操作。

分析:

可以将问题分成两种情况:

  • 存在 a i = 0 a_i = 0 ai=0或负数的出现次数为奇数,此时无论进行任何操作都无法使结果变得更小,输出0

  • 其他情况,由于数字只能被修改到 0 ∼ a i 0 \sim a_i 0ai之间,那么正负数是无法互相转换的,因此,当结果为正数时,任选一个 a i a_i ai,将其修改为 0 0 0,就能获得最小的结果

代码:

#include<bits/stdc++.h>

using namespace std;
typedef long long LL;
const int MAXN = 3e5 + 5e2;


void solve() {
    int n;
    cin >> n;
    int zero = 0, sign = 0;
    for (int i = 1; i <= n; i++) {
        int a;
        cin >> a;
        if (a == 0) {
            zero = 1;
        } else if (a < 0) {
            sign++;
        }
    }
    if (zero || sign % 2 == 1) cout << 0 << endl;
    else {
        cout << 1 << endl;
        cout << "1 0" << endl;
    }
}

int main() {
    int Case;
    cin >> Case;
    while (Case--) {
        solve();
    }
    return 0;
}

B.Erase First or Second Letter(思维)

题意:

给出一个长度为 n n n的字符串 s s s,你可以进行若干次以下操作:

  • 移除第一个字符

  • 移除第二个字符

问:经过若干次操作后,可以获得多少种不同的非空字符串?

分析:

将字符串划分为前后两部分,枚举两部分的分界点,每次枚举完分界点后,将后半部分视为不进行修改的部分,仅会对前半部分进行操作,那么由于每次枚举的后半部分均不同,为了保证方案的独立性,前半部分仅保留一个字符,那么此时的方案数就是前半部分中包含的不同字母的数量。

使用计数数组或set动态记录不同字符数量,每次枚举分界点后更新前半部分字符种类并记录到答案中即可。

代码:

#include<bits/stdc++.h>

using namespace std;
typedef long long LL;
const int MAXN = 3e5 + 5e2;

int vis[30];

void solve() {
    memset(vis, 0, sizeof (vis));
    int n;
    string s;
    cin >> n >> s;
    int cnt = 0, ans = 0;
    for (int i = 0; i < n; i++) {
        vis[s[i] - 'a']++;
        if (vis[s[i] - 'a'] == 1) cnt++;
        ans += cnt;
    }
    cout << ans << endl;
}

int main() {
    int Case;
    cin >> Case;
    while (Case--) {
        solve();
    }
    return 0;
}

C.Watering an Array(枚举)

题意:

给出一个长度为 n n n的数组 a a a,你将在接下来的 d d d天里每天选择执行以下两个操作之一:

  • 给所有的 a 1 , a 2 , . . . , a b i a_1, a_2, ..., a_{b_i} a1,a2,...,abi加上一,其中 b i b_i bi为题目给出的第 i i i天的操作数。

  • 数组 a a a a i = i a_i = i ai=i的数量就是你本轮获得的得分,然后将 a a a数组所有元素修改为 0 0 0

问:最多可以获得多少得分?

Tips:由于天数较多,因此 b b b数组采用 b = [ v 1 , v 2 , . . . , v k , v 1 , v 2 , . . . , v k , . . . ] b = [v_1, v_2, ..., v_k, v_1, v_2, ..., v_k, ...] b=[v1,v2,...,vk,v1,v2,...,vk,...]的形式给出。

分析:

如果数组 a a a开始全部为 0 0 0,那么最优策略就是操作 1 , 2 1,2 1,2轮流进行,可以获得 ⌊ d 2 ⌋ \lfloor\frac{d}{2}\rfloor 2d点得分(注意:开始时若 a 1 ≥ 1 a_1 \ge 1 a11,则需要使用一次操作 2 2 2 a 1 a_1 a1修改为 0 0 0,此时得分为 ( ⌊ d − 1 2 ⌋ + 开始时数组元素可以产生的得分 (\lfloor\frac{d - 1}{2}\rfloor + \text{开始时数组元素可以产生的得分} (⌊2d1+开始时数组元素可以产生的得分)。

而由于初始的数组是包含初始数字的,且长度为 n n n的数组最多可以产生 n n n点得分,因此,只需要在 2 × n − 1 2 \times n - 1 2×n1的操作次数内均有可能超过循环操作获取的 n n n点固定得分。

枚举第一次进行操作 2 2 2前会进行多少次操作 1 1 1,每次遍历数组统计得分,剩余的操作次数使用最优策略进行。记录过程中最大的得分即可。

坑点

既然获取的长度为 n n n的数字最高可以产生 n n n点得分,那么只枚举 n n n次操作是否就够了?

反例:

原数组为 2 , 1 , 2 , . . . , n − 1 2, 1, 2, ..., n - 1 2,1,2,...,n1,给出的 b b b数组为 [ 1 , 1 , . . . , 1 , n ] [1, 1, ..., 1, n] [1,1,...,1,n],其中 b i = n b_i = n bi=n前有 ( 2 × n ) − 4 (2 \times n) - 4 (2×n)4个1,此时 d = 2 × n d = 2 \times n d=2×n

可以发现,枚举 0 ∼ n 0 \sim n 0n次操作 1 1 1,均无法产生额外得分,此时获得的最高总分为 ⌊ d − 1 2 ⌋ = n − 1 \lfloor \frac{d - 1}{2} \rfloor = n - 1 2d1=n1,而依次使用 ( 2 × n ) − 3 (2 \times n) - 3 (2×n)3次操作 1 1 1,再进行操作 2 2 2,可以获得 n − 1 n - 1 n1点得分,此时还剩下两次操作,还可以继续一次最优策略,最后得分为 n n n

代码:

#include<bits/stdc++.h>

using namespace std;
typedef long long LL;
const int MAXN = 3e5 + 5e2;

LL a[MAXN], b[MAXN];

void solve() {
    LL n, k, d;
    cin >> n >> k >> d;
    LL ans = 0;
    for (int i = 1; i <= n; i++) cin >> a[i];
    for (int i = 0; i < k; i++) cin >> b[i];
    for (int i = 0; i <= 2 * n && i < d; i++) {
        LL cnt = 0;
        for (int j = 1; j <= n; j++) if (a[j] == j) cnt++;
        ans = max(ans, cnt + (d - i - 1) / 2);
        for (int j = 1; j <= b[i % k]; j++) {
            if (a[j] == j) cnt--;
            a[j]++;
            if (a[j] == j) cnt++;
        }
    }
    cout << ans << endl;
}

int main() {
    int Case;
    cin >> Case;
    while (Case--) {
        solve();
    }
    return 0;
}

D.Yet Another Inversions Problem(树状数组+逆序对)

题意:

给定一个由 1 1 1 2 n − 1 2n-1 2n1的奇数组成的排列 p 0 , p 1 , … , p n − 1 p_0,p_1,…,p_{n−1} p0,p1,,pn1和一个由 0 0 0 k − 1 k-1 k1的整数组成的排列 q 0 , q 1 , … , q k − 1 q_0,q_1,…,q_{k−1} q0,q1,,qk1。定义长度为 n k nk nk的数组 a 0 , a 1 , … , a n k − 1 a_0,a_1,…,a_{nk−1} a0,a1,,ank1如下:对于所有 0 ≤ i < n 0 \le i \lt n 0i<n和所有 0 ≤ j < k 0 \le j \lt k 0j<k,有 a i ⋅ k + j = p i ⋅ 2 q j a_{i⋅k+j}=p_i⋅2^{q_j} aik+j=pi2qj。例如,如果 p = [ 3 , 5 , 1 ] p=[3,5,1] p=[3,5,1] q = [ 0 , 1 ] q=[0,1] q=[0,1],那么 a = [ 3 , 6 , 5 , 10 , 1 , 2 ] a=[3,6,5,10,1,2] a=[3,6,5,10,1,2]。所有数组都是从零开始索引的。注意,数组 a a a中每个元素是唯一确定的。计算数组 a a a中逆序对 ( i , j ) ( 0 ≤ i < j < n k ) (i,j)(0 \le i < j < nk) (i,j)(0i<j<nk)的数量,结果对 998244353 998244353 998244353取模。

分析:

对于同一个 a i a_i ai,逆序对个数仅取决于 q {q} q的逆序对个数。

考虑用树状数组求逆序对个数的过程。对该过程稍作修改,可以得到下面的算法:
对于 a i a_i ai,大小在 ( a i , 2 a i ) (a_i,2a_i) (ai,2ai)之间的数而言, a i ⋅ 2 p j a_i⋅2^{p_j} ai2pj与这些数能够形成的逆序对为 ( a i ⋅ 2 p j , a x ⋅ 2 p j − 1 ) (a_i⋅2^{p_j},a_x⋅2^{p_j-1}) (ai2pj,ax2pj1), ( a i ⋅ 2 p j , a x ⋅ 2 p j − 2 ) (a_i⋅2^{p_j},a_x⋅2^{p_j-2}) (ai2pj,ax2pj2)…… ( a i ⋅ 2 p j , a x ⋅ 2 0 ) (a_i⋅2^{p_j},a_x⋅2^0) (ai2pj,ax20),共有 p j p_j pj个, a i a_i ai与这些数所能形成的逆序对数量为 ∑ i = 0 k p i = ( 0 + k − 1 ) × k 2 \sum\limits_{i=0}^{k}p_i=(0+k-1)\times\frac{k}{2} i=0kpi=(0+k1)×2k。同理对大小在 ( 2 a i , 4 a i ) (2a_i,4a_i) (2ai,4ai)的数而言, a i a_i ai与这些数所能形成的逆序对数量为 ∑ i = 0 k p i = ( 0 + k − 2 ) × k − 1 2 \sum\limits_{i=0}^{k}p_i=(0+k-2)\times\frac{k-1}{2} i=0kpi=(0+k2)×2k1,如此不断向上倍增求答案,直到上限。

相反的,对于大小在 ( a i 2 , a i ) (\frac{a_i}{2},a_i) (2ai,ai)之间的数,可以按相同的方式考虑,如此不断向下除二求答案,直到下限。

代码:

#include <bits/stdc++.h>

using namespace std;
typedef long long LL;
const LL mod = 998244353;
const LL N = 5e5;

struct BIT {
    LL n;
    vector<LL> tr;

    BIT(LL n) : n(n), tr(n + 1, 0) {
    }

    LL lowbit(LL x) {
        return x & -x;
    }

    void modify(LL x, LL m) {
        for (LL i = x; i <= n; i += lowbit(i)) {
            tr[i] += m;
        }
    }

    void modify(LL l, LL r, LL m) {
        modify(l, m);
        modify(r + 1, -m);
    }

    LL query(LL x) {
        LL res = 0;
        for (LL i = x; i; i -= lowbit(i))
            res += tr[i];
        return res;
    }

    LL query(LL x, LL y) {
        return query(y) - query(x);
    }
};

LL tmp[N];

LL merge_sort(LL q[], LL l, LL r) {
    if (l >= r)
        return 0;

    LL mid = (l + r) >> 1;
    LL res = merge_sort(q, l, mid) + merge_sort(q, mid + 1, r);
    LL i = l, j = mid + 1, k = 0;
    while (i <= mid && j <= r) {
        if (q[i] <= q[j]) tmp[k++] = q[i++];
        else {
            res += mid - i + 1;
            tmp[k++] = q[j++];
        }
    }

    while (i <= mid)
        tmp[k++] = q[i++];
    while (j <= r)
        tmp[k++] = q[j++];

    for (LL i = l, j = 0; i <= r; i++, j++)
        q[i] = tmp[j];

    return res;
}

void solve() {
    LL n, k;
    cin >> n >> k;
    BIT num(4 * n + 5), sum(k + 5);
    LL a[n], b[k];
    for (LL i = 0; i < n; i++) {
        cin >> a[i];
        num.modify(a[i], 1);
    }
    for (LL i = 0; i < k; i++) {
        cin >> b[i];
    }
    LL ans = merge_sort(b, 0, k - 1);
    ans *= n;
    ans %= mod;
    for (LL i = 0; i < n; i++) {
        LL x = a[i];
        LL cnt = 1;
        while (x < 2 * n) {
            LL t = x * 2;
            LL nn = num.query(x, t);
            if (nn == 0) {
                x = t;
                cnt++;
                continue;
            }
            LL end = max(1LL * 0, k - cnt);
            LL ns = (1 + end) * end / 2;
            ans += ns * nn;
            ans %= mod;
            x = t;
            cnt++;
        }
        x = a[i];
        cnt = 1;
        while (1) {
            if (x == 1)
                break;
            LL t = (x + 1) / 2;
            LL nn = num.query(t - 1, x - 1);
            if (nn == 0) {
                x = t;
                cnt++;
                continue;
            }
            LL st = min(k, cnt);
            LL cntt = k - st + 1;
            LL res = k - cntt;
            LL ns = k * res + (st + k) * cntt / 2;
            ans += nn * ns;
            ans %= mod;;
            x = t;
            cnt++;
        }
        num.modify(a[i], -1);
    }
    cout << ans << endl;
}

int main() {
    LL t = 1;
    cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}

E.Construct Matrix(构造)

题意:

给定一个偶数 n n n和一个整数 k k k。构造一个大小为 n × n n×n n×n的矩阵,由数字 0 0 0 1 1 1组成,使其满足以下条件,或者输出不可能

所需满足的条件:

  • 矩阵中所有数的和正好是 k k k;
  • i i i行中所有数字按位异或对每个 i i i都是相同的;
  • j j j列中所有数字按位异或对每个 j j j都是相同的。

分析:

首先,因为所有列的 X O R XOR XOR X O R XOR XOR显然为 0 0 0(因为 n n n为偶),因此所有数的 X O R XOR XOR也为 0 0 0,故 k k k不可能为奇数。

如果 k k k 4 4 4的倍数,这种情况是比较简单的。易知一个 2 x 2 2x2 2x2的全 1 1 1矩阵可以在不破坏原矩阵的情况下被添加进去,那么不断添加这样的矩阵就可以了。

如果 k ≡ 2 ( m o d 4 ) k≡2(mod4) k2(mod4),不妨假设 k ≤ n 2 2 k \le \frac{n^2}{2} k2n2,如果不满足,令 k ′ = n 2 − k k^{'}=n^2-k k=n2k,构造完再全部取反即可。当 k = 2 k=2 k=2时,显然不存在满足条件的矩阵。当 k = 6 k=6 k=6时,可以构造出一个 3 × 3 3 \times 3 3×3的矩阵,如下:

1 1 0
1 0 1
0 1 1

k ≥ 6 k≥6 k6时,考虑将上面这个矩阵放在前 4 4 4 4 4 4列的位置,然后其他位置再通过添加 2 × 2 2\times2 2×2的全 1 1 1矩阵,即可构造满足要求的矩阵。

代码:

#include <bits/stdc++.h>

using namespace std;
typedef long long LL;
const int N = 1005;
int T, n, k;
bool mat[N][N];
int draw_first2block = 0;

void reset() {
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= n; ++j)
            mat[i][j] = 0;
    draw_first2block = 0;
}

void draw() {
    mat[1][1] = mat[1][2] = mat[2][1] = mat[2][3] = mat[3][2] = mat[3][3] = 1;
    draw_first2block = 1;
}

void solve(int cnt) {
    int i = 1, j = 0;
    while (cnt) {
        if (++j > n / 2) {
            ++i;
            j = 1;
        }
        if (i <= 2 && j <= 2 && draw_first2block)
            continue;
        --cnt;
        mat[i * 2][j * 2] = mat[i * 2 - 1][j * 2] = mat[i * 2][j * 2 - 1] = mat[i * 2 - 1][j * 2 - 1] = 1;
    }
}

void reverse() {
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= n; ++j)
            mat[i][j] ^= 1;
}

int main() {
    cin >> T;
    while (T--) {
        cin >> n >> k;
        if (n == 2 && k == 2) {
            cout << "Yes\n0 1\n1 0\n";
            continue;
        }
        bool check = false;
        if (k % 4 == 0) {
            check = true;
            reset();
            solve(k / 4);
        } else {
            bool reversed = false;
            if (k * 2 > n * n) {
                reversed = true;
                k = n * n - k;
            }
            if (k % 4 == 2 && k != 2) {
                check = true;
                reset();
                draw();
                solve((k - 6) / 4);
                if (reversed)
                    reverse();
            }
        }
        if (check) {
            cout << "Yes\n";
            for (int i = 1; i <= n; ++i) {
                for (int j = 1; j <= n; ++j)
                    cout << (mat[i][j] ? '1' : '0') << " \n"[j == n];
            }
        } else cout << "No\n";
    }
    return 0;
}

F.Construct Tree(bitset)

题意:

给定一个整数数组 l 1 , l 2 , … , l n l_1,l_2,…,l_n l1,l2,,ln和一个整数 d d d。是否能构造一棵满足以下三个条件的树:

  • 该树包含 n + 1 n+1 n+1个节点。
  • i i i条边的长度等于 l i l_i li
  • 该树的(加权)直径等于 d d d

分析:

考虑形式化地描述这个问题。先把 l l l排序。然后相当于是否存在一个 1 , 2 , … , n {1,2,…,n} 1,2,,n的子集S,使得 ∑ i ∈ S l i = d \sum\limits_{i∈S}{l_i}=d iSli=d ∃ T ⊆ S ∃T⊆S TS m a x ( l i ) ≤ m i n ( ∑ i ∈ T l i , ∑ i ∈ S ∧ i ∉ T l i ) max(l_i)≤min(\sum\limits_{i\in T}{l_i},\sum\limits_{i\in S∧i\notin T}{l_i}) max(li)min(iTli,iSi/Tli)

注意到若 n − 1 ∈ S ∧ n ∈ S n−1∈S∧n∈S n1SnS,则第二个条件一定满足,让 n − 1 ∈ T n−1∈T n1T n ∉ T n \notin T n/T即可。所以如果 l 1 , l 2 … l n − 2 l_1,l_2…l_n-2 l1,l2ln2能凑出来 d − a n − 1 − a n d−a_{n−1}−a_n dan1an就可行。

然后依次讨论 m a x ( i ) = n − 1 max(i)=n−1 max(i)=n1 i ∉ S i \notin S i/S)或 n n n的情况:

  • m a x ( i ) = n − 1 max(i)=n−1 max(i)=n1 i ∉ S i \notin S i/S),那么 n ∈ S n∈S nS。若前 n − 2 n−2 n2个元素能凑出来和为 x x x d − x − a n d−x−a_n dxan的两个不相交集合,且 a n − 1 ≤ m i n ( x + a n , d − x − a n ) a_{n-1}≤min(x+a_n,d−x−a_n) an1min(x+an,dxan)$就可行。
  • m a x ( i ) = n max(i)=n max(i)=n i ∉ S i \notin S i/S),那么若前 n − 1 n−1 n1个元素能凑出来和为 x x x d − x d−x dx的两个不相交集合,且 a n ≤ m i n ( x , d − x ) a_n≤min(x,d−x) anmin(x,dx)就可行。

使用 b i t s e t bitset bitset进行优化。

代码:

#include <bits/stdc++.h>

using namespace std;
typedef long long LL;
const int maxn = 2005;

int n, m, a[maxn];
bitset<maxn> f[maxn], g;

void solve() {
    cin >> n >> m;
    for (int i = 1; i <= n; ++i) {
        cin >> a[i];
    }
    sort(a + 1, a + n + 1);
    for (int i = 0; i <= m; ++i) {
        f[i].reset();
    }
    g.reset();
    f[0].set(0);
    g.set(0);
    for (int i = 1; i < n; ++i) {
        if (i == n - 1) {
            if (a[n - 1] + a[n] <= m && g.test(m - a[n - 1] - a[n])) {
                cout << "Yes" << endl;
                return;
            }
            for (int j = 0; j <= m - a[n]; ++j) {
                if (a[i] <= min(j + a[n], m - a[n] - j) && f[j].test(m - j - a[n])) {
                    cout << "Yes" << endl;
                    return;
                }
            }
        }
        for (int j = m; ~j; --j) {
            f[j] |= (f[j] << a[i]);
            if (j >= a[i]) {
                f[j] |= f[j - a[i]];
            }
        }
        g |= (g << a[i]);
    }
    for (int i = a[n]; i <= m - a[n]; ++i) {
        if (f[i].test(m - i)) {
            cout << "Yes" << endl;
            return;
        }
    }
    cout << "No" << endl;
}

int main() {
    int T = 1;
    cin >> T;
    while (T--) {
        solve();
    }
    return 0;
}

学习交流

以下为学习交流QQ群,群号: 546235402,每周题解完成后都会转发到群中,大家可以加群一起交流做题思路,分享做题技巧,欢迎大家的加入。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1348356.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java servlet软件缺陷库管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java servlet软件缺陷库管理系统是一套完善的java web信息管理系统 系统采用serlvetdaobean&#xff08;mvc模式)&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOM…

约翰瑟尔的故事

约翰瑟尔的故事 你即将看到的是“瑟尔效能机”创始者&#xff0c;约翰瑟尔的故事 据瑟尔原话&#xff0c;该装置会是通向自由能源的关键 “他”拥有“会飞”等不可思议的特性相关说法还有待证实&#xff0c;此记录篇仅为告知观者 制片方对瑟尔技术持中立态度 以下是我们所搜集…

【最优化】从图形理解单纯形法——不用单纯形表来解线性规划问题 / 单纯形表的本质与直觉

66ccff 单纯形法是解线性规划问题&#xff08;LP&#xff09;的最经典方法&#xff0c;很多人都了解单纯形法是用单纯形表来进行求解的&#xff0c;但是不了解背后的原理。 这篇博文介绍单纯型表的直觉。 需要的前置知识 你需要了解&#xff1a; 单纯形法实际上是在“爬山”…

劫持 PE 文件:新建节表并插入指定 DLL 文件

PE格式简介 PE(Portable Executable)格式&#xff0c;是微软Win32环境可移植可执行文件(如exe、dll、vxd、sys和vdm等)的标准文件格式。PE格式衍生于早期建立在VAX(R)VMS(R)上的COFF(Common Object File Format)文件格式。 Portable 是指对于不同的Windows版本和不同的CPU类型上…

构建高效数据流转的 ETL 系统:数据库 + Serverless 函数计算的最佳实践

作者&#xff1a;柳下 概述 随着企业规模和数据量的增长&#xff0c;数据的价值越来越受到重视。数据的变化和更新变得更加频繁和复杂&#xff0c;因此及时捕获和处理这些变化变得至关重要。为了满足这一需求&#xff0c;数据库 CDC&#xff08;Change Data Capture&#xff…

深入解析 可空值类型

前言&#xff1a; 问&#xff1a;为什么会有可空值类型的诞生&#xff1f; 答&#xff1a;应对在某些特定场景中获取的信息可能是不完整的。 C# 1中的可空值类型 在C#1中没有对应的表示Null值的方法。当时普遍都是采用其他方式。第一种在数据缺失的情况下给其一个默认值。第…

论文阅读: AAAI 2022行人重识别方向论文-PFD_Net

本篇博客用于记录一篇行人重识别方向的论文所提出的优化方法《Pose-Guided Feature Disentangling for Occluded Person Re-identification Based on Transformer》&#xff0c;论文中提出的PDF_Net模型的backbone是采用《TransReID: Transformer-based Object Re-Identificati…

【JavaWeb学习笔记】17 - ThreadLocal

项目代码 https://github.com/yinhai1114/JavaWeb_LearningCode/tree/main/threadlocal/src/com/yinhai/thread 目录 项目代码 一、什么是ThreadLocal? 二、ThreadLocal快速入门 三、源码解读 一、什么是ThreadLocal? 1. ThreadLocal的作用&#xff0c;可以实现在同一个线…

打破成本壁垒,免费SSL证书为中小企业保驾护航

HTTPS&#xff0c;这个曾经看似遥远的技术词汇&#xff0c;如今已与我们每个人的网络生活息息相关。而实现HTTPS加密传输的关键一环——SSL证书&#xff0c;正以其独特的安全性能&#xff0c;为网站筑起一道坚实的防护墙。更令人惊喜的是&#xff0c;免费SSL证书服务已经到来&a…

SpringBoot+MyBatis+MySQL增删改查(一)(IDEA创建SpringBoot项目)

使用IDEA创建SpringBootMyBatisMySQL进行项目搭建 1.创建项目 文件 --> 新建 --> 项目 填写项目基本信息 项目名称、存放位置、项目语言、项目类型、JDK版本、打包 Web选项选择Spring Web SQL选项中勾选JDBC API、MyBatis Framework、MySQl Driver选项 至此一个空项目…

【深度学习:LSTM Networks】了解 LSTM 网络

【深度学习&#xff1a;LSTM Networks】了解 LSTM 网络 循环神经网络长期依赖问题 相关知识传送门&#xff1a; LSTM 网络LSTM 背后的核心理念LSTM 分步演练长短期记忆的变体Conclusion 循环神经网络 人类在思考时并不是每时每刻都从头开始。当你阅读这篇文章时&#xff0c;你…

单点登录的三种模式

介绍 单点登录存在的意义在于&#xff0c;比如公司里有多个系统&#xff0c;我只想登录一次&#xff0c;便可以访问公司的多个子系统 单点登录有很多模式&#xff0c;目前已知三种模式 1、cookie session模式 2、token模式 3、token refresh_token模式 Cookie Session模式…

基于OpenCv的车道检测

项目背景和步骤 车道检测是自动驾驶领域不可或缺的一环 具体步骤如下&#xff1a; 一、将图像灰度化&#xff0c;并进行适度的高斯滤波&#xff0c;剔除干扰 二、利用Canny边缘检测&#xff0c;检测出车道和其它物体的边缘 三、使用ROI区域截取&#xff0c;截取需要的部分&a…

1.1 FMEA目的

文章目录 1.1 目的和说明 潜在失效模式和影响分析&#xff08;FMEA&#xff09;是美国汽车工业行动集团&#xff08;AIAG&#xff09;和德国汽车工业联合会&#xff08;VDA&#xff09;的整车厂&#xff08;OEM&#xff09;和一级供应商成员合作逾三年的成果。FMEA手册已进行改…

看懂基本的电路原理图(入门)

文章目录 前言一、二极管二、电容三、接地一般符号四、晶体振荡器五、各种符号的含义六、查看原理图的顺序总结 前言 电子入门&#xff0c;怎么看原理图&#xff0c;各个图标都代表什么含义&#xff0c;今天好好来汇总一下。 就比如这个电路原理图来说&#xff0c;各个符号都…

10万蜜蜂同屏作战 UnityECS蜜蜂大战项目实践(附实现前后对比)

本文禁止转载 本项目是Unity官方推荐的ECS入门训练中的蜜蜂大战项目 知乎文章同步链接 浅谈ECS工作栈 提到ECS就不得不提JobSystem和Burst编译器&#xff0c;三者共同组成了Unity面向数据的DOTS&#xff08;Data-Oriented Technology Stack&#xff09;框架。 ECS&#xf…

Linux-------rm命令超详解(狠狠爱住)

目录 rm 命令用于在Linux系统中删除指定的文件或目录 基本语法&#xff1a; 常用选项&#xff1a; 示例用法&#xff1a; 放在文末的话&#xff1a; 补充&#xff1a; rm 命令用于在Linux系统中删除指定的文件或目录 基本语法&#xff1a; rm [选项] 文件名/目录名 常用…

Eclipse汉化

目录 一、首先电脑已经下载好Eclipse 二、打开Eclipse Babel 三、打开Eclipse 1、工具栏——>Help——> Install New Software 2、 点击Add 3、添加复制的链接&#xff0c;点击Add 4、等待加载 5、勾选Chinese&#xff08;Simpliied&#xff09;&#xff0c;而后Next&…

超市订单管理系统

比较简单的超市订单管理系统

在Google Colab中调用Gemini的API实现智能问答

一、引言 Google终于放出大招&#xff0c;在2023年12月6日正式推出规模最大、功能最强大的人工智能模型Gemini&#xff0c;对标ChatGPT&#xff0c;甚至有要赶超ChatGPT-4.0的节奏。 相比之前的Bard&#xff0c;Gemini的文本理解能力、图片识别能力和语义抽取能力大大增强&am…