比赛 |
国庆欢乐赛2 |
评测结果 |
EEEEEEEETTTTTTTTTTTT |
题目名称 |
魔法卡片 |
最终得分 |
0 |
用户昵称 |
对立猫猫对立 |
运行时间 |
26.412 s |
代码语言 |
C++ |
内存使用 |
4.46 MiB |
提交时间 |
2025-10-04 11:06:57 |
显示代码纯文本
#include <bits/stdc++.h>
#define int long long
#define For(i, a, b) for(register int i = a; i <= b; i++)
using namespace std;
int n, m, q;
vector<int> cards[1005];
int dp[1025], ans;
bool vis[1005], num[1005], vis1[1005];
int calc(int l, int r) {
memset(num, false, sizeof num);
For(i, l, r) {
if(!vis[i]) {
For(j, 0, cards[i].size() - 1) num[cards[i][j]] = 1;
}
else {
memset(vis1, false, sizeof vis1);
For(j, 0, cards[i].size() - 1) vis1[cards[i][j]] = 1;
For(j, 1, m) num[j] = !vis1[j];
}
}
int out = 0;
For(i, 1, m) {
if(num[i]) out += i * i;
}
return out;
}
void dfs(int u, int v, int idx) {
if(idx == v + 1) {
ans = max(ans, calc(u, v));
return;
}
else {
vis[idx] = 1;
dfs(u, v, idx + 1);
vis[idx] = 0;
dfs(u, v, idx + 1);
}
}
signed main() {
freopen("magic.in", "r", stdin);
freopen("magic.out", "w", stdout);
cin >> n >> m >> q;
int sum = 0;
For(i, 1, m) sum += i * i;
For(i, 1, n) {
int x, op, nowsum = 0;
cin >> x;
For(j, 1, x) {
cin >> op;
nowsum += op * op;
cards[i].push_back(op);
}
dp[i] = max(nowsum, sum - nowsum);
}
For(i, 1, q) {
ans = 0;
int l, r;
cin >> l >> r;
if(l == r) cout << dp[l] << endl;
else dfs(l, r, l), cout << ans << endl;
}
return 0;
}