Codeforces Round 950 (Div. 3) A~F

news2024/12/25 9:28:33

A.Problem Generator(遍历)

题意:

弗拉德计划在下个月举行 m m m轮比赛。每轮比赛应包含一个难度为"A"、“B”、“C”、“D”、“E”、"F"和"G"的问题。

弗拉德已经有了一个 n n n个问题的问题库,其中第 i i i个问题的难度为 a i a_i ai。这些问题可能不够多,所以他可能需要再想出一些问题。

弗拉德想要尽可能少地提出问题,所以他要求你找出他需要提出的问题的最小数量,以便举行 m m m轮比赛。

例如,如果 m = 1 m=1 m=1 n = 10 n=10 n=10 a = a= a='BGECDCBDEDBGECDCBDED",那么他需要提出两道难题:一道难度为"A",一道难度为"F"。

分析:

每个比赛都应该包含"A"、“B”、“C”、“D”、“E”、"F"和"G"的问题。遍历数据,暴力模拟统计需要加入的题目即可。

代码:

#include<bits/stdc++.h>

typedef long long LL;
using namespace std;
const LL N = 2e5 + 10;
int T, n, m;
char a[N];
map<char, int> k;

int main() {
    cin >> T;
    while (T--) {
        k.clear();
        cin >> n >> m;
        cin >> a + 1;
        for (int i = 1; i <= n; i++) {
            k[a[i]]++;
        }
        int cnt = 0;
        for (char i = 'A'; i <= 'G'; i++) {
            cnt += max(0, m - k[i]);
        }
        cout << cnt << endl;
    }
    return 0;
}

B.Choosing Cubes(思维)

题意:

德米特里有 n n n个立方体,从左到右编号为 1 1 1 n n n。索引为 f f f的立方体是他的最爱。

德米特里把所有的立方体都扔到了桌子上,第 i i i个立方体显示了值 a i a_i ai( 1 ≤ a i ≤ 100 1\le a_i\le 100 1ai100)。之后,他按照数值从大到小的非递增顺序排列这些立方体。如果两个立方体的数值相同,它们可以按照任意顺序排列。

排序后,德米特里取出了第一个 k k k立方体。然后,他开始关注自己是否取出了最喜欢的立方体(注意,排序后立方体的位置可能会发生变化)。

例如,如果 n = 5 n=5 n=5 f = 2 f=2 f=2 a = [ 4 , 3 , 3 , 2 , 3 ] a=[4,\color{green}3,3,2,3] a=[4,3,3,2,3](最喜欢的立方体用绿色标出)和 k = 2 k=2 k=2,可能会发生以下情况:

  • 在对 a = [ 4 , 3 , 3 , 3 , 2 ] a=[4,\color{green}3,3,3,2] a=[4,3,3,3,2]排序后,由于最喜爱的立方体最终排在了第二位,因此它将被移除。
  • 在对 a = [ 4 , 3 , 3 , 3 , 2 ] a=[4,3,\color{green}3,3,2] a=[4,3,3,3,2]排序后,由于最喜爱的魔方排在了第三位,因此它不会被移除。

分析:

我们只需要检查排完序之后比较在 k k k位置的立方体 a k a_k ak与最喜欢的立方体 a f a_f af的大小即可,如果 a k > a f a_k\gt a_f ak>af,说明 a f a_f af的位置在 k k k之前,一定会被删;如果 a k < a f a_k\lt a_f ak<af,说明 a f a_f af的位置在 k k k之后,一定不会被删;如果 a k = a f a_k=a_f ak=af,检查 a k + 1 a_{k+1} ak+1,如果 a k + 1 = a f a_{k+1}=a_f ak+1=af,则有可能被删,否则一定被删。

代码:

#include<bits/stdc++.h>

using namespace std;

void solve() {
    int n, f, k;
    cin >> n >> f >> k;
    vector<int> a(n + 1);
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    int fa = a[f];
    sort(a.begin() + 1, a.end(), greater<int>());
    if (k == n)
        cout << "YES" << endl;
    else if (fa > a[k])
        cout << "YES" << endl;
    else if (fa < a[k])
        cout << "NO" << endl;
    else {
        if (a[k + 1] == fa)
            cout << "MAYBE" << endl;
        else
            cout << "YES" << endl;
    }
}

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

