QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#395169#1375. TripTikmegz112233WA 5198ms198864kbC++235.4kb2024-04-21 09:48:222024-04-21 09:48:22

Judging History

你现在查看的是最新测评结果

  • [2024-04-21 09:48:22]
  • 评测
  • 测评结果:WA
  • 用时:5198ms
  • 内存:198864kb
  • [2024-04-21 09:48:22]
  • 提交

answer

#include <bits/stdc++.h>

#define sz(x)  (int)x.size()
#define bigint __int128
#define el '\n'
#define ll long long
//#define int long long
#define ld long double
using namespace std;
const int N = 1e5 + 4, M = 1e5 + 10, mod = 998244353;
int szz = 1;

struct seg_tree {
    vector<vector<pair<int, int>>> tree;
    // weight , idx
    vector<pair<int, int>> neutral = {};
    int k;

    seg_tree(int n, vector<vector<pair<int, int>>> &v, int k) {
        szz = 1;
        while (szz < n)szz <<= 1;
        tree.assign(2 * szz, neutral);
        this->k = k;
        build(v);
    }

    vector<pair<int, int>> merge(vector<pair<int, int>> val1, vector<pair<int, int>> val2) {
        // vector 2*n 3,3
        for (auto x: val2)val1.push_back(x);
        sort(val1.rbegin(), val1.rend());
        while (sz(val1) > k)val1.pop_back();
        return val1;
    }

    void build(vector<vector<pair<int, int>>> &v, int node = 0, int lx = 0, int rx = szz - 1) {
        if (lx == rx) {
            if (lx < sz(v)) {
                tree[node] = v[lx];
            }
            return;
        }
        int mid = lx + rx >> 1;
        build(v, (node << 1) + 1, lx, mid);
        build(v, (node << 1) + 2, mid + 1, rx);
        tree[node] = merge(tree[(node << 1) + 1], tree[(node << 1) + 2]);
    }

    void set(int idx, vector<pair<int, int>> val, int node = 0, int lx = 0, int rx = szz - 1) {
        if (lx == rx) {
            tree[node] = val;
            return;
        }
        int mid = (lx + rx) >> 1;
        if (mid >= idx) {
            set(idx, val, (node << 1) + 1, lx, mid);
        } else {
            set(idx, val, (node << 1) + 2, mid + 1, rx);
        }
        tree[node] = merge(tree[(node << 1) + 1], tree[(node << 1) + 2]);
    }

    vector<pair<int, int>> query(int l, int r, int node = 0, int lx = 0, int rx = szz - 1) {
        if (lx > r or rx < l)return neutral;
        if (lx >= l and rx <= r) {
            return tree[node];
        }
        int mid = lx + rx >> 1;
        vector<pair<int, int>> q1 = query(l, r, (node << 1) + 1, lx, mid);
        vector<pair<int, int>> q2 = query(l, r, (node << 1) + 2, mid + 1, rx);
        return merge(q1, q2);
    }

};

void acc() {
    int n, k;
    cin >> n >> k;
    // 0
    vector<pair<int, int>> points(n);
    // x-axis  , idx
    //  -5 -1 0 1 2 3
    for (int i = 0; i < n; i++) {
        int x;
        cin >> x;
        points[i] = {x, i};
    }
    points.push_back({0, -1});
    sort(points.begin(), points.end());
    n++;
    vector<vector<pair<int, int>>> v(n);
    for (int i = 0; i < n; i++) {
        v[i].push_back({points[i].second, i});
    }
    seg_tree sg(n, v, k);
    int lg = 27;
    vector<int> adj[n + 1][lg];
    vector<int> pw(lg + 1, 1);
    pw[0] = 0;
    for (int i = 2; i < lg; i++)pw[i] = pw[i - 1] * 2;
    for (int bt = 0; bt < lg; bt++) {
//        cout << "with bt = " << bt << el;
//        cout << "---------" << el;
        for (int i = 0; i < n; i++) {
            int l = points[i].first - pw[bt], r = points[i].first + pw[bt];
            auto idxl = std::lower_bound(points.begin(), points.end(), make_pair(l, -1)) - points.begin();
            auto idxr = std::lower_bound(points.begin(), points.end(), make_pair(r, -1)) - points.begin();
            if (idxr == n or points[idxr].first > r)idxr--;
//            cout << points[i].first << " " << idxl << " " << idxr << el;
            vector<pair<int, int>> ret = sg.query(idxl, idxr);
            // weight , idx
            for (auto [val, idx]: ret) {
                adj[i][bt].push_back(idx);
//                cout << idx << " ";
            }
//            cout << "------" << el;
        }
    }
//    for (int i = 0; i < n; i++) {
//        cout << points[i].first << el;
//        for (int j = 0; j < 4; j++) {
//            cout << "with scoop == " << pw[j] << el;
//            for (auto child: adj[i][j]) {
//                cout << child << " ";
//            }
//            cout << el;
//        }
//    }

    int idx_zero = -1;
    for (int i = 0; i < sz(points); i++) {
        if (points[i].first == 0)idx_zero = i;
    }
    priority_queue<array<int, 3>> pq;
    // num_of operation , lst ,  bt
    pq.push({0, idx_zero, 1});
    vector<int> lst(n, 1e9);
    vector<vector<int>> dist(n + 1, vector<int>(lg, 1e9));
    dist[0][1] = 0;
    while (sz(pq)) {
        array<int, 3> arr = pq.top();
        pq.pop();
        int op = -arr[0], node = arr[1], bt = arr[2];
        for (int i = 0; i < lg; i++) {
            int nw_cost = abs(bt - i) + op;
            for (auto child: adj[node][i]) {
                if (dist[child][i] > nw_cost + (child != node)) {
                    dist[child][i] = nw_cost + (child != node);
                    pq.push({-dist[child][i], child, i});
                }
                if (child == node)lst[child] = min(lst[child], nw_cost);
            }
        }
    }
    vector<int> ans(n - 1, 11223344);
    for (int i = 0; i < sz(points); i++) {
        if (points[i].first == 0)continue;
        ans[points[i].second] = lst[i];
    }
    for (int i = 0; i < sz(ans); i++) {
        if (ans[i] >= 1e9)cout << "-1" << el;
        else cout << ans[i] << el;
    }
//    cout << el;
}

signed main() {
    int t = 1;
    cout.tie(0);
    cin.tie(0);
    ios_base::sync_with_stdio(0);
    //  while (t--)acc();
    acc();
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3896kb

input:

4 2
-2
-1
-3
2

output:

3
1
3
2

result:

ok 4 lines

Test #2:

score: -100
Wrong Answer
time: 5198ms
memory: 198864kb

input:

100000 4
-81032899
-96819000
35569221
67767248
74154777
75473369
3463319
18339682
-77145048
-26587182
-22902096
-55717109
-47237134
-44620229
-45753774
33183854
-15569807
72648777
-33842373
44545672
-48017305
71506102
33448860
-20688896
6205313
21527590
24985350
-14688810
29596074
-47051603
-9258675...

output:

56
49
48
47
47
50
38
42
-1
-1
51
55
51
52
51
46
41
48
46
44
47
47
49
44
37
-1
44
44
45
51
49
49
45
49
44
43
51
54
46
43
-1
44
49
57
46
45
43
47
46
53
48
44
47
-1
49
55
53
47
52
51
49
47
53
56
43
50
43
29
43
50
52
52
47
45
47
50
52
47
49
47
50
49
48
47
49
45
62
37
47
48
51
39
47
46
48
50
47
53
44
52
...

result:

wrong answer 99999th lines differ - expected: '28', found: '29'