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