제출 #1155793

#제출 시각아이디문제언어결과실행 시간메모리
1155793DangKhoizzzzSirni (COCI17_sirni)C++20
0 / 140
49 ms7736 KiB
#include <bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define pii pair <int , int>
#define arr3 array <int , 3>

/*
+ array limit ???
+ special case ??? n = 1?
+ time limit ???
*/

using namespace std;

const int INF = 1e18 + 7;
const int maxn = 2e5 + 7;

struct DSU
{
    vector <int> parent;
    vector <int> sz;

    void init(int n)
    {
        parent.assign(n+5 , 0);
        sz.assign(n+5 , 0);
        for(int i =1 ; i <= n; i++)
        {
            sz[i] = 1;
            parent[i] = i;
        }
    }

    int find_par(int u)
    {
        if(parent[u] == u) return u;
        return parent[u] = find_par(parent[u]);
    }

    void unionset(int u , int v)
    {
        u = find_par(u);
        v = find_par(v);
        if(u == v) return;
        if(sz[u] < sz[v]) swap(u , v);
        parent[v] = u;
        sz[u] += sz[v];
    }

    bool connected(int u , int v)
    {
        return find_par(u) == find_par(v);
    }
} dsu;

int n , nxt[maxn];
vector <int> a;
vector <arr3> edge;

void solve()
{
    cin >> n;
    for(int i = 1; i <= n; i++)
    {
        int x; cin >> x; a.push_back(x);
    }
    a.push_back(-1);
    sort(a.begin() , a.end());
    a.erase(unique(a.begin() , a.end()) , a.end());
    n = a.size() - 1;
    dsu.init(n);

    for(int i = 1; i <= n; i++) nxt[a[i]] = i;
    for(int i = a.back() - 1; i >= 1; i--)
    {
        if(nxt[i] == 0) nxt[i] = nxt[i+1];
    }

    for(int i = 1; i < n; i++)
    {
        edge.push_back({a[i+1]%a[i] , i , i+1});
        for(int j = a[i]*2; j <= a.back(); j += a[i])
        {
            edge.push_back({a[nxt[j]]%a[i] , i , nxt[j]});
        }
    }

    int ans = 0;

    sort(edge.begin() , edge.end());

    for(arr3 e: edge)
    {
        int w = e[0] , u = e[1] , v = e[2];
        if(!dsu.connected(u , v))
        {
            ans += w;
            dsu.unionset(u , v);
        }
    }

    cout << ans << '\n';

}

signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    solve();
    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

sirni.cpp:16:22: warning: overflow in conversion from 'double' to 'int' changes value from '1.0e+18' to '2147483647' [-Woverflow]
   16 | const int INF = 1e18 + 7;
      |                 ~~~~~^~~
#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...