QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#635184#9457. Prime Setucup-team3510#AC ✓57ms7212kbC++141.6kb2024-10-12 19:14:202024-10-12 19:14:20

Judging History

你现在查看的是测评时间为 2024-10-12 19:14:20 的历史记录

  • [2024-10-13 19:28:00]
  • 自动重测本题所有获得100分的提交记录
  • 测评结果:AC
  • 用时:55ms
  • 内存:7184kb
  • [2024-10-13 19:27:24]
  • hack成功,自动添加数据
  • (/hack/967)
  • [2024-10-13 18:39:00]
  • 管理员手动重测本题所有得分≥97分的提交记录
  • 测评结果:100
  • 用时:58ms
  • 内存:6612kb
  • [2024-10-13 18:24:51]
  • hack成功,自动添加数据
  • (/hack/965)
  • [2024-10-13 18:17:54]
  • hack成功,自动添加数据
  • (/hack/963)
  • [2024-10-12 19:14:20]
  • 评测
  • 测评结果:100
  • 用时:57ms
  • 内存:7212kb
  • [2024-10-12 19:14:20]
  • 提交

answer

#include<iostream>
#include<vector>
#include<bitset>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=2e6;
int T,n,m,a[3010],p[3010];
bool mark[N+10];
vector<int> v[2];
bitset<3010> e[3010],V;
bool dfs(int now)
{
	while(1)
	{
		int t=(e[now]&V)._Find_first();
		if(t>v[1].size())
		{
			return 0;
		}
		V.reset(t);
		if(p[t]<0||dfs(p[t]))
		{
			p[t]=now;
			return 1;
		}
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	for(int i=2;i<=N;i++)
	{
		if(!mark[i])
		{
			for(int j=i<<1;j<=N;j+=i)
			{
				mark[j]=1;
			}
		}
	}
	cin>>T;
	while(T--)
	{
		cin>>n>>m;
		v[0].clear(),v[1].clear();
		for(int i=1;i<=n;i++)
		{
			cin>>a[i];
			v[a[i]+1&1].emplace_back(a[i]);
		}
		int cnt=n,ans=0,f=0;
		for(int i=1;i<=n;i++)
		{
			bool flag=1;
			for(int j=1;j<=n;j++)
			{
				if(i==j)
				{
					continue;
				}
				if(!mark[a[i]+a[j]])
				{
					flag=0;
					break;
				}
			}
			cnt-=flag;
		}
		sort(v[0].begin(),v[0].end());
		sort(v[1].begin(),v[1].end());
		for(int i=0;i<v[0].size();i++)
		{
			e[i].reset();
			for(int j=0;j<v[1].size();j++)
			{
				if(!mark[v[0][i]+v[1][j]])
				{
					e[i].set(j);
				}
			}
		}
		memset(p,-1,sizeof(p));
		for(int i=v[0].size()-1;i>=0;i--)
		{
			V.set();
			if(dfs(i))
			{
				ans++;
			}
			else
			{
				if(v[0][i]==1)
				{
					f=i+1>>1;
					break;
				}
				int j=i-1;
				while(j>=0&&v[0][j]==v[0][i])
				{
					j--;
				}
				i=j+1;
			}
		}
		ans+=f;
		if(m>=ans)
		{
			int t=(ans<<1)+m-ans;
			cout<<min(cnt,t)<<'\n';
			continue;
		}
		cout<<(m<<1)<<'\n';
	}
	return 0;
}

这程序好像有点Bug,我给组数据试试?

详细

Test #1:

score: 100
Accepted
time: 7ms
memory: 5556kb

input:

4
4 2
2 3 4 5
5 3
3 4 12 3 6
6 3
1 3 6 8 1 1
1 0
1

output:

4
3
6
0

result:

ok 4 lines

Test #2:

score: 0
Accepted
time: 57ms
memory: 7212kb

input:

110
3 3
2 2 2
3 1
1 1 1
3 2
1 1 1
3 3
1 1 1
4 2
1 1 1 1
10 7
1 1 1 2 4 6 8 10 12 14
18 1
10 5 9 4 10 7 2 4 9 1 6 1 4 9 2 4 9 7
19 5
1 6 1 8 8 1 5 10 9 2 10 2 1 9 6 10 4 3 6
14 4
6 6 8 9 5 3 4 9 2 2 1 10 10 1
15 10
5 4 2 4 10 1 8 4 10 3 10 3 7 10 4
17 5
10 7 2 4 3 1 10 8 2 8 3 4 1 1 1 1 1
20 6
8 4 6 ...

output:

0
2
3
3
4
8
2
10
8
15
10
12
10
10
12
16
10
10
12
16
14
13
13
14
17
0
19
12
12
11
16
10
19
2
12
10
5
14
10
10
13
2
18
2
4
4
11
8
11
8
0
10
10
0
10
0
8
15
12
11
13
18
10
17
9
8
20
19
13
6
4
6
11
9
13
11
6
2
8
12
17
14
6
2
20
2
18
17
6
2
10
0
7
16
2
2
0
2
18
14
11
8
4
6
0
19
890
204
2746
2372

result:

ok 110 lines

Extra Test:

score: 0
Extra Test Passed