SMU 2024 spring 天梯賽1

Ke_scholar發表於2024-03-17

SMU 2024 spring 天梯賽1

7-1 種鑽石 - SMU 2024 spring 天梯賽1 (pintia.cn)

#include <bits/stdc++.h>
#define debug(a) cout<<#a<<"="<<a<<'\n';

using namespace std;
using i64 = long long;

typedef pair<i64, i64> PII;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, v;
    cin >> n >> v;
    cout << n / v << '\n';

    return 0;
}

7-2 1-1 輸出金字塔圖案 - SMU 2024 spring 天梯賽1 (pintia.cn)

   *
  ***
 *****
*******
//PHP

7-3 強迫症 - SMU 2024 spring 天梯賽1 (pintia.cn)

#include <bits/stdc++.h>
#define debug(a) cout<<#a<<"="<<a<<'\n';

using namespace std;
using i64 = long long;

typedef pair<i64, i64> PII;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    string n;
    cin >> n;
    if (n.size() < 6) {
        if (n.substr(0, 2) < "22") {
            n = "20" + n;
        } else
            n = "19" + n;
    }

    cout << n.substr(0, 4) << '-' << n.substr(4) << '\n';

    return 0;
}

7-4 小孩子才做選擇,大人全都要 - SMU 2024 spring 天梯賽1 (pintia.cn)

注意點,一個空碗一個不為空時,這時都處於虧的狀態,但是全都要不一定就代表一點也吃不到

#include <bits/stdc++.h>
#define debug(a) cout<<#a<<"="<<a<<'\n';

using namespace std;
using i64 = long long;

typedef pair<i64, i64> PII;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int x,y;
    cin >> x >> y;
    if(x > 0 && y > 0){
        cout << max(x,y) << ' ' << x + y << "\n^_^";
    }else if(x < 0 && y < 0) {
        cout << "0 0\n-_-";
    }else{
        cout << max(x,y) << ' ' << max(0,x+y) << "\nT_T";
    }

    return 0;
}

7-5 胎壓監測 - SMU 2024 spring 天梯賽1 (pintia.cn)

模擬

#include <bits/stdc++.h>
#define debug(a) cout<<#a<<"="<<a<<'\n';

using namespace std;
using i64 = long long;

typedef pair<i64, i64> PII;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    vector<int> lun(6);
    for (auto &i : lun) cin >> i;

    int ma = lun[0];
    for (int i = 0; i < 4; i ++)
        ma = max(ma, lun[i]);

    int ck = -1,num = 0;
    for(int i = 0;i < 4;i ++){
        int x = abs(lun[i] - ma);
        if(x > lun[5] || lun[i] < lun[4]){
            num ++, ck = i;
        }
    }
    if(!num){
        cout << "Normal";
    }else if(num == 1){
        cout << "Warning: please check #" <<  ck + 1 << '!';
    }else{
        cout << "Warning: please check all the tires!";
    }

    return 0;
}

7-6 吉老師的迴歸 - SMU 2024 spring 天梯賽1 (pintia.cn)

考察字串

#include <bits/stdc++.h>
#define debug(a) cout<<#a<<"="<<a<<'\n';

using namespace std;
using i64 = long long;

typedef pair<i64, i64> PII;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, m;
    cin >> n >> m;

    string s;
    getline(cin, s);
    for (int i = 0; i < n; i ++) {
        getline(cin, s);
        if(s.find("qiandao") == -1 && s.find("easy") == -1){
            m --;
            if(m == -1){
                cout << s << '\n';
                exit(0);
            }
        }
    }

    cout << "Wo AK le";

    return 0;
}

7-7 靜靜的推薦 - SMU 2024 spring 天梯賽1 (pintia.cn)

兩個成績都滿足要求的,直接答案加一即可,就不參與推薦名額,把滿足天梯賽成績的篩選出來後,取每個分數段的前k個即可

#include <bits/stdc++.h>
#define debug(a) cout<<#a<<"="<<a<<'\n';

using namespace std;
using i64 = long long;

