Submission #1281655

#TimeUsernameProblemLanguageResultExecution timeMemory
1281655rexdinoSirni (COCI17_sirni)C++20
14 / 140
1444 ms851968 KiB
#include <bits/stdc++.h>
#define fi first
#define se second
#define FOR(i,a,b) for(int i=(a); i<=(b); ++i)
#define REP(i,a,b) for(int i=(a); i>=(b); --i)
#define BIT(x, i) (((x) >> (i)) & 1)
#define MASK(i) (1LL << (i))
#define sz(v) (int)(v).size()
#define ALL(v) (v).begin(),(v).end()
#define printArr(a, n) for (int i=1; i<=n; ++i) cout << a[i] << " "; el;
#define el cout << "\n"
using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;

const int N = 1e7 + 5;
const int mod = 1e9 + 7;
const int base = 311;
const ll INF = 1e18;

/// REXDINO FROM LTV HSGS ///
int n, m;
pii p[100005];
int par[100005];
int mx = 0;
vector<pii> cnt[N];
int last[N];
ll ans = 0;


int Find(int u){
    return par[u] < 0 ? u : par[u] = Find(par[u]);
}

bool join(int u, int v){
    u = Find(u); v = Find(v);
    if (u == v) return 0;
    if (par[u] > par[v]) swap(u, v);
    par[u] += par[v];
    par[v] = u;
    return 1;
}

struct Edge{
    int u, v, w;
    bool operator < (const Edge &other) const {
        return w < other.w;
    }
};

vector<Edge> edges;

void solve(){
    cin >> n;
    FOR(i, 1, n) par[i] = -1;
    FOR(i, 1, n){
        int x;
        cin >> x;
        if (last[x] != 0){
            join(last[x], i);
        } else {
            last[x] = i;
            p[++m] = {x, i};
        }
    }

    sort(p + 1, p + m + 1);
    mx = p[m].fi;


    FOR(i, 1, m){
        for (int j = 1; 1ll * p[i].fi * j <= mx; ++j){
            int x = lower_bound(p + 1, p + m + 1, make_pair(p[i].fi * j + (j == 1), 0)) - p;
//            cout << i << " " << j << " " << x << " " << p[x].fi, el;
            if (x <= m) edges.push_back({p[i].se, p[x].se, p[x].fi % p[i].fi});
        }
    }

    for (Edge T : edges) cnt[T.w].push_back(make_pair(T.u, T.v));
    FOR(i, 0, mx){
        FOR(j, 0, sz(cnt[i]) - 1){
            if (join(cnt[i][j].fi, cnt[i][j].se)){
                ans += i;
            }
        }
    }


    cout << ans;
}

signed main(){
    #define NAME "main"
    if (fopen(NAME".inp", "r")){
        freopen(NAME".inp", "r", stdin);
        freopen(NAME".out", "w", stdout);
    }
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    int t = 1;
//    cin >> t;
    while(t--) solve();

    return 0;
}


Compilation message (stderr)

sirni.cpp: In function 'int main()':
sirni.cpp:97:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   97 |         freopen(NAME".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
sirni.cpp:98:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   98 |         freopen(NAME".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#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...