C.Sofia and the Lost Operations(思维)

题意:

索菲亚有一个由 n n n个整数 a 1 , a 2 , … , a n a_1,a_2,\ldots,a_n a1,a2,,an组成的数组。有一天,她对这个数组感到厌倦,于是决定依次对它进行 m m m次修改操作。

每个修改操作都由一对数字 ⟨ c j , d j ⟩ \langle c_j,d_j\rangle cj,dj来描述,这意味着数组中索引为 c j c_j cj的元素应赋值为 d j d_j dj,即执行赋值 a c j = d j a_{c_j}=d_j acj=dj依次执行所有修改操作后,索菲亚丢弃了得到的数组。

最近,你发现了一个由 n n n个整数组成的数组 b 1 , b 2 , … , b n b_1,b_2,\ldots,b_n b1,b2,,bn。你想知道这个数组是否是索菲亚的数组。你知道原始数组的值以及 d 1 , d 2 , … , d m d_1,d_2,\ldots,d_m d1,d2,,dm的值。结果发现数值 c 1 , c 2 , … , c m c_1,c_2,\ldots,c_m c1,c2,,cm丢失了。

是否存在一个序列 c 1 , c 2 , … , c m c_1,c_2,\ldots,c_m c1,c2,,cm使得对数组 a 1 , a 2 , … , a n a_1,a_2,\ldots,a_n a1,a2,,an的修改操作 ⟨ c 1 , d 1 , ⟩ , ⟨ c 2 , d 2 , ⟩ , … , ⟨ c m , d m ⟩ \langle c_1,d_1,\rangle,\langle c_2,d_2,\rangle,\ldots,\langle c_m,d_m\rangle c1,d1,,c2,d2,,,cm,dm顺序应用将其转换为数组 b 1 , b 2 , … , b n b_1,b_2,\ldots,b_n b1,b2,,bn

分析:

若最后一个修改数存在于 b b b数组中,那么只需要看这些修改的数能否把 a a a数组中待修改的数全部覆盖即可,否则一定不存在。

所以判断最后一个是否合法,前面的能否一一匹配即可。

代码:

#include<bits/stdc++.h>

using namespace std;
const int N = 2e5 + 10;
const int MOD = 998244353;
int n, a[N], m, b[N], c[N];
map<int, int> apper, be;

void solve() {
    apper.clear();
    be.clear();
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    for (int i = 1; i <= n; i++) {
        cin >> b[i];
        apper[b[i]]++;
    }
    cin >> m;
    for (int i = 1; i <= m; i++) {
        cin >> c[i];
        be[c[i]]++;
    }
    if (apper.find(c[m]) == apper.end())
        cout << "no" << endl;
    else {
        bool flag = 1;
        for (int i = 1; i <= n; i++) {
            if (a[i] != b[i]) {
                if (!be[b[i]]) {
                    flag = 0;
                    break;
                }
                be[b[i]]--;
            }
        }
        if (flag)
            cout << "yes" << endl;
        else
            cout << "no" << endl;
    }
}

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

D.GCD-sequence(模拟)

题意:

两个整数 x x x y y y的GCD(最大公约数)是 z z z可以整除 x x x y y y的最大整数。例如, G C D ( 36 , 48 ) = 12 GCD(36,48)=12 GCD(36,48)=12 G C D ( 5 , 10 ) = 5 GCD(5,10)=5 GCD(5,10)=5 G C D ( 7 , 11 ) = 1 GCD(7,11)=1 GCD(7,11)=1

克里斯蒂娜有一个数组 a a a,其中正好包含 n n n个正整数。她想通过计算每一对相邻数字的GCD得到一个新数组 b b b,称为GCD序列。

因此,GCD序列 b b b中的元素将使用公式 b i = G C D ( a i , a i + 1 ) b_i=GCD(a_i,a_{i+1}) bi=GCD(ai,ai+1)计算 1 ≤ i ≤ n − 1 1\le i\le n-1 1in1

