记录编号 |
606973 |
评测结果 |
TTTTTTTTTTTTTTTTTTTT |
题目名称 |
4084.魔法卡片 |
最终得分 |
0 |
用户昵称 |
二乾五 |
是否通过 |
未通过 |
代码语言 |
C++ |
运行时间 |
37.968 s |
提交时间 |
2025-10-04 20:11:17 |
内存使用 |
101.92 MiB |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define cpy(a,b) copy(begin(a),end(a),begin(b))
#define ld long double
#define dot(x) fixed<<setprecision(x)
#define foru(a,b,c) for(ll a=b;a<=c;a++)
ll n,m,q,lg,a[2000005],sum,val[2000005];
vector<vector<ll>>v(2000005);
vector<vector<ll>>ans(2000005);
int main(){
cin>>n>>m>>q;
lg=log2(m)+1;
foru(i,1,m){
sum+=i*i;
}
foru(i,1,n){
v[i].resize(m+2);
ll x;
cin>>x;
foru(j,1,x){
ll y;
cin>>y;
v[i][y]=1;
}
}
foru(l,1,n){
ans[l].resize(lg+1);
foru(i,1,m)a[i]=0;
foru(r,l,min(n,l+lg)){
foru(i,1,m)a[i]=(a[i]<<1)|v[r][i],val[a[i]]+=i*i;
ll res=sum;
foru(i,0,(1<<(r-l+1))-1){
res=min(res,val[i]),val[i]=0;
}
ans[l][r-l]=sum-res;
}
}
while(q--){
ll l,r;
cin>>l>>r;
if(r-l+1>lg){
cout<<sum<<endl;
}else{
cout<<ans[l][r-l]<<endl;
}
}
return 0;
}