Submission #1281004

#TimeUsernameProblemLanguageResultExecution timeMemory
1281004minhpkSirni (COCI17_sirni)C++20
140 / 140
1631 ms609104 KiB
#include <bits/stdc++.h>
using namespace std;
int a;
short mark[10000005];
int nxt[10000005];
struct node{
     int l,r,val;
};
vector<pair<int,int>> z[5000005];
int par[10000005];
int sz[10000005];
int find(int u){
    if (par[u]==u){
        return u;
    }
    return par[u]=find(par[u]);
}
bool join(int x,int y){
    x=find(x);
    y=find(y);
    if (x==y){
        return false;
    }
    if (sz[x]<sz[y]){
        swap(x,y);
    }
    par[y]=x;
    sz[x]+=sz[y];
    return true;
}
signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> a;
    for (int i=1;i<=a;i++){
         int x;
         cin >> x;
         mark[x]=1;
    }
    nxt[10000001]=-1;
    for (int i=10000000;i>=1;i--){
         if (mark[i]){
             nxt[i]=i;
         }else{
             nxt[i]=nxt[i+1];
         }
    }
    for (int i=1;i<=10000000;i++){
         if (mark[i]){
             int sad=nxt[i+1];
             if(sad!=-1){
                z[sad%i].push_back({i,sad});
             }
             for (int j=i*2;j<=10000000;j+=i){
                  sad=nxt[j];
                  if(sad!=-1){
                      z[sad%i].push_back({i,sad});
                  }else{
                      break;
                  }
             }
         }
    }
    for (int i=1;i<=10000000;i++){
         par[i]=i;
         sz[i]=1;
    }
    int res=0;
//    cerr << "ok" << "\n";
    for (int i=0;i<=5000000;i++){
         if (z[i].empty()){
             continue;
         }
//         cerr << i << "\n";
         for (auto p:z[i]){
              if (join(p.first,p.second)){
                  res+=i;
              }
         }
    }
    cout << res << "\n";
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...