确定是否有可能从数组 a a a恰好删除一个数,从而使GCD序列 b b b不递减(即 b i ≤ b i + 1 b_i\le b_{i+1} bibi+1始终为真)。

例如,假设克里斯蒂娜有一个数组 a a a=[ 20 , 6 , 12 , 3 , 48 , 36 20,6,12,3,48,36 20,6,12,3,48,36]。如果她从中取出 a 4 = 3 a_4=3 a4=3并计算 b b b的GCD序列,她会得到:

  • b 1 = G C D ( 20 , 6 ) = 2 b_1=GCD(20,6)=2 b1=GCD(20,6)=2
  • b 2 = G C D ( 6 , 12 ) = 6 b_2=GCD(6,12)=6 b2=GCD(6,12)=6
  • b 3 = G C D ( 12 , 48 ) = 12 b_3=GCD(12,48)=12 b3=GCD(12,48)=12
  • b 4 = G C D ( 48 , 36 ) = 12 b_4=GCD(48,36)=12 b4=GCD(48,36)=12

得到的GCD序列 b b b=[ 2 , 6 , 12 , 12 2,6,12,12 2,6,12,12]是非递减的,因为 b 1 ≤ b 2 ≤ b 3 ≤ b 4 b_1\le b_2\le b_3\le b_4 b1b2b3b4

分析:

读题发现是大模拟,判断前驱合法,后继合法,拼接即可。

代码:

#include<bits/stdc++.h>

typedef long long LL;
using namespace std;
const int N = 2e5 + 10;
const LL MAXN = 0x3f3f3f3f;
int n, a[N];
int gcd1[N];
bool pre[N], suc[N];
map<int, int> apper, be;

LL _gcd(LL a, LL b) {
    return b > 0 ? _gcd(b, a % b) : a;
}

void solve() {
    apper.clear();
    be.clear();
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        if (i > 1)
            gcd1[i] = _gcd(a[i], a[i - 1]);
    }
    gcd1[0] = gcd1[1] = 0;
    gcd1[n + 1] = MAXN;
    pre[1] = pre[2] = true;
    for (int i = 3; i <= n; i++) {
        pre[i] = pre[i - 1] && (gcd1[i] >= gcd1[i - 1]);
    }
    suc[n] = suc[n - 1] = true;
    for (int i = n - 2; i >= 1; i--) {
        suc[i] = suc[i + 1] && (gcd1[i + 1] <= gcd1[i + 2]);
    }
    bool flag = 0;
    for (int i = 2; i < n; i++) {
        int g = (__gcd(a[i - 1], a[i + 1]));
        if (pre[i - 1] && suc[i + 1] && g >= gcd1[i - 1] && g <= gcd1[i + 2]) {
            flag = 1;
            break;
        }
    }
    if (flag || pre[n - 1] || suc[2])
        cout << "Yes" << endl;
    else
        cout << "No" << endl;
}

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

E.Permutation of Rows and Columns(遍历)

题意:

给你一个大小为 n n n m m m的矩阵 a a a,其中包含从 1 1 1 n ⋅ m n\cdot m nm的整数排列。

一个由 n n n个整数组成的排列是一个数组,其中包含了从 1 1 1 n n n的所有数字,而这些数字恰好出现过一次。例如,数组 [ 1 ] [1] [1] [ 2 , 1 , 3 ] [2,1,3] [2,1,3] [ 5 , 4 , 3 , 2 , 1 ] [5,4,3,2,1] [5,4,3,2,1]是排列,而数组 [ 1 , 1 ] [1,1] [1,1] [ 100 ] [100] [100] [ 1 , 2 , 4 , 5 ] [1,2,4,5] [1,2,4,5]不是排列。

