QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#332147 | #1375. TripTik | ishmeal# | AC ✓ | 6339ms | 170272kb | C++23 | 3.0kb | 2024-02-19 10:29:56 | 2024-02-19 10:29:56 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
int k;
map<int,int> weight; // coords, weight
struct RMQ {
vector<vector<vector<int>>> jmp;
vector<int> join(vector<int> &a, vector<int> &b) {
vector<int> ret; ret.reserve(k);
auto insertt = [&](int i) {
if (!count(ret.begin(),ret.end(),i)) ret.emplace_back(i);
};
auto aa = a.begin(), bb = b.begin();
while (aa != a.end() and bb != b.end() and ret.size() < k) {
if (weight[*aa] > weight[*bb]) insertt(*aa), aa++;
else insertt(*bb), bb++;
}
while (aa != a.end() and ret.size() < k) insertt(*aa), aa++;
while (bb != b.end() and ret.size() < k) insertt(*bb), bb++;
while (ret.size() and ret.back() == 0) ret.pop_back();
return ret;
}
RMQ(const vector<vector<int>>& V) : jmp(1, V) {
for (int pw = 1, k = 1; pw * 2 <= V.size(); pw *= 2, ++k) {
jmp.emplace_back(V.size() - pw * 2 + 1);
for (int j = 0; j < jmp[k].size(); j++) {
jmp[k][j] = join(jmp[k-1][j], jmp[k-1][j+pw]);
}
}
}
vector<int> query(int a, int b) {
assert(a <= b);
if (a == b) return vector<int>();
int dep = 31 - __builtin_clz(b - a);
return join(jmp[dep][a], jmp[dep][b-(1<<dep)]);
}
};
int main() {
cin.tie(0)->ios_base::sync_with_stdio(0);
int n; cin >> n >> k;
vector<vector<int>> v(n+1);
vector<int> output(n+1); // ind to output order
map<int,int> inds; inds[0]; weight[0] = -1; // coord, index
for (int i = 0; i < n; i++) {
int x; cin >> x;
weight[x] = i;
inds[x];
}
{
int i = 0;
for (auto &[j, k] : inds) {
k = i;
v[i].emplace_back(j);
output[i] = weight[j];
i++;
}
}
RMQ rmq(v); // coords
vector vis(n+1, vector(30, -1));
priority_queue<tuple<int,int,int>> q; // dist, ind, radius
q.emplace(-0, inds[0],0), vis[inds[0]][0] = 0;
while (q.size()) {
auto [d,ind,r] = q.top(); q.pop();
d = -d;
if (d > vis[ind][r]) continue;
for (int j = 0; j < r; j++) {
if (vis[ind][j] != -1 and vis[ind][j] <= d+r-j) continue;
q.emplace(-(d+r-j),ind,j);
vis[ind][j] = d+r-j;
}
for (int j = r+1; j < 30; j++) {
if (vis[ind][j] != -1 and vis[ind][j] <= d+j-r) continue;
q.emplace(-(d+j-r),ind,j);
vis[ind][j] = d+j-r;
}
auto it = inds.upper_bound(v[ind][0]+(1<<r));
for (int j : rmq.query(inds.lower_bound(v[ind][0]-(1<<r))->second, it == inds.end() ? n+1 : it->second)) {
if (vis[inds[j]][r] != -1 and vis[inds[j]][r] <= d+1) continue;
q.emplace(-d-1,inds[j],r);
vis[inds[j]][r] = d+1;
}
}
vector<int> ans(n);
for (int i = 0; i < n+1; i++) {
if (output[i] == -1) continue;
int mn = INT_MAX;
int mx = 29;
while (mx >= 0) {
auto it = inds.upper_bound(v[i][0]+(1<<mx));
auto vv = rmq.query(inds.lower_bound(v[i][0]-(1<<mx))->second, it == inds.end() ? n+1 : it->second);
if (count(vv.begin(),vv.end(),v[i][0])) break;
mx--;
}
for (int j = 0; j <= mx; j++) if (vis[i][j] != -1) mn = min(mn, vis[i][j]);
if (mx == -1 and vis[i][0] != -1) {
mn = vis[i][0]+1;
}
if (mn == INT_MAX) mn = -1;
ans[output[i]] = mn;
}
for (int i : ans) cout << i << '\n';
}
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 3548kb
input:
4 2 -2 -1 -3 2
output:
3 1 3 2
result:
ok 4 lines
Test #2:
score: 0
Accepted
time: 5365ms
memory: 144952kb
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:
ok 100000 lines
Test #3:
score: 0
Accepted
time: 5271ms
memory: 143912kb
input:
100000 4 70680198 97317334 39546330 -54313602 -76555335 61941724 -8221943 -40467311 -38387353 -79352984 -85695884 -116744 -8014898 -90838613 21642942 -13906694 61034002 41083341 22631959 70997275 75121931 90712180 -50976024 -89714113 62620386 30945015 37854774 2964535 80028136 -28328113 -32257258 78...
output:
-1 59 -1 48 49 43 44 49 46 52 48 -1 45 49 40 45 47 43 46 54 -1 49 46 50 46 44 45 39 45 45 46 52 -1 37 52 49 33 42 42 -1 40 34 50 -1 47 56 50 54 -1 46 -1 44 50 37 -1 50 60 48 51 49 -1 53 47 44 41 -1 47 46 -1 50 47 47 48 51 46 47 44 51 50 48 -1 -1 40 48 -1 43 42 58 51 43 54 43 48 50 41 -1 45 48 48 55 ...
result:
ok 100000 lines
Test #4:
score: 0
Accepted
time: 5331ms
memory: 143828kb
input:
100000 4 -22911754 64514931 -46579963 -52307990 -28419918 -35238 66903391 -87096465 15648262 -88916963 96268224 -39583622 -33334243 76123224 30449894 -60512561 92205726 96701672 12953603 70508490 88259167 -12584810 35245713 2029713 19820003 91618921 -66864990 -96291681 73438998 6296068 -26195246 780...
output:
-1 50 45 48 45 22 46 52 46 59 52 52 47 50 52 49 50 48 -1 49 47 55 49 40 50 49 54 -1 48 41 43 41 46 55 -1 50 49 46 48 48 46 47 49 48 50 42 45 55 44 55 54 47 56 -1 52 55 -1 52 -1 54 48 -1 54 41 45 47 50 -1 50 56 48 57 44 48 50 50 48 -1 -1 55 52 53 57 51 45 57 51 45 49 54 52 42 48 57 49 49 51 57 47 51 ...
result:
ok 100000 lines
Test #5:
score: 0
Accepted
time: 6339ms
memory: 170272kb
input:
100000 4 -288 -318 -339 -525 -666 -688 714 -1068 1248 -1318 1453 1485 -1503 1767 1844 1893 -1903 -1942 -1959 1995 2114 -2150 -2209 2256 -2302 2317 -2414 -2423 2693 -2702 2736 -2948 2974 2986 3013 -3019 3197 -3300 3493 3495 3612 -3633 -3657 3702 3727 -3753 3758 4031 -4063 4131 -4172 -4284 4298 4409 4...
output:
11 11 10 11 11 11 11 12 13 13 14 14 13 15 15 15 15 15 15 14 14 15 15 14 14 14 14 14 16 15 16 15 15 16 15 15 16 15 18 17 17 15 15 16 15 15 15 16 17 16 16 16 16 15 15 16 15 16 16 16 16 16 19 17 17 16 16 17 18 17 17 17 16 18 18 16 18 17 18 18 16 17 16 17 16 16 16 16 16 18 19 17 17 17 17 18 17 17 18 17 ...
result:
ok 100000 lines
Test #6:
score: 0
Accepted
time: 1ms
memory: 3556kb
input:
2 1 -13 -20
output:
7 6
result:
ok 2 lines
Test #7:
score: 0
Accepted
time: 5318ms
memory: 143992kb
input:
100000 4 76 8621794 308 92 6 34 1 483450 375193 6822 11 86577381 975813 5025 9 63600034 459 2 738030 3518 24576 42 7850 56238 40826768 1775 40118 32 2802 44344 429383 162507 1017 628933 361842 49 419 12 1593123 876 156 26178 54984 6102 8073233 109434 16 13978897 134384 5 1560478 35 145007 100827 815...
output:
15 53 20 17 6 12 1 41 49 29 8 50 39 28 6 56 21 2 45 26 37 12 32 35 -1 27 -1 11 27 38 51 37 26 40 48 14 21 7 -1 23 19 35 35 32 -1 -1 9 44 52 4 41 11 49 41 64 39 18 36 43 18 25 46 25 36 11 31 11 45 70 46 47 50 12 26 32 35 8 40 -1 23 46 30 24 41 -1 42 -1 57 34 34 57 21 30 41 10 49 23 51 3 51 41 -1 38 1...
result:
ok 100000 lines
Test #8:
score: 0
Accepted
time: 5254ms
memory: 145416kb
input:
100000 4 245352 1 523 6520 1080897 1894 11174315 206582 27800445 43672882 1960 2037 12339783 197460 3208646 224604 109172 60481043 71 232890 3519534 23453 4356 103 439 20 97 6265775 167265 177 57 26965344 2228831 35719 154 1592499 308701 2 344 19657419 2598760 49175 13 401 26 736 4275 85118178 80666...
output:
42 1 20 42 -1 25 48 40 63 72 25 25 54 49 46 38 33 67 15 42 44 43 28 15 23 10 16 45 34 17 13 64 41 40 18 54 45 2 20 59 46 34 9 21 12 22 29 71 -1 35 12 55 -1 24 44 43 49 3 31 65 15 66 16 7 20 36 37 41 24 43 38 31 -1 36 42 23 35 55 66 50 38 60 12 43 17 40 66 62 44 28 7 20 21 50 69 46 39 43 46 30 72 42 ...
result:
ok 100000 lines
Test #9:
score: 0
Accepted
time: 5546ms
memory: 143984kb
input:
100000 4 889 21738495 59706 3859026 114 45 173111 6292802 2 117 13 11 13201 81386 51048924 79 42 6 26276509 36320 5621949 10 434 37 19683193 822970 6269807 50057532 9 15 24 18614267 22902213 1318 21 17403705 6828 14123 8958 2501 233101 1553 31308685 11413 73 2266252 1267501 86091802 7755 136705 20 1...
output:
22 45 33 39 16 12 49 -1 2 15 9 8 31 37 63 15 12 5 42 35 41 6 22 12 42 45 44 52 6 8 11 49 57 22 10 47 33 34 30 37 35 26 49 29 17 43 44 58 30 37 9 46 41 18 33 29 48 43 45 5 9 19 40 56 -1 17 47 62 49 1 48 43 32 30 33 42 38 15 38 14 47 39 4 37 40 43 61 38 46 45 -1 35 -1 30 40 52 30 46 39 -1 33 17 13 37 ...
result:
ok 100000 lines