QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#394847#1375. TripTikrania__#WA 1ms5944kbC++203.6kb2024-04-20 20:29:542024-04-20 20:29:54

Judging History

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

  • [2024-04-20 20:29:54]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:5944kb
  • [2024-04-20 20:29:54]
  • 提交

answer

#include<bits/stdc++.h>

#define ll long long
#define endl '\n'
using namespace std;
const int N = 1e5 + 10;
int n, k;
pair<int, int> arr[N];

struct node {
    vector<int> v;
};

node merge(node x, node y) {
    node ret;
    ret.v.clear();
    while ((x.v.size() or y.v.size()) and ret.v.size() < k) {
        if (y.v.empty() or (x.v.size() and x.v.back() > y.v.back())) {
            ret.v.push_back(x.v.back());
            x.v.pop_back();
        } else {
            ret.v.push_back(y.v.back());
            y.v.pop_back();
        }
    }
    std::reverse(ret.v.begin(), ret.v.end());
    return ret;
}

node tree[4 * N];

void build(int idx = 1, int l = 0, int r = n) {
    if (l == r) {
        tree[idx].v = {arr[l].second};
        return;
    }
    int mid = (l + r) / 2;
    build(2 * idx, l, mid);
    build(2 * idx + 1, mid + 1, r);
    tree[idx] = merge(tree[2 * idx], tree[2 * idx + 1]);
}

node query(int wl, int wr, int idx = 1, int l = 0, int r = n) {
    if (wl <= l and r <= wr)
        return tree[idx];
    int mid = (l + r) / 2;
    node ret;
    ret.v.clear();
    if (wl <= mid)
        ret = merge(ret, query(wl, wr, 2 * idx, l, mid));
    if (wr > mid)
        ret = merge(ret, query(wl, wr, 2 * idx + 1, mid + 1, r));
    return ret;
}

int pos[N];

vector<int> fchilds(int node, int scope) {
    int l = pos[node], r = pos[node];
    int s = 0, e = n, mid;
    while (s <= e) {
        mid = (s + e) / 2;
        if (arr[pos[node]].first - (1ll << scope) <= arr[mid].first) {
            l = mid;
            e = mid - 1;
        } else s = mid + 1;
    }
    s = 0, e = n;
    while (s <= e) {
        mid = (s + e) / 2;
        if (arr[pos[node]].first + (1ll << scope) >= arr[mid].first) {
            r = mid;
            s = mid + 1;
        } else e = mid - 1;
    }
    return query(l, r).v;
}

void doWork() {
    cin >> n >> k;
    for (int i = 1; i <= n; i++) {
        cin >> arr[i].first;
        arr[i].second = i;
    }

    arr[0] = {0, 0};
    sort(arr, arr + n + 1);
    for (int i = 0; i <= n; i++) {
        pos[arr[i].second] = i;
    }

    build();
    queue<pair<int, int>> q;
    vector<vector<int>> cost(n + 1, vector<int>(30, 1e9 + 7));
    cost[0][0] = 0;
    q.push({0, 0});
    while (q.size()) {
        int node = q.front().first;
        int scope = q.front().second;
        q.pop();
        if (scope != 29 and cost[node][scope] + 1 < cost[node][scope + 1]) {
            cost[node][scope + 1] = cost[node][scope] + 1;
            q.push({node, scope + 1});
        }
        if (scope != 0 and cost[node][scope] + 1 < cost[node][scope - 1]) {
            cost[node][scope - 1] = cost[node][scope] + 1;
            q.push({node, scope - 1});
        }

        vector<int> childs = fchilds(node, scope);
        for (auto to: childs) {
            if (cost[node][scope] + 1 < cost[to][scope]) {
                cost[to][scope] = cost[node][scope] + 1;
                q.push({to, scope});
            }
        }
    }
    for (int i = 1; i <= n; i++) {
        int mn = 1e9 + 7;
        for (int j = 0; j < 30; j++)
            mn = min(mn, cost[i][j]);
        if (mn == 1e9 + 7)
            mn = -1;
        cout << mn << '\n';
    }
}


int main() {
    ios::sync_with_stdio(false);
    cout.tie(nullptr);
    cin.tie(nullptr);
//    freopen("bisector.in","r",stdin);
//    freopen("bisector.out","w",stdout);
    int t = 1;
    // cout << primes.size() << endl;
//    cin >> t;
    while (t--) {
        doWork();
    }
    return 0;
}

詳細信息

Test #1:

score: 0
Wrong Answer
time: 1ms
memory: 5944kb

input:

4 2
-2
-1
-3
2

output:

2
1
3
2

result:

wrong answer 1st lines differ - expected: '3', found: '2'