如果一个矩阵的所有元素都写出后,得到的数组是一个排列,那么这个矩阵就包含一个排列。矩阵 [ [ 1 , 2 ] , [ 3 , 4 ] ] [[1,2],[3,4]] [[1,2],[3,4]], [ [ 1 ] ] [[1]] [[1]], [ [ 1 , 5 , 3 ] , [ 2 , 6 , 4 ] ] [[1,5,3],[2,6,4]] [[1,5,3],[2,6,4]]包含排列,而矩阵 [ [ 2 ] ] [[2]] [[2]], [ [ 1 , 1 ] , [ 2 , 2 ] ] [[1,1],[2,2]] [[1,1],[2,2]], [ [ 1 , 2 ] , [ 100 , 200 ] ] [[1,2],[100,200]] [[1,2],[100,200]]不包含排列。

您可以在一次操作中执行以下两个操作之一:

  • 选择列 c c c d d d 1 ≤ c , d ≤ m 1\le c,d\le m 1c,dm, c ≠ d c\ne d c=d)并交换这些列;
  • 选择行 c c c d d d( 1 ≤ c , d ≤ n 1\le c,d\le n 1c,dn, c ≠ d c\ne d c=d),并交换这些行。

您可以执行任意数量的操作。

给你原始矩阵 a a a和矩阵 b b b。您的任务是确定是否可以通过给定的运算将矩阵 a a a变换为矩阵 b b b

分析:

很容易就可以观察到,无论怎么进行交换,每一行拥有的数字都不会变,只是位置改变了,对于每一列同样也是如此。只需要逐行和逐列的去检查 b b b矩阵的一行或一列对应的数字集合是否在 a a a中出现即可。

代码:

#include<bits/stdc++.h>

using namespace std;
const int MOD = 998244353;

void solve() {
    int n, m;
    cin >> n >> m;
    vector<vector<int>> a(n, vector<int>(m));
    vector<vector<int>> b(n, vector<int>(m));
    map<vector<int>, int> mp_col;
    for (int i = 0; i < n; i++) {
        vector<int> temp;
        for (int j = 0; j < m; j++) {
            cin >> a[i][j];
            temp.emplace_back(a[i][j]);
        }
        sort(temp.begin(), temp.end());
        mp_col[temp]++;
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> b[i][j];
        }
    }
    for (int i = 0; i < n; i++) {

        vector<int> temp;
        for (int j = 0; j < m; j++) {
            temp.emplace_back(b[i][j]);
        }
        sort(temp.begin(), temp.end());
        if (mp_col[temp] == 0) {
            cout << "NO" << endl;
            return;
        }
    }
    map<vector<int>, int> mp_row;
    for (int j = 0; j < m; j++) {
        vector<int> temp;
        for (int i = 0; i < n; i++) {
            temp.emplace_back(a[i][j]);
        }
        sort(temp.begin(), temp.end());
        mp_row[temp]++;
    }
    for (int j = 0; j < m; j++) {
        vector<int> temp;
        for (int i = 0; i < n; i++) {
            temp.emplace_back(b[i][j]);
        }
        sort(temp.begin(), temp.end());
        if (mp_row[temp] == 0) {
            cout << "NO" << endl;
            return;
        }
    }
    cout << "YES" << endl;
}

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

F1.Field Division (easy version)(思维)

题意:

这是问题的简易版;它与困难版的区别仅在于问题。简易版只需输出某些值是否为非零。而困难版则需要输出确切的数值。

爱丽丝和鲍勃正在分割田地。田地是一个大小为 n × m n \times m n×m( 2 ≤ n , m ≤ 1 0 9 2\le n,m\le 10^9 2n,m109) 的矩形,行的编号从上到下为 1 1 1 n n n,列的编号从左到右为 1 1 1 m m m。位于行 r r r和列 c c c交点的单元格表示为( r , c r,c r,c)。

鲍勃有 k k k( 2 ≤ k ≤ 2 ⋅ 1 0 5 2\le k\le 2\cdot 10^5 2k2105)个喷泉,它们都位于字段的不同单元格中。爱丽丝负责分割田块,但她必须满足几个条件:

  • 要分割田块,爱丽丝要从田块左侧或上侧的任意空闲(无喷泉)格子开始移动,每次移动都要向下或向移动到相邻的格子。她的路径将在田地的右侧或底侧结束。
  • 爱丽丝的路径会将田地分成两部分–一部分属于爱丽丝(这部分包括她路径上的单元格),另一部分属于鲍勃。
  • 爱丽丝将拥有包含单元格( n , 1 n,1 n,1)的部分。
  • 鲍勃将拥有包括单元格( 1 , m 1,m 1,m)的部分。

