比赛 |
国庆欢乐赛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;
}