比赛 国庆欢乐赛2 评测结果 TTTTTTTTTTTTTTTTTTTT
题目名称 魔法卡片 最终得分 0
用户昵称 LikableP 运行时间 40.011 s
代码语言 C++ 内存使用 52.96 MiB
提交时间 2025-10-04 10:24:25
显示代码纯文本
#include <iostream>
#include <unordered_map>
#include <vector>
using namespace std;
typedef long long ll;

const int MAXN = 1e6 + 10;

int n, m, Q;
vector<int> frontnum[MAXN], backnum[MAXN];
unordered_map<int, bool> vis;

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;
  for (int i = 1, x; i <= n; ++i) {
    vis.clear();
    cin >> x;
    for (int j = 1, num; j <= x; ++j) {
      cin >> num;
      frontnum[i].push_back(num);
      vis[num] = 1;
    }
    for (int j = 1; j <= m; ++j) {
      if (!vis[j]) backnum[i].push_back(j);
    }
  }
  
  for (int l, r; Q--; ) {
    ll ans = 0;
    cin >> l >> r;
    int len = r - l + 1;
    for (int cover = 0; cover <= (1 << len) - 1; ++cover) {
      ll sum = 0;
      vis.clear();
      for (int i = l; i <= r; ++i) {
        if ((cover >> (i - l)) & 1) {
          for (int x : backnum[i]) if (!vis[x]) sum += (ll)x * x, vis[x] = 1;
        } else {
          for (int x : frontnum[i]) if (!vis[x]) sum += (ll)x * x, vis[x] = 1;
        }
      }
      ans = max(ans, sum); 
    }
    cout << ans << endl;
  }
  return 0;
}