QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#465987#8005. Crossing the Borderucup-team052#WA 3435ms274224kbC++144.6kb2024-07-07 14:30:312024-07-07 14:30:32

Judging History

你现在查看的是最新测评结果

  • [2024-07-07 14:30:32]
  • 评测
  • 测评结果:WA
  • 用时:3435ms
  • 内存:274224kb
  • [2024-07-07 14:30:31]
  • 提交

answer

#pragma GCC optimize("Ofast")
#pragma GCC target("avx2")
#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define eb emplace_back
//mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
#define mod 998244353
#define ll long long
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
inline int read()
{
	char ch=getchar(); int nega=1; while(!isdigit(ch)) {if(ch=='-') nega=-1; ch=getchar();}
	int ans=0; while(isdigit(ch)) {ans=ans*10+ch-48;ch=getchar();}
	if(nega==-1) return -ans;
	return ans;
}
void print(vector<int> x){for(int i=0;i<(int)x.size();i++) printf("%d%c",x[i]," \n"[i==(int)x.size()-1]);}
inline int add(int x,int y) {return x+y>=mod?x+y-mod:x+y;}
inline int add(int x,int y,int z) {return add(add(x,y),z);}
inline int sub(int x,int y) {return x-y<0?x-y+mod:x-y;}
inline int mul(int x,int y) {return 1LL*x*y%mod;}
inline int mul(int x,int y,int z) {return mul(mul(x,y),z);}
#define inc(x,y) x+=y
#define dec(x,y) x=sub(x,y)
#define N 20
struct Node
{
	int w,c;
};
Node a[N+2];
bool cmp(Node x,Node y) {return x.c<y.c;}
int n,W,mn[1<<N],cnt[1<<N];
int sum[1<<N];
void bf()
{
	sort(a,a+n,cmp);
	for(int i=1;i<1<<n;i++)
	{
		int u=__builtin_ctz(i);
		sum[i]=sum[i^(1<<u)]+a[u].w;
	}
	mn[0]=0,cnt[0]=1;
	int ful=(1<<n)-1;
	for(int i=1;i<1<<n;i++)
	{
		mn[i]=inf;
		int u=31-__builtin_clz(i);
		for(int st=i;st>=(1<<u);st=i&(st-1))
		{
			if(sum[st]<=W)
			{
				if(mn[i^st]+a[u].c<mn[i]) mn[i]=mn[i^st]+a[u].c,cnt[i]=0;
				if(mn[i^st]+a[u].c==mn[i]) inc(cnt[i],cnt[i^st]);
			}
		}
	}
	printf("%d %d\n",mn[ful],cnt[ful]);
}
int l=20;
void fwt(int *f){
	for(int i=1;i<(1<<l);i<<=1)for(int j=0;j<(1<<l);j+=i<<1)for(int k=0;k<i;++k){
		f[i+j+k]=add(f[i+j+k],f[j+k]);
	}
}
void ifwt(int *f){
	for(int i=1;i<(1<<l);i<<=1)for(int j=0;j<(1<<l);j+=i<<1)for(int k=0;k<i;++k){
		f[i+j+k]=sub(f[i+j+k],f[j+k]);
	}
}
int F[21][1<<N],G[21][1<<N],H[21][1<<N];
void solve()
{
	sort(a,a+n,cmp);
	{
		int ss=0;
		for(int i=0;i<n;i++) ss+=a[i].w;
		if(ss<=W)
		{
			printf("%d %d\n",a[n-1].c,1);
			return ;
		}
	}
	for(int i=1;i<1<<l;i++)
	{
		int u=__builtin_ctz(i);
		sum[i]=sum[i^(1<<u)]+a[u].w;
	}
	mn[0]=0,cnt[0]=1;
	int ful=(1<<l)-1;
	for(int i=1;i<1<<l;i++)
	{
		mn[i]=inf;
		int u=31-__builtin_clz(i);
		for(int st=i;st>=(1<<u);st=i&(st-1))
		{
			if(sum[st]<=W)
			{
				if(mn[i^st]+a[u].c<mn[i]) mn[i]=mn[i^st]+a[u].c,cnt[i]=0;
				if(mn[i^st]+a[u].c==mn[i]) inc(cnt[i],cnt[i^st]);
			}
		}
	}
	// for(int i=1;i<1<<n;i++) printf("%d %d %d\n",i,mn[i],cnt[i]);
	// printf("%d %d\n",mn[ful],cnt[ful]);
	int amn=inf; long long acnt=0;
	if(n==21)
	{
		for(int i=0;i<1<<l;i++)
		{
			if(sum[i]+a[n-1].w<=W)
			{
				if(a[n-1].c+mn[i^ful]<amn) amn=a[n-1].c+mn[i^ful],acnt=0;
				if(a[n-1].c+mn[i^ful]==amn) inc(acnt,cnt[i^ful]);
			}
		}
	}
	else
	{
		for(int i=0;i<1<<l;i++)
		{
			if(sum[i]+a[n-1].w+a[n-2].w<=W)
			{
				if(a[n-1].c+mn[i^ful]<amn) amn=a[n-1].c+mn[i^ful],acnt=0;
				if(a[n-1].c+mn[i^ful]==amn) inc(acnt,cnt[i^ful]);
			}
		}
		int w1=W-a[n-1].w,w2=W-a[n-2].w;
		int tmn=inf; long long tcnt=0;
		/*for(int i=0;i<1<<l;i++)
		{
			int ok1=sum[i]<=w1,ok2=sum[i]<=w2;
			if(!ok1&&!ok2) continue;
			int r=ful^i;
			
			for(int j=r;j>i;j=r&(j-1))
			{
				int to1=sum[j]<=w1,to2=sum[j]<=w2;
				int cntok=(to1&&ok2)+(to2&&ok1);
				if(cntok)
				{
					if(mn[r^j]<tmn) tmn=mn[r^j],tcnt=0;
					if(mn[r^j]==tmn) inc(tcnt,cnt[r^j]<<(cntok-1));
				}
			}
		}*/
		for(int i=0;i<(1<<l);++i){
			if(a[n-1].c+sum[i]<=W)F[__builtin_popcount(i)][i]=1;
			if(a[n-2].c+sum[i]<=W)G[__builtin_popcount(i)][i]=1;
		}
		for(int i=0;i<=l;++i){
			fwt(F[i]);
			fwt(G[i]);
		}
		for(int j=0;j<=l;++j){
			for(int k=0;k+j<=l;++k){
				for(int i=0;i<(1<<l);++i){
					H[j+k][i]=add(H[j+k][i],mul(F[j][i],G[k][i]));
				}
			}
		}
		for(int i=0;i<=l;++i){
			ifwt(H[i]);
		}
		for(int i=0;i<(1<<l);++i){
			int cur=H[__builtin_popcount(i)][i];
			if(cur){
				if(a[n-1].c+a[n-2].c+mn[ful^i]<amn){
					amn=a[n-1].c+a[n-2].c+mn[ful^i];
					acnt=0;
				}
				if(a[n-1].c+a[n-2].c+mn[ful^i]==amn){
					inc(acnt,mul(cur,cnt[ful^i]));
				}
			}
		}
		int ful=(1<<l)-1;
		if(a[n-1].c+a[n-2].c+mn[ful]<amn) amn=a[n-1].c+a[n-2].c+mn[ful],acnt=0;
		if(a[n-1].c+a[n-2].c+mn[ful]==amn) inc(acnt,cnt[ful]);
		if(tmn+a[n-1].c+a[n-2].c<amn) amn=tmn+a[n-1].c+a[n-2].c;
		if(tmn+a[n-1].c+a[n-2].c==amn) inc(acnt,tcnt);
	}
	printf("%d %lld\n",amn,acnt%mod);
}
signed main()
{
#ifdef xay5421
	freopen("a.in","r",stdin);
#endif
	cin>>n>>W;
	for(int i=0;i<n;i++) a[i].w=read(),a[i].c=read();
	if(n<=20) bf();
	else solve();
	
	return 0;
}


