Codeforces Round #650 (Div. 3) D

D. Task On The Board

观察样例 我们发现一定会有0的存在
然后呢?
我们发现给出的题意中只是小的字符一定会加上与比它大的字符的距离
数据范围是50 我们知道了最大的字符
我们考虑如何去找第二大的字符 显然第二大的字符只会加上与最大字符的距离
我们直接枚举一维 计算与大字符的贡献 要是相等就加入
这样我们就能维护出每一个字符有多少个 在哪些个位置
我们发现他说了一定有解
所以我们直接匹配就可以了 不用判断无解的情况
没什么细节 就是代码写的很屎

void solve() {
    string s;cin >> s;s = ")" + s;
    int n;cin >> n;
    int cnt = n, q = 1;
    vector<int> a(n + 10), v, st(26), vis(n + 10), z[26];
    for (int i = 1; i < s.size(); i++)st[i - 'a']++;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        if (!a[i]) { v.push_back(i), z[0].push_back(i), cnt--, vis[i] = 1; }
    }
    while (cnt) {
        vector<int> pre;
        for (int i = 1; i <= n; i++) {
            int res = 0;
            for (auto pos: v) {
                if (i == pos)continue;
                res += abs(pos - i);
            }
            if (a[i] == res && !vis[i])pre.push_back(i), z[q].push_back(i), cnt--, vis[i] = 1;
        }
        while (pre.size()) { v.push_back(pre.back()), pre.pop_back(); }
        q++;
    }
    vector<char> ans(n + 10);
    for (int i = 25, j = 0; i >= 0; i--) {
        if (z[j].size() == 0)break;
        if (st[i] && st[i] >= z[j].size()) {
            for (auto k: z[j])ans[k] = i + 'a';
            j++;
        }
    }
    for (int i = 1; i <= n; i++)cout << ans[i];cout << endl;
}
posted @ 2022-11-01 14:35  ycllz  阅读(22)  评论(0)    收藏  举报