제출 #1153525

#제출 시각아이디문제언어결과실행 시간메모리
1153525kitkat12Sirni (COCI17_sirni)C++20
14 / 140
1450 ms67260 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define mp make_pair
#define pb push_back
#define F first
#define S second
#define debug(x) std::cout << #x << ": " << x << "\n"
#define all(v) v.begin(), v.end()
#define li(i,a,b) for (int (i) = (a); (i) < (b); (i)++)
#define endl '\n'
#define mem(name,val) memset(name,val,sizeof(name)) 
#define min(a,b) (a<=b ? a : b)
#define max(a,b) (a>=b ? a : b)
//using u64 = uint64_t;
//using u128 = __uint128_t;

const int nmax = 1e5+3;
vector<int> P;
int p[nmax],sz[nmax];
int get(int a){
    return p[a]=(p[a]==a?a:get(p[a]));
}
void uni(int a, int b){
    a=get(a);
    b=get(b);
    if(a==b)return;
    if(sz[a]<sz[b])swap(a,b);
    p[b]=a;
    sz[a]+=sz[b];
}
int foo(int a, int b){
    return min(a%b, b%a);
}
struct Compare {
    bool operator()(const pii &e1, const pii &e2) const {
        return foo(P[e1.F], P[e1.S]) > foo(P[e2.F], P[e2.S]);
    }
};
int main() 
{
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    li(i,0,nmax){p[i]=i;sz[i]=1;}
    int n,a;
    cin>>n;
    li(i,0,n){
        cin>>a;P.pb(a);
        if(a==0){
            cout<<0;
            return 0;
        }
    }
    sort(all(P));	

    priority_queue<pii, vector<pii>, Compare> pq;

    li(i,0,n){
        for(int j=0; j<=P[n-1]; j+=P[i]){
            auto it = lower_bound(all(P),j);
            if(it==P.end()){
                pq.push({i,n-1});
                break;
            }  
            int idx = it-P.begin();
            pq.push({i,idx});
            pq.push({i,min(idx+1,n-1)});
        }
    }

    int cnt =0;
    ll res = 0;
    while(!pq.empty() && cnt<n-1){
        auto [i,j] = pq.top();
        pq.pop();
        if(get(i)==get(j)) continue;

        uni(i,j);
        res+=foo(P[j],P[i]);
        cnt++;

        pq.push({i,min(j+1,n-1)});
    }

    cout<<res;

    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...