QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#634534 | #9457. Prime Set | ucup-team4717# | AC ✓ | 413ms | 13404kb | C++17 | 1.9kb | 2024-10-12 17:32:26 | 2024-10-13 18:38:49 |
Judging History
answer
#include<bits/stdc++.h>
#define inl inline
using namespace std;
const int N=3005,IB=1<<21; char IN[IB],*IS=IN+IB,*IT=IS;
#define getchar() (IS==IT&&(IT=IN+fread(IS=IN,1,IB,stdin)),IS==IT?EOF:*IS++)
int n,T,mt[N],un[N],fr[N],vs[N],vt[N]; vector<int> e[N]; queue<int> q;
inl int Read()
{
int s=0; char c; while(!isdigit(c=getchar()));
for(;isdigit(c);c=getchar()) s=s*10+c-'0'; return s;
}
inl int Uni(int p) {return p==un[p]?p:un[p]=Uni(un[p]); }
inl int LCA(int x,int y)
{
for(++T,x=Uni(x),y=Uni(y);vt[x]!=T;vt[x]=T,x=Uni(fr[mt[x]]),y&&(x^=y^=x^=y));
return x;
}
inl void BLS(int x,int y,int t)
{
for(;Uni(x)!=t;x=fr[y])
{
fr[x]=y; vs[y=mt[x]]==2&&(q.push(y),vs[y]=1);
x==Uni(x)&&(un[x]=t); y==Uni(y)&&(un[y]=t);
}
}
inl int Find(int p)
{
while(!q.empty()) q.pop(); for(int i=1;i<=n;++i) vs[un[i]=i]=0;
q.push(p); vs[p]=1; for(int u,t;!q.empty();q.pop())
for(int v:e[u=q.front()]) if(Uni(u)!=Uni(v)&&vs[v]!=2)
{
if(vs[v]) BLS(u,v,t=LCA(u,v)), BLS(v,u,t);
else
{
vs[v]=2; fr[v]=u; if(mt[v]) q.push(mt[v]), vs[mt[v]]=1;
else {for(;v;v=t) t=mt[fr[v]], mt[mt[v]=fr[v]]=v; return 1; }
}
}
return 0;
}
int k;
int a[N];
bool vis[2000005];
void init(int x){
for(int i=2;i<=x;i++)
for(int j=i+i;j<=x;j+=i)
vis[j]=1;
}
void sol(){
n=Read(),k=Read();
for(int i=1;i<=n;i++)a[i]=Read();
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j)continue;
if(!vis[a[i]+a[j]])
e[i].push_back(j);
}
}
int ans=0;
for(int i=1;i<=n;++i) ans+=!mt[i]&&Find(i);
int sum=0;for(int i=1;i<=n;i++)if(e[i].size())sum++;
if(k<=ans)cout<<k*2<<'\n';
else cout<<min(k+ans,sum)<<'\n';
while(!q.empty())q.pop();
fill(mt+1,mt+n+2,0);
fill(un+1,un+n+2,0);
fill(fr+1,fr+n+2,0);
fill(vs+1,vs+n+2,0);
fill(vt+1,vt+n+2,0);
for(int i=1;i<=n+1;i++)e[i].clear();
n=T=0;
}
signed main()
{
init(2e6);
int TT=Read();
while(TT--)sol();
return 0;
}
这程序好像有点Bug,我给组数据试试?
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 36ms
memory: 6348kb
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: 413ms
memory: 13404kb
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