QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#395165 | #1375. TripTik | megz112233 | WA | 403ms | 119636kb | C++23 | 5.3kb | 2024-04-21 09:41:23 | 2024-04-21 09:41:23 |
Judging History
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 = 29;
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 < 4; 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;
// while (t--)acc();
acc();
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 3660kb
input:
4 2 -2 -1 -3 2
output:
3 1 3 2
result:
ok 4 lines
Test #2:
score: -100
Wrong Answer
time: 403ms
memory: 119636kb
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:
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
result:
wrong answer 1st lines differ - expected: '56', found: '-1'