爱丽丝希望以这样的方式划分区域,以获得尽可能多的单元格。

鲍勃希望保留所有喷泉的所有权,但他可以将其中一个喷泉交给爱丽丝。首先,输出整数 α \alpha α-如果鲍勃不给爱丽丝任何喷泉(即所有喷泉都保留在鲍勃的地块上),爱丽丝地块的最大可能面积。然后输出 k k k个非负整数 a 1 , a 2 , … , a k a_1,a_2,\dots,a_k a1,a2,,ak,其中:

  • a i = 0 a_i=0 ai=0,如果鲍勃给了爱丽丝 i i i个喷泉后,爱丽丝的地块的最大可能大小没有增加(即仍然等于 α \alpha α);
  • a i = 1 a_i=1 ai=1,如果鲍勃给了爱丽丝 i i i个喷泉后,爱丽丝的地块的最大可能大小增加了(即大于 α \alpha α)。

分析:

手推一下可以发现这个平面面积的最大是:从左到右喷泉的最低面跟平面底部的差值的总和,然后如果某个喷泉会使得这个最低面增大,那么去掉这个喷泉就可以使最终答案增大,那么可以用 m a p map map存下二维中第 c c c列中的最大值 r r r,从左到右维护一个当前最大值,计算当前的面积总和,如果某一列使得这个最大值扩大了,那么就标记这一列,最后只需要判断这个喷泉是不是所在列的最大值以及所在列是不是被标记即可。

代码:

#include<bits/stdc++.h>

typedef long long LL;
using namespace std;
const int N = 2e5 + 10;
const int MOD = 998244353;
int ar[N], ac[N];

void solve() {
    int n, m, k;
    cin >> n >> m >> k;
    map<int, int> mp;
    map<int, bool> fc;
    int minn = 0;
    for (int i = 0; i < k; i++) {
        cin >> ar[i] >> ac[i];
        minn = max(minn, ac[i]);
        mp[ac[i]] = max(ar[i], mp[ac[i]]);
    }
    LL res = 0;
    int maxx = 0, le = 1;
    for (auto [c, r]: mp) {
        res += (LL) (c - le) * (n - maxx);
        if (r > maxx) {
            fc[c] = 1;
            maxx = r;
        }
        le = c;
    }
    res += (LL) (m - le + 1) * (n - maxx);
    cout << res << endl;
    for (int i = 0; i < k; i++) {
        if (fc[ac[i]] && ar[i] == mp[ac[i]])
            cout << 1 << " ";
        else
            cout << 0 << " ";
    }
    cout << endl;
}

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

F2.Field Division (hard version)(数学)

题意:

这是问题的困难版本;它与简单版本的区别仅在于问题。简易版只需输出某些值是否为非零。而困难版则需要输出确切的数值。

爱丽丝和鲍勃正在分割田地。田地是一个大小为 n × m n\times m n×m( 2 ≤ n , m ≤ 1 0 9 2\le n,m\le 10^9 2n,m109)的矩形;行的编号从上到下为 1 1 1 n n n,列的编号从左到右为 1 1 1 m m m。位于第 r r r行和第 c c c列交叉点的单元格表示为( r , c r,c r,c)。

鲍勃有 k k k( 2 ≤ k ≤ 2 ⋅ 1 0 5 2\le k\le 2\cdot 10^5 2k2105)个喷泉,它们都位于字段的不同单元格中。爱丽丝负责分割田块,但她必须满足几个条件:

  • 要分割田块,爱丽丝要从田块左侧或上侧的任意空闲(无喷泉)格子开始移动,每次移动都要向下或向移动到相邻的格子。她的路径将在田地的右侧或底侧结束。
  • 爱丽丝的路径会将田地分成两部分–一部分属于爱丽丝(这部分包括她路径上的单元格),另一部分属于鲍勃。
  • 爱丽丝将拥有包含单元格( n , 1 n,1 n,1)的部分。
  • 鲍勃将拥有包括单元格( 1 , m 1,m 1,m)的部分。

