关于刚才的 CF D
  • 板块学术版
  • 楼主Acfboy
  • 当前回复11
  • 已保存回复11
  • 发布时间2021/9/21 00:38
  • 上次更新2023/11/4 06:00:25
查看原帖
关于刚才的 CF D
40318
Acfboy楼主2021/9/21 00:38

D 怎么那么多人过

我的想法是两个合并的时候若 i,ji, j 可以组成最大,那么下一次只有可能是 (i+1,j),(i,j+1)(i+1, j), (i, j+1) 组成最大,那么这样两两合并做 (n1)(n-1) 次就可以了。

然而 WA on 5

#include <iostream>
#include <set>
#include <vector>
#include <iterator>
#include <algorithm>
#include <functional>
#define int long long
int n, k, m;
std::vector<int> a[15];
struct dwd {
    int a, x, y;
    dwd(int _a, int _x, int _y) { a = _a, x = _x, y = _y; }
    bool operator < (dwd b) const { return a > b.a; }
};
struct twt {
    std::vector<int> b;
    int val;
    void push(int x) { 
        int now = b.size(); 
        b.push_back(x), val += a[now+1][x]; 
    }
    twt(int x) { val = 0; b.clear();  push(x); }
    twt() { b.clear(); val = 0; }
    bool operator < (const twt &b) const { return val > b.val; }
    bool operator != (const twt &z) {
        for (int i = 0; i < n; i++) if (b[i] != z.b[i]) return true;
        return false;
    }
    void print() { 
        for (int i = 0; i < (int)b.size(); i++) 
            std::cout << a[i+1][0]-b[i]+1 << ' '; 
    }
};
std::vector<twt> s, tmp, fo;
std::set<dwd> t;
void merge(int q) {
    t.clear(), tmp.clear();
    t.insert(dwd(s[0].val + a[q][1], 0, 1));
        // std::cout << q << ':' << s[0].val << '\n';
    // int cnt = 0;
    // std::cout << m << "&\n";
    while (tmp.size() <= m+1  && !t.empty()) {
        int i = t.begin()->x, j = t.begin()->y;
        t.erase(t.begin());
        twt cur = s[i];
        cur.push(j);
        tmp.push_back(cur);
        if (i+1 < (int)s.size()) t.insert(dwd(s[i+1].val + a[q][j], i+1, j));
        if (j+1 <= a[q][0]) t.insert(dwd(s[i].val + a[q][j+1], i, j+1));
        // cnt ++;
    }
    // std::cout << tmp.size() << '\n';
    s = tmp;
}
signed main() {
    std::cin >> n;
    for (int i = 1; i <= n; i++) {
        std::cin >> k;
        a[i].resize(k+1), a[i][0] = k;
        for (int j = 1; j <= k; j++) std::cin >> a[i][j];
        std::sort(std::next(a[i].begin()), a[i].end(), std::greater<int>());
    } 
    std::cin >> m;
    for (int i = 1; i <= a[1][0]; i++) s.push_back(twt(i));
    std::sort(s.begin(), s.end());
    // std::cout << s.size();
    for (int i = 2; i <= n; i++) {
        // std::cout << s.size() <<m '\n';
        merge(i);
        // for (int i = 0; i < (int)s.size(); i++) {
            // s[i].print();
            // std::cout << "*\n";
        // }
    }
    for (int i = 1; i <= m; i++) {
        twt cur;
        for (int j = 1; j <= n; j++) std::cin >> k, cur.push(a[j][0]-k+1);
        fo.push_back(cur);
    }
    std::sort(fo.begin(), fo.end());
    // fo[0].print();
    int j = 0;
    // std::cout << s.size() << '\n';
    for (auto cur : s) {
        if (j >= (int)fo.size() || cur != fo[j]) return cur.print(), 0;
        j ++;
    }
}

为啥 WA 了?

这么做是不是复杂了啊,那么多人过。

真的被 edu 给教育了

2021/9/21 00:38
加载中...