==好题,注意题目数据范围的特殊性
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<map>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
using namespace std;
const int N=1e4+5;
const int M=200000;
int W[N],T[N];
LL dp[200005];
int last[200005][55];
map<LL,int>f;
int main()
{
//freopen("a.txt","r",stdin);
f.clear();
for(int i=0;i<=61;i++)f[(LL)1<<i]=i;
int tt;
scanf("%d",&tt);
while(tt--)
{
int n,q;
scanf("%d%d",&n,&q);
for(int i=0;i<n;i++)
{
scanf("%d%d",&W[i],&T[i]);
}
memset(dp,0,sizeof(dp));
dp[0]=1;
for(int i=0;i<n;i++)
{
for(int j=M;j>=T[i];j--)if(dp[j-T[i]])
{
LL tp=(dp[j-T[i]]&(((LL)1<<(51-W[i]))-1))<<W[i];
tp=tp|dp[j];
if(tp^dp[j])
{
LL t=dp[j]^tp;dp[j]=tp;
while(t)
{
last[j][f[t&-t]]=i;
t-=t&-t;
}
}
}
}
while(q--)
{
int w,t;
scanf("%d%d",&w,&t);
if((dp[t]>>w)&1)
{
int flag=0;
while(1)
{
int tw=last[t][w];
if(flag)printf(" ");
else flag=1;
printf("%d",tw+1);
w-=W[tw],t-=T[tw];
if(t==0&&w==0)break;
}
printf("\n");
}
else printf("No solution!\n");
}
}
return 0;
}

1222

被折叠的 条评论
为什么被折叠?