爱丽丝希望以这样的方式划分区域,以获得尽可能多的单元格。

鲍勃希望保留所有喷泉的所有权,但他可以将其中一个喷泉交给爱丽丝。首先,输出整数 α \alpha α-如果鲍勃不给爱丽丝任何喷泉(即所有喷泉都保留在鲍勃的地块上),爱丽丝地块的最大可能面积。

然后输出 k k k个非负整数 a 1 , a 2 , … , a k a_1,a_2,\dots,a_k a1,a2,,ak,其中 a i a_i ai是这样一个值:当鲍勃给了爱丽丝 i i i个喷泉后,她的地块的最大面积将是 α + a i \alpha+a_i α+ai

分析:

仍然可以使用简单版的思路来预先计算所存储的前缀信息。

爱丽丝的地块面积只有在移除第三种喷泉位置时才会发生变化,我们将其称为角落。

只有当喷泉被移除时,它才会停止成为一个角落,因为前缀上最左边的角落在移除后无法再向左移动。

为了计算面积的变化,我们要注意一个重要的问题:如果喷泉 j j j不是角落,那么它要么不能成为角落,要么只有在移除排序在它之前的最后一个角落后才能成为角落。它是喷泉 j j j前面最左边的一个角落,严格来说,排序后的下一个角落会更高。

因此,我们需要做的工作如下:计算每个角落的面积,在计算下一个角落之前不考虑它,这将得益于我们在计算面积时进行的预计算。每个喷泉只需处理一次,因此时间复杂度为 O ( n ) O(n) O(n)

代码:

#include <bits/stdc++.h>

typedef long long LL;
#define x first
#define y second
#define all(a) a.begin(), a.end()
using namespace std;

bool cmp(pair<LL, LL> &a, pair<LL, LL> &b) {
    if (a.x != b.x) return a.x > b.x;
    return a.y < b.y;
}

void solve(LL tc) {
    LL n, m, k;
    cin >> n >> m >> k;
    vector<pair<LL, LL>> a(k);
    map<pair<LL, LL>, LL> idx;
    for (LL i = 0; i < k; ++i) {
        cin >> a[i].x >> a[i].y;
        idx[a[i]] = i;
    }
    idx[{0, 0}] = k++;
    a.emplace_back(0, 0);
    sort(all(a), cmp);
    vector<LL> ans(k);
    vector<LL> total(k + 1), cur(k + 1, m + 1), last(k + 1, n);
    for (LL i = 1; i <= k; ++i) {
        auto e = a[i - 1];
        total[i] = total[i - 1];
        cur[i] = cur[i - 1];
        last[i] = last[i - 1];
        if (cur[i] > e.y) {
            ans[idx[e]] = 1;
            total[i] += (cur[i] - 1) * (last[i] - e.x);
            cur[i] = e.y;
            last[i] = e.x;
        }
    }
    cout << total[k] << "\n";
    for (LL i = 1; i <= k; ++i) {
        auto e = a[i - 1];
        if (ans[idx[e]] == 0)continue;
        LL tot = total[i - 1];
        LL cr = cur[i - 1];
        LL lst = last[i - 1];
        for (LL j = i + 1; j <= k; ++j) {
            auto ee = a[j - 1];
            if (cr > ee.y) {
                tot += (cr - 1) * (lst - ee.x);
                cr = ee.y;
                lst = ee.x;
            }
            if (ans[idx[ee]] == 1) {
                ans[idx[e]] = tot - total[j];
                break;
            }
        }
    }
    ans.pop_back();
    for (LL e: ans) cout << e << " ";
}

int main() {
    LL t;
    cin >> t;
    for (LL i = 1; i <= t; ++i) {
        solve(i);
        cout << endl;
    }
    return 0;
}

赛后交流

在比赛结束后,会在交流群中给出比赛题解,同学们可以在赛后查看题解进行补题。

