답안 #583346

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
583346 2022-06-25T09:06:17 Z NintsiChkhaidze Sirni (COCI17_sirni) C++14
140 / 140
3362 ms 575096 KB
#include <bits/stdc++.h>
//#include <iostream>
//#include <vector>
#define s second
#define pb push_back
#define f first
using namespace std;

const int N = 100005,M = 10000005;
int p[N],ans,m[M];

vector <pair<int,int>> w[M];
vector <pair<int,int>> d;

int P(int x){
    if (x == p[x]) return x;
    return p[x] = P(p[x]);
}

void dsu(int a,int b,int c){
    int pa = P(a),pb = P(b);
    if (pa == pb) return;
    ans += c;
    if (pa < pb) swap(pa,pb);
    p[pb] = pa;
}

int main() {
    ios_base::sync_with_stdio(0),cin.tie(NULL),cout.tie(NULL);
    int n;
    cin>>n;
    for (int i = 1; i <= n; i++){
        int a;
        cin>>a;
        p[i] = i;
        d.pb({a,i});
    }

    sort(d.begin(),d.end());
    int r = d.size() - 1;
    m[10000001] = -1;
    for (int i = 1e7; i >= 1; i--){
        m[i] = m[i + 1];
        while (r >= 0 && i <= d[r].f)
            m[i] = r--;
    }

    for (int y = 0; y < n; y++){
        if (y + 1 < n && d[y+1].f < 2*d[y].f)
            w[d[y+1].f - d[y].f].pb({y,y + 1});

        if (y > 0 && d[y].f == d[y - 1].f) continue;
        for (int j = 2*d[y].f; j <= 1e7; j += d[y].f)
            if (m[j] >= 0 && d[m[j]].f - d[y].f < j)
                w[d[m[j]].f - j].pb({y,m[j]});
    }

    for (int i = 0; i <= 1e7; i++){
        for (int j = 0; j < w[i].size(); j++){
            int x = w[i][j].f,y = w[i][j].s;
            dsu(x,y,i);
        }
    }
    cout<<ans;
}

Compilation message

sirni.cpp: In function 'int main()':
sirni.cpp:59:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   59 |         for (int j = 0; j < w[i].size(); j++){
      |                         ~~^~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 174 ms 274384 KB Output is correct
2 Correct 194 ms 276820 KB Output is correct
3 Correct 165 ms 274532 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 205 ms 274348 KB Output is correct
2 Correct 367 ms 274964 KB Output is correct
3 Correct 165 ms 274448 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 175 ms 274540 KB Output is correct
2 Correct 160 ms 274332 KB Output is correct
3 Correct 171 ms 274656 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 339 ms 286484 KB Output is correct
2 Correct 656 ms 312176 KB Output is correct
3 Correct 357 ms 290824 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 181 ms 276172 KB Output is correct
2 Correct 540 ms 298312 KB Output is correct
3 Correct 383 ms 286464 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 515 ms 297764 KB Output is correct
2 Correct 752 ms 326736 KB Output is correct
3 Correct 338 ms 289268 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 299 ms 278508 KB Output is correct
2 Correct 776 ms 321824 KB Output is correct
3 Correct 334 ms 288668 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 265 ms 287768 KB Output is correct
2 Correct 1396 ms 483964 KB Output is correct
3 Correct 303 ms 290148 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 303 ms 288168 KB Output is correct
2 Correct 3016 ms 575096 KB Output is correct
3 Correct 293 ms 294824 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 190 ms 276848 KB Output is correct
2 Correct 3362 ms 570564 KB Output is correct
3 Correct 358 ms 291008 KB Output is correct