2020 Multi-University Training Contest 4 Contest of Rope Pulling
就 想不到还能这么搞。学到了
标程:有那么一点点复杂,但是会更优(更快)一点。
个人(参考了博客:
//#pragma GCC optimize(2)
#include
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const int mod=998244353;
const int inf=0x3f3f3f3f;
const int maxn=1e6+5;
struct P{
int w,v,ly;
}a[2005];
mt19937 mt(time(0));
ll f[maxn];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d%d",&a[i].w,&a[i].v),a[i].ly=1;
for(int i=1;i<=m;i++)scanf("%d%d",&a[i+n].w,&a[i+n].v),a[i+n].ly=-1;
shuffle(a+1,a+1+n+m,mt);
int up=80000;ll ans=0;
mem(f,-inf);f[40000]=0;
for(int i=1;i<=n+m;i++)
{
if(a[i].ly>0){
for(int j=up;j>=a[i].w;j--)
f[j]=max(f[j],f[j-a[i].w]+a[i].v);
}
else {
for(int j=0;j<=up-a[i].w;j++)
f[j]=max(f[j],f[j+a[i].w]+a[i].v);
}
ans=max(ans,f[40000]);
}
printf("%lld\n",ans);
}
}