比赛 |
国庆欢乐赛2 |
评测结果 |
TTTTEEEETTTTTTTTTTTT |
题目名称 |
魔法卡片 |
最终得分 |
0 |
用户昵称 |
会挽弯弓满月 |
运行时间 |
32.687 s |
代码语言 |
C++ |
内存使用 |
14.41 MiB |
提交时间 |
2025-10-04 12:06:22 |
显示代码纯文本
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const ll N=1e6,M=1e4+10;
ll n,m,q;
ll x[N],vis[N];
ll s[M][M];
ll l,r,ans;
void dfs(ll now,ll res){
if(now>r){
ans=max(ans,res);
return;
}
ll len=x[now];
for(ll i=1;i<=len;i++){
if(vis[s[now][i]]) continue;
vis[s[now][i]]=now;
res+=(s[now][i]*s[now][i]);
}
dfs(now+1,res);
for(ll i=1;i<=len;i++){
if(vis[s[now][i]]==now)
res-=(s[now][i]*s[now][i]);
}
for(ll i=1;i<=m;i++){
if(vis[i]==now){
vis[i]=0;
continue;
}
if(!vis[i]){
res+=(i*i);
vis[i]=now;
}
}
dfs(now+1,res);
for(ll i=1;i<=m;i++){
if(vis[i]==now) vis[i]=0;
}
return;
}
int main(){
freopen("magic.in","r",stdin);
freopen("magic.out","w",stdout);
scanf("%lld%lld%lld",&n,&m,&q);
for(ll i=1;i<=n;i++){
scanf("%lld",&x[i]);
for(ll j=1;j<=x[i];j++)
scanf("%lld",&s[i][j]);
}
while(q--){
scanf("%lld%lld",&l,&r);
ans=0;
for(ll i=1;i<=m;i++) vis[i]=0;
dfs(l,0);
printf("%lld\n",ans);
}
return 0;
}