typedef pair<i64, i64> PII;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n,k,s;
    cin >> n >> k >> s;

    int ans = 0;
    vector<int> m(300);
    for(int i = 0;i < n;i ++){
        int a,b;
        cin >> a >> b;
        if(a < 175) continue;
        if(b >= s) {
            ans ++;
            continue;
        }
        m[a] ++;
    }

    for(int i = 175;i <= 290;i ++)
        ans += (m[i] > k ? k : m[i]);

    cout << ans << '\n';

    return 0;
}

7-8 機工士姆斯塔迪奧 - SMU 2024 spring 天梯賽1 (pintia.cn)

把選中的行和列都移到邊界,最終答案仍然是個矩形,注意重複選擇的行和列

#include <bits/stdc++.h>
#define debug(a) cout<<#a<<"="<<a<<'\n';

using namespace std;
using i64 = long long;

typedef pair<i64, i64> PII;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    i64 n,m,q;
    cin >> n >> m >> q;
    vector<array<int,2>> vis(100100);
    for(int i = 0;i < q;i ++){
        int op,x;
        cin >> op >> x;
        if(vis[x][op]) continue;
        vis[x][op] ++;
        if(op) m--;
        else n --;
    }

    cout << n * m << '\n';

    return 0;
}

7-9 彩虹瓶 - SMU 2024 spring 天梯賽1 (pintia.cn)

模擬

#include <bits/stdc++.h>
#define debug(a) cout<<#a<<"="<<a<<'\n';

using namespace std;
using i64 = long long;

typedef pair<i64, i64> PII;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n,m,k;
    cin >> n >> m >> k;
    while(k--){
        stack<int> Q,now;
        for(int i = 0;i < n;i ++){
            int x;
            cin >> x;
            if(Q.size() > m) continue;
            if(now.empty() && x == 1){
                now.push(x);
            }else if(now.size() && x == now.top() + 1){
                now.push(x);
            }else Q.push(x);
            if(now.size()){
                while(Q.size() && Q.top() == now.top() + 1){
                    now.push(Q.top());
                    Q.pop();
                }
            }
        }
        if(now.size() != n)
            cout << "NO\n";
        else cout << "YES\n";
    }

    return 0;
}

7-10 簡單計算器 - SMU 2024 spring 天梯賽1 (pintia.cn)

模擬

#include <bits/stdc++.h>
#define debug(a) cout<<#a<<"="<<a<<'\n';

using namespace std;
using i64 = long long;

typedef pair<i64, i64> PII;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    cin >> n;
    vector<int> num(n);
    for (auto &i : num) cin >> i;

    vector<char> op(n - 1);
    for (auto &i : op) cin >> i;

    while (num.size() > 1) {
        int x = num.back();
        num.pop_back();
        int y = num.back();
        num.pop_back();

        char z = op.back();
        op.pop_back();

        switch (z) {
        case '+': num.push_back(x + y);
            break;
        case '-': num.push_back(y - x);
            break;
        case '*': num.push_back(x * y);
            break;
        case'/': if (!x) {
                cout << "ERROR: " << y << "/0\n";
                exit(0);
            } else {
                num.push_back(y / x);
                break;
            }
        }
    }

    cout << num[0] << '\n';

    return 0;
}

7-11 龍龍送外賣 - SMU 2024 spring 天梯賽1 (pintia.cn)

假設每次送完後都要回到外賣站,則透過畫圖可以發現,其實每條路都走了兩遍,現在加上不必返回外賣站,那我們只要把離外賣站即根節點最遠的那條路線放到最後走,即只需走一遍,在之前的每條路的基礎上減去最遠的那條線即可

剛開始用了LCA,不過跟這題沒關係,只需要計算每個點的深度以及記錄其父節點,然後往上遞迴即可;

#include <bits/stdc++.h>
#define debug(a) cout<<#a<<"="<<a<<'\n';

using namespace std;
using i64 = long long;

typedef pair<i64, i64> PII;

struct LCA {
    int n;
    vector<i64> dep;
    vector<vector<int>> e;
    vector<array<int, 21>> fa;
    LCA() {}
    LCA(int n) {
        dep.resize(n + 1);
        e.resize(n + 1);
        fa.resize(n + 1);
    }

