马蹄杯入门组初赛总结

ACM赛制,难度波动超大,简单题很多,难题也很难(一点思路都没有)
战绩:AC:9/11
状态:比赛时中等,早上状态很差,但是午觉后调整过来了
耳机当耳塞降噪,应该没事吧...(下次可以换耳塞)

没写出来的题不出意外是数论,暂时补不了


时间花费较多的地方

1. getline()

问题
如果在getline()前面用了cin,不加处理的话,会发现getline()直接跳过、无法正常读入。

解决方案
在使用getline()前加清空缓冲区操作;
简单写法:cin.ignore()
稳妥写法:cin.ignore(INT_MAX, '\n');

代码示例(豆包赞助)
#include <bits/stdc++.h>
using namespace std;

signed main() {
    int n;
    cin >> n;
    cin.ignore(INT_MAX, '\n');
    
    string s;
    getline(cin, s);
    cout << s;
    return 0;
}

2. vector嵌套

vector<vector<int>> a(n)
n 为外层容器元素个数(行数),包含n个空内层容器。

适用场景:
读入\(n*m\)矩阵,限制 \(n, m <= 1e6,n * m <= 1e6\)

禁止错误写法:
vector<int, vector<int, int>> a(n) 不属于正常二维容器语法,不要和 map 混淆。

vector 嵌套代码示例(豆包赞助)
#include <bits/stdc++.h>
using namespace std;

signed main() {
    int n, m;
    cin >> n >> m;
    vector<vector<int>> a(n);
    
    // 完整使用:读入 n 行 m 列矩阵
    for(int i = 0; i < n; i++) {
        a[i].resize(m);
        for(int j = 0; j < m; j++) {
            cin >> a[i][j];
        }
    }
    
    // 输出矩阵
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < m; j++) {
            cout << a[i][j] << " ";
        }
        cout << "\n";
    }
    return 0;
}


3. 矩阵只交换行(仅需输出)

核心思路:
开映射数组,初始每行编号对应自身;
需要交换行时,只交换映射数组下标,不改动原矩阵,交换复杂度 (O(1));
输出时通过映射数组索引原数组对应行。

数组映射换行代码示例(豆包赞助)
#include <bits/stdc++.h>
using namespace std;

const int N = 1005;
int mp[N][N];
int pos[N];

signed main() {
    int n;
    cin >> n;
    for(int i = 1; i <= n; i++) {
        pos[i] = i;
    }
    // 交换两行只改映射
    swap(pos[1], pos[3]);
    
    for(int i = 1; i <= n; i++) {
        int now = pos[i];
        for(int j = 1; j <= n; j++) {
            cout << mp[now][j] << " ";
        }
        cout << "\n";
    }
    return 0;
}
posted @ 2026-04-25 20:46  PCMSFV  阅读(16)  评论(0)    收藏  举报