群号: 704572101,赛后大家可以一起交流做题思路,分享做题技巧,欢迎大家的加入。

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

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

相关文章

开发文档 RAG 的 GPTs 如何更高效地帮你 AI 编程?

&#xff08;注&#xff1a;本文为小报童精选文章。已订阅小报童或加入知识星球「玉树芝兰」用户请勿重复付费&#xff09; 某些看似门槛很高的专业技能&#xff0c;在 AI 冲击下居然那么脆弱。 需求 自从有了ChatGPT&#xff0c;我拿它编程很久了。今年春季学期的《深度学习》…

计算机信息安全技术课后习题答案

计算机信息安全技术课后习题答案 计算机信息安全技术&#xff08;第2版&#xff09;付永刚 部分习题答案 第一章 计算机信息安全技术概述 选择题 关于访问控制服务的描述中&#xff0c;正确的是&#xff08; A &#xff09; A. 可控制用户访问网络资源 B.可识别发送方的真实身…

STM32无法烧写程序的故障排除

如果你在使用STM32微控制器时遇到无法烧写程序的问题&#xff0c;可以按以下步骤进行故障排除&#xff1a; 1. 确认硬件连接 检查电源&#xff1a;确保STM32板子正确供电。调试器连接&#xff1a;确认ST-LINK调试器或其他编程工具与STM32开发板的连接无误&#xff0c;尤其是S…

将web项目打包成electron桌面端教程(二)vue3+vite+ts

说明&#xff1a;我用的demo项目是vue3vitets&#xff0c;如果是vue2/cli就不用往下看啦&#xff0c;建议找找其他教程哦~下依赖npm下载不下来的&#xff0c;基本换成cnpm/pnpm/yarn就可以了 一、项目准备 1、自己新创建一个&#xff0c;这里就不过多赘述了 2、将需要打包成…

windows上修改Podman的镜像配置源加速

目录 前言解决办法1. 打开window的Powershell 2. 修改registries.conf3. 重启podman即可 扩展内容1. 国内镜像源地址2. 阿里加速地址 前言 今天在电脑上准备通过podman安装mysql&#xff0c;结果执行安装命令后&#xff0c;网络不通没法下载镜像。 解决办法 将默认镜像源修改…

AI 大模型训练中,通常会采用哪些方法?(输入篇)

大家好 某种程度来说大模型训练的核心算法就是300到400行代码&#xff0c;如果真正理解了并不难。下面我将带大家分析常规大模型训练有几个阶段以及在训练中一般会用到哪些方法。 由上图可以看出&#xff0c;大模型训练主要有四个阶段&#xff1a;预训练、有监督微调、奖励建模…

C++11:可变参数模板 emplace_back

可变参数模板 基本概念&#xff1a;C 的参数模板是 C11 引入的特性&#xff0c;它允许模板接受可变数量的参数 // Args是一个模板参数包&#xff0c;args是一个函数形参参数包 // 声明一个参数包Args... args&#xff0c;这个参数包中可以包含0到N个模板参数。 template <…

Vue21-列表排序

一、需求 二、解决方式 <body><div id"root"><h2>人员列表</h2><input type"text" placeholder"请输入" v-model"keyword"><button click"sortType 1">年龄升序</button><b…

uniapp地图导航

我们只需要给图标加一个点击事件 我这里的数据都是动态的&#xff0c;想测试的朋友可以写固定值 然后跳转之后首先会调到选择软件导航 点击导航之后会显示使用哪个app 最后我们选择之后将会直接跳转到app进行导航

spring boot3登录开发-邮件验证码接口实现

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 目录 写在前面 上文衔接 接口设计与实现 1.接口分析 2.实现思路 3.代码实现 1.定义验证码短信HTML模板枚举类 2.定义验证码业务接口 3. 验证码业务接口实现 4.控制层代码 4.测试 写…

带你走进信息安全软件架构

