比赛 |
国庆欢乐赛2 |
评测结果 |
EEEETTTTWWWWEEEEEEEE |
题目名称 |
魔法卡片 |
最终得分 |
0 |
用户昵称 |
梦那边的美好AC |
运行时间 |
11.342 s |
代码语言 |
C++ |
内存使用 |
3.53 MiB |
提交时间 |
2025-10-04 11:13:46 |
显示代码纯文本
#include<iostream>
#include<cstring>
using namespace std;
const int MAXM = 10;
const int MAXN = 1000005;
int P[1 << MAXM];
int s[MAXN], t[MAXN];
int n, m, Q;
int main() {
freopen("magic.in", "r", stdin);
freopen("magic.out", "w", stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m >> Q;
for(int p = 0;p < (1 << m);p ++){
int sum = 0;
for(int j = 0;j < m;j ++){
if(p & (1 << j)){
sum += (j + 1) * (j + 1);
}
}
P[p] = sum;
}
for(int i = 1;i <= n;i ++){
int u; cin >> u;
int p = 0;
for(int j = 0;j < u;j ++){
int x; cin >> x;
p |= 1 << (x - 1);
}
s[i] = p; t[i] = ((1 << m) - 1) ^ p;
// cout << s[i] << ' ' << t[i] << '\n';
}
while(Q --){
int l, r; cin >> l >> r;
int dp[1 << MAXM];
memset(dp, 0, sizeof(dp));
dp[s[l]] = 1;
dp[t[l]] = 1;
for(int k = l + 1;k <= r;k ++){
int f[1 << MAXM];
memset(f, 0, sizeof(0));
for(int p = 0;p < (1 << m);p ++){
if(dp[p]){
f[p | s[k]] = 1;
f[p | t[k]] = 1;
}
}
for(int p = 0;p < (1 << m);p ++){
// cout << f[p] << ' ';
dp[p] = f[p];
}
// cout << '\n';
}
int maxx = 0;
for(int p = 0;p < (1 << m);p ++){
if(dp[p] && P[p] > maxx){
maxx = P[p];
}
}
cout << maxx << '\n';
}
return 0;
}