QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#631729 | #9457. Prime Set | ucup-team4863# | AC ✓ | 28ms | 10324kb | C++14 | 2.0kb | 2024-10-12 09:58:48 | 2024-10-13 18:37:43 |
Judging History
answer
// created: 2024-10-12 09:27:04
#include<cstdio>
#include<cctype>
#include<algorithm>
#define F(i,l,r) for(int i=l,i##_end=r;i<i##_end;++i)
#define I128 //||is_same<T,__int128_t>::value||is_same<T,__uint128_t>::value
using namespace std;
template<typename T>enable_if_t<is_integral<T>::value I128,void> readmain(T &x)
{
bool neg=false;int c=getchar();
for(;!isdigit(c);c=getchar())if(c=='-')neg=true;
for(x=0;isdigit(c);c=getchar())x=(T)(10*x+(c-'0'));
if(neg)x=-x;
}
template<typename T>T& read(T &x){readmain(x);return x;}
template<typename T,typename ...Tr>void read(T &x,Tr&... r){readmain(x);read(r...);}
constexpr int N=3005,M=2e6;
bool pri[M],g[N][N];
int n,k,n2,a1[N],a2[N],ma[N],ima[N],d[N],q[N],qf,qr;
bool v1[N],v2[N],vis[N];
bool dfs(int u)
{
F(v,0,n2)if(g[u][v])
{
if(!~ima[v])return ima[ma[u]=v]=u,d[u]=-1,true;
else if(d[ima[v]]==d[u]+1&&dfs(ima[v]))return ima[ma[u]=v]=u,d[u]=-1,true;
}
d[u]=-1;
return false;
}
bool bfs(int n1)
{
F(i,0,n1)d[i]=-1;
qf=qr=0;
F(i,0,n1)if(!~ma[i])d[q[qr++]=i]=0;
while(qf<qr)
{
int u=q[qf++];
F(v,0,n2)if(g[u][v])
{
if(!~ima[v])return true;
else if(!~d[ima[v]])d[q[qr++]=ima[v]]=d[u]+1;
}
}
return false;
}
int run(int n1)
{
int ans=0;
while(bfs(n1))F(i,0,n1)if(!d[i])ans+=dfs(i);
return ans;
}
int n1;
void solve()
{
read(n,k);
int rn=0;
n1=n2=0;
int one=0;
F(i,0,n)
{
int a;read(a);
if(a==1)++one;
else if(a&1)a1[n1++]=a;
else a2[n2++]=a;
}
F(i,0,one)a1[n1++]=1;
F(i,0,n1)v1[i]=false;
F(i,0,n2)v2[i]=false;
if(one>1)F(i,n1-one,n1)v1[i]=true;
F(i,0,n1)F(j,0,n2)if((g[i][j]=pri[a1[i]+a2[j]]))v1[i]=v2[j]=true;
F(i,0,n1)rn+=v1[i];
F(i,0,n2)rn+=v2[i];
F(i,0,n1)ma[i]=-1;
F(i,0,n2)ima[i]=-1;
int m1=run(n1-one);
int m2=run(n1);
int mm=m1+m2+((one-m2)>>1);
int ans=min(min(k,mm)+k,rn);
printf("%d\n",ans);
}
int main()
{
F(i,2,M)pri[i]=true;
F(i,2,M)if(pri[i])for(int j=2*i;j<M;j+=i)pri[j]=false;
int tt;read(tt);
while(tt--)solve();
return 0;
}
这程序好像有点Bug,我给组数据试试?
詳細信息
Test #1:
score: 100
Accepted
time: 9ms
memory: 3848kb
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: 28ms
memory: 10324kb
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