牛客周赛 Round 67

一、前言

中间acm停了半年,现在水平退步很明显,想着刷一刷牛客周赛练一练,晚上发挥很烂,被第二个题卡了半天。不过比赛一结束,把除了最后一个题外的题都ac了

二、题目总览

三、具体题目

3.1 A 排序危机

牛客周赛 Round 67_第1张图片

思路

按顺序把小写字母,数字,大写字母依次输出一遍即可

我的代码

#include 
using i64 = long long;

void solve() {
    int n;
    std::cin >> n;
    std::string s;
    std::cin >> s;
    std::vector upper,lower,others;
    for(auto &c:s) {
        if(c>='A'&&c<='Z') upper.emplace_back(c);
        else if(c>='a'&&c<='z') lower.emplace_back(c);
        else others.emplace_back(c);
    }
    for(auto &c:lower) std::cout << c;
    for(auto &c:others) std::cout << c;
    for(auto &c:upper) std::cout << c;
    std::cout << '\n';
}

int main() {
    std::cin.tie(nullptr)->sync_with_stdio(false);

    int t = 1;
    // std::cin >> t;
    for(int ti = 0;ti

3.2 B 小歪商店故事:卷

牛客周赛 Round 67_第2张图片

思路

注意比较amax'/b

我的代码

#include 
using i64 = long long;

int main() {
    std::cin.tie(nullptr)->sync_with_stdio(false);

    int t = 1;
    std::cin >> t;
    for(int ti = 0;ti> a >> b >> c >> d;
        std::cout << a-(b*c-1)/d <<" \n"[ti==t-1];
    }
    
    return 0;
}

3.3 C 小苯的计算式

牛客周赛 Round 67_第3张图片

思路

注意数据的范围,我们可以暴力枚举所有可能的答案

我的代码

#include 
using i64 = long long;

int main() {
    std::cin.tie(nullptr)->sync_with_stdio(false);

    int n,C;
    std::cin >> n >> C;
    int ans = 0;

    for(int i = 0;i<=C;i++) {
        if(std::to_string(i).size()+std::to_string(C-i).size()+2+std::to_string(C).size()==n) ++ans;
    }
    std::cout << ans << '\n';
    
    return 0;
}

3.4 D K

牛客周赛 Round 67_第4张图片

思路

一个构造题,尝试几组数据后,我们发现当且仅当k>n时无解,而当k=n时,我们构造一排'0'即可,最后一种情况当k 0 1 0 1 1 1
如果n=6,k=4,我们构造

0 1 0 1 0 0

如果n=6,k=5,我们构造

0 1 0 1 0 1

此时我们发现,数组的前k+1位就是按照0 1 0 1 ...这样排列的,后续剩余的数组元素则与前面排列的最后一个元素一致,具体实现见代码

我的代码

#include 
using i64 = long long;

int main() {
    std::cin.tie(nullptr)->sync_with_stdio(false);

    int n,k;
    std::cin >> n >> k;
    
    if(k>n) {
        std::cout << "NO\n";
    }else if(k==n){
        std::cout << "YES\n";
        for(int i = 1;i<=n;i++) std::cout << 0 << " \n"[i==n];
    }else {
        std::cout << "YES\n";
        for(int i = 1;i<=n;i++) {
            if(i&1&&i<=k+1) std::cout << 0 << ' ';
            else if(!(i&1)&&i<=k+1) std::cout << 1 << ' ';
            else std::cout << ((k+1)&1?0:1) << " \n"[i==n];
        }
    }
    
    return 0;
}

3.5 E 小苯的区间选数

牛客周赛 Round 67_第5张图片

思路

跟这个老哥的思路一样,但是可能他代码书写细节有些许问题

牛客周赛 Round 67_第6张图片

我的代码

#include 
using i64 = long long;

void solve() {
    i64 l1,r1,l2,r2;
    std::cin >> l1 >> r1 >> l2 >> r2;
    i64 st = l1+l2;
    i64 ed = r1+r2;

    auto getSum = [&](i64 num) ->i64 {
        i64 ans = 0;
        while(num) {
            ans+=num%10;
            num/=10;
        }
        return ans;
    };

    i64 ans = getSum(ed);
    std::string s = std::to_string(ed);
    int len = s.size();

    for(int i = 0;i=st) {
            ans = std::max(ans,getSum(res));
        }
    }
    std::cout << ans << '\n';
}
int main() {
    std::cin.tie(nullptr)->sync_with_stdio(false);

    int t = 1;
    std::cin >> t;
    for(int ti = 0;ti

3.6 F 小Z的树迁移

牛客周赛 Round 67_第7张图片

思路

没有思路,不太会这种dfs

参考代码

找了一个大佬的代码

#include 
using namespace std;
using ll = long long;
#define int long long 
#define endl '\n'
 
struct StaticTable {
    const int LOGN = 20;
    const int n;
    vector> f;
    StaticTable() = default;
    StaticTable(const vector& a) :n(a.size() - 1) {
 
        f.assign(LOGN + 1, vector(n + 1));
        for (int i = 1; i <= n; i++) {
            f[0][i] = a[i];
        }
        for (int j = 1; j <= LOGN; j++) {
            for (int i = 1; i + (1 << j) - 1 <= n; i++) {
                f[j][i] = max(f[j - 1][i], f[j - 1][i + (1 << (j - 1))]);
            }
        }
    }
 
    int query(int l, int r) {
        int len = __lg(r - l + 1);
        return max(f[len][l], f[len][r - (1 << len) + 1]);
    }
 
};

void solve() {
    int n;cin >> n;
    vector>> g(n + 1);
    for (int i = 1;i < n;i++) {
        int u, v, w;cin >> u >> v >> w;
        g[u].push_back({ v,w });
        g[v].push_back({ u,w });
    }
    vector dep(n + 1), dl(n + 1), dr(n + 1), len(n + 1);
    int tot = 0;
    vector> vec(n + 1, vector(1, -1e18)), value(n + 1, vector(1));
    auto dfs = [&](auto&& dfs, int u, int p)->void {
        dl[u] = ++tot;
        vec[dep[u]].push_back(tot);
        value[dep[u]].push_back(len[u]);
        for (auto [v, w] : g[u]) {
            if (v == p) continue;
            dep[v] = dep[u] + 1;
            len[v] = len[u] + w;
            dfs(dfs, v, u);
        }
        dr[u] = tot;
        };
    dfs(dfs, 1, 1);
    vector st;
    for (int i = 1;i <= n;i++) {
        st.emplace_back(StaticTable(value[i]));
    }
    int q;cin >> q;
    while (q--) {
        int u, d;cin >> u >> d;
        int L = dl[u], R = dr[u];
        int D = dep[u] + d;
        if (D > n) cout << "-1\n";
        else {
            int Lef = lower_bound(vec[D].begin(), vec[D].end(), L) - vec[D].begin();
            int Rig = upper_bound(vec[D].begin(), vec[D].end(), R) - vec[D].begin() - 1;
            if (Lef > Rig || Rig <= 0 || Lef >= vec[D].size()) cout << "-1\n";
            else cout << st[D - 1].query(Lef, Rig) - len[u] << endl;
        }
    }
 
}
 
signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    int T = 1;
    //cin >> T;
    while (T--) solve();
}

 

你可能感兴趣的:(C/C++,算法,数据结构)