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