比赛 20241125 评测结果 AWWAAAAAW
题目名称 夏娜的菠萝包 最终得分 67
用户昵称 flyfree 运行时间 0.101 s
代码语言 C++ 内存使用 3.34 MiB
提交时间 2024-11-25 10:50:25
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define ll long long
inline ll read(){
	ll x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=x*10+c-'0';
		c=getchar();
	}
	return x*f;
}
ll ans,n,m,cnt;
ll t[50],d[50],lim[50];
ll sumt[50],sumd[50],_lim[50],_use[50];
struct node{
	ll d,t,lim;
};
node s[50];
bool cmp(node a,node b){
	return a.lim==b.lim?a.d<b.d:a.lim<b.lim;
}
struct bcj{
	ll f[50],siz;
	void mk(){
		memset(f,0,sizeof(f));
		for(int i=0;i<=siz;i++){
			f[i]=i;
		}
	}
	ll find(ll x){
//		cout<<x<<" "<<f[x]<<endl;
//		return f[x]==x?x:(f[x]=find(f[x]))1;
		if(f[x]==x)return x;
		else return f[x]=find(f[x]);
	}
	void merge(ll x,ll y){
		f[find(x)]=find(y);
	}
	ll re(ll x){
		ll fa=find(x);
		if(fa<=0)return -1;
		merge(fa,fa-1);
		return fa;
	}
};
ll work(ll pre){
	cnt=0;
	ll ansz=0;
	for(int i=1;i<=m;i++){
		if(pre&(1<<i-1)){
			s[++cnt]=(node){sumd[i],sumt[i],_lim[i]};				
		}
	}
	for(int i=1;i<=cnt;i++){
		s[i].lim=min(cnt,s[i].lim);
	}
	sort(s+1,s+1+cnt,cmp);
	bcj k;
	k.siz=cnt;
	k.mk();
	for(int i=1;i<=cnt;i++){
		ll now=k.re(s[i].lim);
//		cout<<s[i].t<<" "<<s[i].d<<" "<<s[i].lim<<" "<<now<<endl;
		if(now==-1)return -1;
		ansz+=s[i].t-s[i].d*(now-1);
	}
	return ansz;
}
void dfs(ll i,ll used,ll pre){
	if(i>m){
		ans=max(ans,work(pre));
		return;
	}
	if(!(used&_use[i]))dfs(i+1,used|_use[i],pre|(1<<i-1));
	dfs(i+1,used,pre);
}
int main(){
	freopen("shana.in","r",stdin);
	freopen("shana.out","w",stdout);
	while(1){
		n=read(),ans=0;
		if(!n)break;
		for(int i=1;i<=n;i++){
			t[i]=read(),d[i]=read();
			lim[i]=(t[i]-1)/d[i]+2;
		}
		m=read();
		for(int i=1;i<=m;i++){
			ll k=read(),e=read();
			sumt[i]=e,sumd[i]=0,_lim[i]=1e9,_use[i]=0;
			for(int j=1;j<=k;j++){
				ll p=read();
				sumt[i]+=t[p],sumd[i]+=d[p];
				_lim[i]=min(_lim[i],lim[p]);
				_use[i]|=(1<<p-1);
			}
		}
		dfs(1,0,0);
		cout<<ans<<endl;
	}
	return 0;
}