记录编号 607020 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 4084.魔法卡片 最终得分 100
用户昵称 GravatarLikableP 是否通过 通过
代码语言 C++ 运行时间 6.539 s
提交时间 2025-10-04 21:15:39 内存使用 7.56 MiB
显示代码纯文本
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
typedef long long ll;

const int MAXN = 1e6 + 10;

int n, m, q;
ll T_all, sq[MAXN], L;
int pat[MAXN], present[MAXN];
ll w[1 << 20];
ll ans[MAXN][21];

int main() {
  freopen("magic.in", "r", stdin);
  freopen("magic.out", "w", stdout);
  cin.tie(0)->sync_with_stdio(false), cout.tie(0);
  cin >> n >> m >> q;
  vector<vector<int>> visable(n + 1);
  for (int i = 1, x; i <= n; ++i) {
    cin >> x;
    visable[i].resize(x);
    for (int j = 1, num; j <= x; ++j) {
      cin >> num;
      visable[i].push_back(num);
    }
  }
  
  for (int i = 1; i <= m; ++i) {
    sq[i] = 1LL * i * i;
    T_all += sq[i];
  }
  
  while ((1LL << (L + 1)) <= m) L++;
  
  if (L > 0) {
    for (int l = 1; l <= n; ++l) {
      memset(pat, 0, (m + 1) * sizeof(int));
      for (int k = 1; k <= L; ++k) {
        int r = l + k - 1;
        if (r > n) break;
        memset(present, 0, (m + 1) * sizeof(int));
        memset(w, 0, ((1 << k) * sizeof(ll)));
        for (int x : visable[r]) present[x] = 1;
        for (int x = 1; x <= m; ++x) {
          pat[x] = pat[x] << 1 | present[x];
          w[pat[x]] += sq[x];
        }
        ll T_min = T_all;
        for (int i = 0; i <= (1 << k) - 1; ++i) {
          if (w[i] < T_min) T_min = w[i];
        }
        ans[l][k] = T_all - T_min;
      }
    }
  }
  
  for (int l, r; q--; ) {
    cin >> l >> r;
    int len = r - l + 1;
    if (len <= L) cout << ans[l][len] << '\n';
    else cout << T_all << '\n';
  }
  return 0;
}