比赛 国庆欢乐赛2 评测结果 TTTTTTTTTTTTTTTTTTTT
题目名称 魔法卡片 最终得分 0
用户昵称 wdsjl 运行时间 39.634 s
代码语言 C++ 内存使用 17.96 MiB
提交时间 2025-10-04 11:45:17
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;

int main() {
	freopen("magic.in","r",stdin);
	freopen("magic.out","w",stdout);
    ios::sync_with_stdio(false);
    cin.tie(0);

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

    vector<unordered_set<int>> s(n + 1);
    for (int i = 1; i <= n; ++i) {
        int x;
        cin >> x;
        unordered_set<int> t;
        for (int j = 0; j < x; ++j) {
            int v;
            cin >> v;
            t.insert(v);
        }
        s[i] = t;
    }

    long long ts = 0;
    for (int x = 1; x <= m; ++x) ts += (long long)x * x;

    const int MK = 19;
    vector<vector<long long>> pre(n + 2, vector<long long>(MK + 1, 0));

    for (int k = 1; k <= MK; ++k) {
        for (int l = 1; l + k - 1 <= n; ++l) {
            int r = l + k - 1;

            unordered_set<int> u;
            long long su = 0;
            for (int i = l; i <= r; ++i) {
                for (int x : s[i]) {
                    if (u.insert(x).second) {
                        su += (long long)x * x;
                    }
                }
            }

            long long s0 = ts - su;
            int mc = 1 << k;
            vector<long long> f(mc, 0);
            f[0] = s0;

            for (int x : u) {
                int ma = 0;
                for (int j = 0; j < k; ++j) {
                    int c = l + j;
                    if (s[c].count(x)) {
                        ma |= (1 << j);
                    }
                }
                f[ma] += (long long)x * x;
            }

            long long mn = *min_element(f.begin(), f.end());
            pre[l][k] = mn;
        }
    }

    while (Q--) {
        int l, r;
        cin >> l >> r;
        int k = r - l + 1;
        if (k >= 20) {
            cout << ts << '\n';
        } else {
            cout << ts - pre[l][k] << '\n';
        }
    }

    return 0;
}