    void add(int u, int v) {
        e[u].push_back(v);
        e[v].push_back(u);
    }

    //計算深度,處理各點祖先
    void dfs(int u, int father) {
        dep[u] = dep[father] + 1;

        fa[u][0] = father;
        for (int i = 1; i < 20; i ++)
            fa[u][i] = fa[fa[u][i - 1]][i - 1];

        for (auto v : e[u])
            if (v != father)
                dfs(v, u);
    }

    //最近公共祖先
    //兩點集並的最近公共祖先為兩點幾分別的最近公共祖先的最近公共祖先,
    //即LCA(A∪B) = LCA(LCA(A), LCA(B));
    int lca(int u, int v) {
        if (dep[u] < dep[v]) swap(u, v);
        for (int i = 19; i >= 0; i --)
            if (dep[fa[u][i]] >= dep[v])
                u = fa[u][i];

        if (u == v) return v;

        for (int i = 19; i >= 0; i --)
            if (fa[u][i] != fa[v][i])
                u = fa[u][i], v = fa[v][i];
        return fa[u][0];
    }

    //d(u,v) = h(u) + h(v) - 2h(LCA(u,v));
    //其中d是樹上兩點間的距離,h代表某點到樹根的距離
    int get_dis(int u, int v) {
        return dep[u] + dep[v] - 2 * dep[lca(u, v)];
    }
};

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, m, root;
    cin >> n >> m;
    LCA lca(n);
    for (int i = 1; i <= n; i ++) {
        int x;
        cin >> x;
        if (x == -1) root = i, x ++;
        lca.add(x, i);
    }

    lca.dfs(root, 0);

    i64 ans = 0;
    vector<bool> vis(n + 1);
    vis[root] = 1;
    auto dfs = [&](auto self, int u)->void{
        if (vis[u]) return ;
        vis[u] = 1;
        ans += 2;
        self(self, lca.fa[u][0]);
    };

    i64 ma = 0;
    while (m --) {
        int x;
        cin >> x;
        ma = max(ma, lca.dep[x]);
        dfs(dfs, x);
        cout << ans - ma + 1 << '\n';
    }

    return 0;
}

7-12 智慧護理中心統計 - SMU 2024 spring 天梯賽1(補題) (pintia.cn)

維護每個管理節點的人數,管理中心與管理中心的從屬關係,老人與管理中心的從屬關係;

每加入/移除一個老人,從當前老人的管理中心往上遞迴加一/減一;

管理中心之間從屬關係,就往上遞迴給其上級新增此中心的人數;

查詢時,先將老人從原來的管理中心移除,再新增到新的管理中心;

#include <bits/stdc++.h>
#define debug(a) cout<<#a<<"="<<a<<'\n';

using namespace std;
using i64 = long long;

typedef pair<i64, i64> PII;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);

	int n, m;
	cin >> n >> m;

	map<int, int> num, fa, people;
	map<string, int> id;

	auto up = [&](auto up, int x)->void{
		if (!x) return;
		num[x] ++;
		up(up, fa[x]);
	};

	auto down = [&](auto down, int x)->void{
		if (!x) return ;
		num[x] --;
		down(down, fa[x]);
	};

	auto pass = [&](auto pass, int x, int val)->void{
		if (!x) return ;
		num[x] += val;
		pass(pass, fa[x], val);
	};

	int cnt = 0;
	for (int i = 0; i < m; i ++) {
		string x, y;
		cin >> x >> y;
		if (!id[y]) id[y] = ++ cnt;
		if (x[0] >= '0' && x[0] <= '9') {
			people[stoi(x)] = id[y];
			up(up, id[y]);
		} else {
			if (!id[x]) id[x] = ++ cnt;
			fa[id[x]] = id[y];
			pass(pass, id[y], num[id[x]]);
		}
	}

	char op;
	while (cin >> op) {
		int x;
		string y;
		if (op == 'E') break;
		else if (op == 'T') {
			cin >> x >> y;
			down(down, people[x]);
			people[x] = id[y];
			up(up, id[y]);
		} else {
			cin >> y;
			cout << num[id[y]] << '\n';
		}
	}

	return 0;
}

相關文章