답안 #830173

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
830173 2023-08-18T22:29:37 Z Mathandski Sirni (COCI17_sirni) C++14
98 / 140
2332 ms 786432 KB
#include <bits/stdc++.h> 
using namespace std;
#define pb push_back 
#define is insert
#define ll long long
#define V vector
#define MS multiset
#define PL pair<ll, ll>
#define F first
#define S second
#define PQ priority_queue
#define f0r(i, begin, end) for (ll i = begin; i < end; i ++) 
#define For(i, end, begin) for (ll i = end; i > begin; i --) 
#define all(x) x.begin(), x.end()
#define INF 1000000000000000000
#define inf 1000000000
#define MOD 1000000009
#define len(x) (ll)x.size()
#define fileread(file) ifstream fin; fin.open((string)file + ".in"); ofstream fout; fout.open((string)file + ".out")
#define fastio ios_base::sync_with_stdio(0); cin.tie(nullptr)
template<typename T> istream& operator>>(istream& in, V<T>& a) {for(auto &x : a) in >> x; return in;};
template<typename T> ostream& operator<<(ostream& out, V<T>& a) {for(auto &x : a) out << x << ' '; return out;};

struct DSU {
	vector<ll> e;
	DSU(ll N) { e = vector<ll>(N, -1); }

	// get representive component (uses path compression)
	ll get(ll x) { return e[x] < 0 ? x : e[x] = get(e[x]); }

	bool same_set(ll a, ll b) { return get(a) == get(b); }

	ll size(ll x) { return -e[get(x)]; }

	bool unite(ll x, ll y) {  // union by size
		x = get(x), y = get(y);
		if (x == y) return false;
		if (e[x] > e[y]) swap(x, y);
		e[x] += e[y];
		e[y] = x;
		return true;
	}
};

ll N, ans = 0;
set<ll> nums;
ll decomp[10000001];
vector<tuple<ll, ll, ll>> edges;

void krustal () {
    ll tot = N - 1;
    DSU dsu(N);
    sort(all(edges));
    for (auto e : edges) {
        if (dsu.unite(get<1>(e), get<2>(e))) {
            ans += get<0>(e);
            if ((--tot) == 0) break;
        }
    }
}

int main () {
    cin >> N;
    DSU dsu(N);
    f0r (i, 0, N) {
        ll a; cin >> a;
        nums.is(a);
    }
    ll i = 0;
    for (auto n : nums) {
        decomp[n] = (i ++);
    }

    for (auto n : nums) {
        auto pos = nums.lower_bound(n + 1);
        ll factor = 1;
        while (pos != nums.end()) {
            if ((*pos) / n > factor) {
                factor = (*pos) / n;
            }
            edges.pb({(*pos) % n, decomp[n], decomp[*pos]});
            pos = nums.lower_bound((++factor) * n);
        }
    }
    
    krustal();
    cout << ans << endl;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 4436 KB Output is correct
2 Correct 27 ms 8696 KB Output is correct
3 Correct 4 ms 4884 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 724 KB Output is correct
2 Correct 8 ms 2512 KB Output is correct
3 Correct 3 ms 4884 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 4692 KB Output is correct
2 Correct 2 ms 3412 KB Output is correct
3 Correct 4 ms 4756 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 347 ms 38040 KB Output is correct
2 Correct 1113 ms 111580 KB Output is correct
3 Correct 421 ms 61884 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 38 ms 15168 KB Output is correct
2 Correct 426 ms 104372 KB Output is correct
3 Correct 326 ms 33776 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 735 ms 111972 KB Output is correct
2 Correct 1490 ms 210292 KB Output is correct
3 Correct 459 ms 62704 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 101 ms 16148 KB Output is correct
2 Correct 1283 ms 209496 KB Output is correct
3 Correct 388 ms 62184 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 475 ms 132868 KB Output is correct
2 Runtime error 2332 ms 786432 KB Execution killed with signal 9
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 444 ms 133060 KB Output is correct
2 Runtime error 2096 ms 786432 KB Execution killed with signal 9
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 68 ms 57788 KB Output is correct
2 Runtime error 1937 ms 786432 KB Execution killed with signal 9
3 Halted 0 ms 0 KB -