QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#712826 | #9536. Athlete Welcome Ceremony | OneWan# | WA | 0ms | 36272kb | C++23 | 3.7kb | 2024-11-05 17:11:43 | 2024-11-05 17:11:43 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
int a[400];
unordered_map<int,int>sb;
set<pair<int,int>>sx;
unordered_set<int>ss;
unordered_map<int,int>id;
int cnt;
struct edge{
int to;
int next;
int cap;
int cost;
}edge[6600000];
const int N=6600000;
int head[N],tot;
bool vis[N];
int dis[N],level[N];
void addEdge(int x,int y,int cap,int cost){
// cout<<x<<" "<<y<<" "<<cap<<" "<<cost<<'\n';
edge[++tot].to=y;
edge[tot].next=head[x];
edge[tot].cap=cap;
edge[tot].cost=cost;
head[x]=tot;
edge[++tot].to=x;
edge[tot].next=head[y];
edge[tot].cap=0;
edge[tot].cost=-cost;
head[y]=tot;
}
bool SPFA(int S,int T,int n){
for(int i=1;i<=n+1;i++){
dis[i]=1e9;
vis[i]=0;
level[i]=0;
}
dis[S]=0;
level[S]=1;
vis[S]=true;
deque<int>Q;
Q.push_back(S);
while(!Q.empty()){
int x=Q.front();
Q.pop_front();
vis[x]=false;
// cerr<<x<<'\n';
for(int i=head[x];i!=-1;i=edge[i].next){
int to=edge[i].to;
if(dis[to]>dis[x]+edge[i].cost&&edge[i].cap>0){
dis[to]=dis[x]+edge[i].cost;
level[to]=level[x]+1;
if(!vis[to]){
vis[to]=true;
if(!Q.empty()&&dis[to]<dis[Q.front()]){
Q.push_front(to);
}else{
Q.push_back(to);
}
}
}
}
}
return dis[T]!=dis[n+1];
}
bool flag=false;
int dfs(int x,int T,int t,int &flow,int &cost){
if(x==T){
flow+=t;
flag=true;
return t;
}
int num=0,newflow=0;
for(int i=head[x];i!=-1;i=edge[i].next){
int to=edge[i].to;
if(t==num)break;
if(dis[x]+edge[i].cost==dis[to]&&level[x]+1==level[to]&&edge[i].cap>0){
newflow=dfs(to,T,min(t-num,edge[i].cap),flow,cost);
num+=newflow;
cost+=newflow*edge[i].cost;
edge[i].cap-=newflow;
edge[i^1].cap+=newflow;
}
}
return num;
}
void zkw(int S,int T,int n){
int flow=0,cost=0;
while(SPFA(S,T,n)){
flag=true;
while(flag){
flag=false;
dfs(S,T,1e9,flow,cost);
}
}
cout<<-cost<<'\n';
}
int check(int a,int b){
int t=a/b;
int res=1;
int num=0;
int idx=0;
if(sb.count(a)){
idx=sb[a];
}else{
sb[a]=++cnt;
idx=sb[a];
}
int idy=0;
if(sb.count(b)){
idy=sb[b];
}else{
sb[b]=++cnt;
idy=sb[b];
}
for(int i=2;i*i<=t;i++){
while(t%i==0){
num++;
t/=i;
}
}
if(t>1){
num++;
}
addEdge(idx,idy,500,-num);
//cout<<a<<" "<<b<<" "<<idx<<" "<<idy<<" "<<num<<'\n';
return num;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin>>n;
tot=1;
memset(head,-1,sizeof head);
for(int i=1;i<=n;i++){
cin>>a[i];
sb[a[i]]=++cnt;
}
for(int i=1;i<=n;i++){
if(a[i]==1)continue;
for(int j=1;j*j<=a[i];j++){
if(a[i]%j==0){
check(a[i],j);
if(j==1)continue;
if(a[i]/j!=j){
check(a[i],a[i]/j);
}
}
}
}
int S=++cnt;
for(int i=1;i<=n;i++){
addEdge(S,sb[a[i]],1,0);
}
int T=++cnt;
for(int i=1;i<=cnt-2;i++){
addEdge(i,T,1,0);
}
zkw(S,T,cnt);
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Wrong Answer
time: 0ms
memory: 36272kb
input:
6 3 a?b??c 2 2 2 1 1 1 1 0 2
output:
1
result:
wrong answer 1st lines differ - expected: '3', found: '1'