汽车行业网联化以及网络安全风险日益突出&#xff0c;汽车网络攻击&#xff0c;漏洞日益增加&#xff0c;危害防不胜防。汽车信息安全逐步受到重视&#xff0c;网络安全相关法律法规陆续颁布。在这样的背景下&#xff0c;AUTOSAR 组织也发布了有关信息安全模块和 Crypto Stack(…

【ARM Coresight Debug 系列 -- ARMv8/v9 软件实现断点地址设置】

请阅读【嵌入式开发学习必备专栏 】 文章目录 ARMv8/v9 软件设置断点地址断点地址软件配置流程代码实现 ARMv8/v9 软件设置断点地址 在ARMv8/9架构中&#xff0c;可以通过寄存器 DBGBVR0_EL1 设置断点。这个寄存器是一系列调试断点值寄存器中的第一个DBGBVRn_EL1&#xff0c;其…

Chromium源码阅读:深入理解Mojo框架的设计思想,并掌握其基本用法(1)

Mojo简介 Mojo 是一个运行时库的集合&#xff0c;提供与平台无关的通用 IPC 原语抽象、消息 IDL 格式以及具有针对多种目标语言的代码生成的绑定库&#xff0c;以便于跨任意进程间和进程内边界传递消息。 Mojo 分为清晰分离的层&#xff0c;子组件的基本层次结构如下&#xff…

GraphQL(7):ConstructingTypes

1 使用GraphQLObjectType 定义type&#xff08;类型&#xff09; 不使用ConstructingTypes定义方式如下&#xff1a; 使用ConstructingTypes定义方式如下&#xff1a; 更接近于构造函数方式 var AccountType new graphql.GraphQLObjectType({name: Account,fields: {name: …

微软Win10 21H2/22H2六月更新补丁KB5039211来了!附完整更新日志

系统之家于6月12日发出最新报道&#xff0c;微软为 Windows 10 用户发布了六月的安全更新补丁KB5039211。对于 21H2 版本的用户&#xff0c;系统版本号将升级至 19044.4529&#xff1b;而对于 22H2 版本&#xff0c;版本号则提升至 19045.4529。此次更新的亮点在于增强了系统的…

批量放大PNG图片至指定像素,画质优先,轻松提升图片品质与视觉体验!

在数字化时代&#xff0c;图片已经成为我们生活和工作中不可或缺的一部分。然而&#xff0c;很多时候我们面临着这样的问题&#xff1a;手头的Png图片尺寸太小&#xff0c;无法满足我们的需求&#xff1b;或者想要将图片放大&#xff0c;却又担心画质受损。别担心&#xff0c;现…

深度学习实战79-ChatTTS实现有感情有笑声的语音,无法分辨是人还是机器的语音

大家好,我是微学AI,今天给大介绍一下深度学习实战79-ChatTTS实现有感情有笑声的语音,本地部署运行,难以分辨是人还是机器的语音。ChatTTS是文本转语音模型,例如LLM助手对话任务。它支持英文和中文两种语言。ChatTTS模型代码已经开源,但是很多人启动不起来,会遇到各种的问…

R可视化:R语言基础图形合集

R语言基础图形合集 欢迎大家关注全网生信学习者系列&#xff1a; WX公zhong号&#xff1a;生信学习者Xiao hong书&#xff1a;生信学习者知hu&#xff1a;生信学习者CDSN&#xff1a;生信学习者2 基础图形可视化 数据分析的图形可视化是了解数据分布、波动和相关性等属性必…

深入浅出通信原理 | 通信系统中的性能指标评估

微信公众号上线&#xff0c;搜索公众号小灰灰的FPGA,关注可获取相关源码&#xff0c;定期更新有关FPGA的项目以及开源项目源码&#xff0c;包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 本节目录 一、通信系统中的性能指…

数据结构与算法笔记:基础篇 -递归树:如何借助树来求解递归算法的时间复杂度?

概述 我们都知道&#xff0c;递归代码的时间复杂度分析起来很麻烦。在《排序(下)》哪里讲过&#xff0c;如何用递推公式&#xff0c;求解归并排序、快速排序的时间复杂度&#xff0c;但是有些情况&#xff0c;比如快排的平均时间复杂度的分析&#xff0c;用递推公式的话&#…