詳細信息

Test #1:

score: 100
Accepted
time: 1ms
memory: 7912kb

input:

5 5
3 5
1 4
2 3
2 2
2 1

output:

9 4

result:

ok 2 number(s): "9 4"

Test #2:

score: 0
Accepted
time: 228ms
memory: 8936kb

input:

18 10000000
956231 904623
1692946 1796774
1081323 1170319
3218792 2542661
3183376 3037270
1869132 1442561
35436 35018
1564635 1939950
1847344 2006043
755870 899310
1671882 2057413
1369264 1338951
3132483 3504034
2056224 1825640
1840949 1562071
1514040 1405352
2300821 2421801
2466540 3004920

output:

9391997 70

result:

ok 2 number(s): "9391997 70"

Test #3:

score: 0
Accepted
time: 2276ms
memory: 16032kb

input:

20 10000000
1289384 1416015
1692778 1966748
1747794 1708650
2885387 2925290
2516650 2410838
2202363 2092667
368691 407497
1897764 1902790
180541 224758
1089173 1075924
2005212 1743637
702568 566295
465783 369143
2722863 2902398
174068 150211
513930 519657
1634023 1313239
1133070 1040937
961394 11066...

output:

6331196 89

result:

ok 2 number(s): "6331196 89"

Test #4:

score: 0
Accepted
time: 2393ms
memory: 16100kb

input:

21 10000000
1432782 1230128
1693282 1456826
605524 521515
2742745 3427204
2231114 2129928
2345527 2397808
511783 521160
2041234 2313965
2323807 2603481
1232121 1410811
719508 850004
416942 495559
2180169 2579591
1580089 1786914
2317568 2292171
1514260 1143717
1348703 1495001
562052 525544
2818854 23...

output:

9336572 5

result:

ok 2 number(s): "9336572 5"

Test #5:

score: 0
Accepted
time: 3435ms
memory: 274136kb

input:

22 10000000
1562592 1176882
1693226 1513484
2293770 2757728
2612851 3010518
1971354 2392268
2475363 2035487
641627 684375
2171036 2181775
1544541 1633457
1361981 1060447
2277948 2792254
157192 141039
1011327 1139897
541119 577682
1538276 1451191
2423314 2061841
1088919 1154927
42526 43789
1779858 16...

output:

8019829 516

result:

ok 2 number(s): "8019829 516"

Test #6:

score: -100
Wrong Answer
time: 3323ms
memory: 274224kb

input:

22 50000000
9900000 50000000
9800000 50000000
9700000 50000000
9600000 50000000
9500000 50000000
9400000 50000000
9300000 50000000
9200000 50000000
9100000 50000000
9190000 50000000
9180000 50000000
9170000 50000000
9160000 50000000
9150000 50000000
9140000 50000000
9130000 50000000
9120000 50000000...

output:

250000000 944968304

result:

wrong answer 2nd numbers differ - expected: '659827482', found: '944968304'