记录编号 606903 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 4084.魔法卡片 最终得分 100
用户昵称 Gravatar梦那边的美好AC 是否通过 通过
代码语言 C++ 运行时间 6.715 s
提交时间 2025-10-04 16:52:00 内存使用 31.94 MiB
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
const int N = 1e6 + 10;
const int M = 1e6 + 10;

int n, m, q, B;
ll sum;
vector<int> c[N];
ll p[N][21];
ll f[1 << 20];
ll w[M];

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> m >> q;
    B = m ? ceil(log2(m)) : 0;
    for(int i = 1;i <= n;i ++){
        int x; cin >> x;
        c[i].resize(m + 1, 0);
        for(int j = 0;j < x;j ++){
            int v; cin >> v;
            c[i][v] = 1;
        }
    }
    sum = 0;
    for(int i = 1;i <= m;i ++) sum += (ll)i * i;
    for(int i = 1; i <= n;i ++){
        memset(w, 0, sizeof(ll) * (m + 1));
        for (int j = i, l = 1;j <= min(i + B - 1, n);j ++, l ++){
            memset(f, 0, sizeof(ll) * (1 << l));
            for(int k = 1;k <= m;k ++){
                w[k] = (w[k] << 1) | c[j][k];
                f[w[k]] += (ll)k * k;
            }
            ll minx = sum;
            for(int k = 0;k < (1 << l);k ++) minx = min(minx, f[k]);
            p[i][l] = sum - minx;
        }
    }
    while(q --){
        int l, r; cin >> l >> r;
        int len = r - l + 1;
        if (len > B) cout << sum << '\n';
        else cout << p[l][len] << '\n';
    }
    return 0;
}