QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#564528 | #9161. Naval battle | Bucketsmith | 6 | 2320ms | 139680kb | C++20 | 4.3kb | 2024-09-15 08:59:29 | 2024-09-15 08:59:31 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
using pii = pair<int, int>;
using node = tuple<int, int, int>;
const int N = 2e5 + 10;
int n, x[N], y[N], z[N];
char dir[N];
bool crashed[N];
/*
0: x
1: y
2: x + y
3: x - y
0: N
4: S
8: W
12: E
*/
int chg[256];
map<int, set<pii> > mp[16];
pii findCollide(int p) {
pii ans = {INT_MAX, 0};
if(dir[p] == 'E') {
auto it = mp[0 ^ chg['W']][x[p]].lower_bound(pii{y[p], p});
if(it != mp[0 ^ chg['W']][x[p]].end())
ans = min(ans, pii{(it->first - y[p]) / 2, it->second});
it = mp[2 ^ chg['N']][x[p] - y[p]].lower_bound(pii{x[p], p});
if(it != mp[2 ^ chg['N']][x[p] - y[p]].end())
ans = min(ans, pii{it->first - x[p], it->second});
it = mp[3 ^ chg['S']][x[p] + y[p]].lower_bound(pii{x[p], p});
if(it != mp[3 ^ chg['S']][x[p] + y[p]].begin()) {
it --;
ans = min(ans, pii{x[p] - it->first, it->second});
}
}else if(dir[p] == 'S') {
auto it = mp[1 ^ chg['N']][y[p]].lower_bound(pii{x[p], p});
if(it != mp[1 ^ chg['N']][y[p]].end())
ans = min(ans, pii{(it->first - x[p]) / 2, it->second});
it = mp[2 ^ chg['W']][x[p] - y[p]].lower_bound(pii{x[p], p});
if(it != mp[2 ^ chg['W']][x[p] - y[p]].end())
ans = min(ans, pii{it->first - x[p], it->second});
it = mp[3 ^ chg['E']][x[p] + y[p]].lower_bound(pii{x[p], p});
if(it != mp[3 ^ chg['E']][x[p] + y[p]].begin()) {
it --;
ans = min(ans, pii{x[p] - it->first, it->second});
}
}else if(dir[p] == 'N') {
auto it = mp[1 ^ chg['S']][y[p]].lower_bound(pii{x[p], p});
if(it != mp[1 ^ chg['S']][y[p]].begin()) {
it --;
ans = min(ans, pii{(x[p] - it->first) / 2, it->second});
}
it = mp[2 ^ chg['E']][x[p] - y[p]].lower_bound(pii{x[p], p});
if(it != mp[2 ^ chg['E']][x[p] - y[p]].begin()) {
it --;
ans = min(ans, pii{x[p] - it->first, it->second});
}
it = mp[3 ^ chg['W']][x[p] + y[p]].lower_bound(pii{x[p], p});
if(it != mp[3 ^ chg['W']][x[p] + y[p]].end())
ans = min(ans, pii{it->first - x[p], it->second});
}
return ans;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
chg['S'] = 4;
chg['W'] = 8;
chg['E'] = 12;
cin >> n;
for(int i = 1; i <= n; i ++) {
cin >> x[i] >> y[i] >> dir[i];
z[i] = chg[dir[i]];
mp[0 ^ z[i]][x[i]].insert({y[i], i});
mp[1 ^ z[i]][y[i]].insert({x[i], i});
mp[2 ^ z[i]][x[i] - y[i]].insert({x[i], i});
mp[3 ^ z[i]][x[i] + y[i]].insert({x[i], i});
}
priority_queue<node, vector<node>, greater<node> > q;
for(int i = 1; i <= n; i ++) {
auto [t, b] = findCollide(i);
//cout << "find " << i << " = " << t << ", " << b << endl;
if(b) q.push({t, i, b});
}
while(q.size()) {
auto [t, a, b] = q.top();
q.pop();
if(crashed[a] || crashed[b]) {
if(!crashed[a]) {
auto [t, b] = findCollide(a);
if(b) q.push({t, a, b});
}
continue;
}
vector<pii> v;
v.emplace_back(a, b);
while(q.size() && get<0>(q.top()) == t) {
auto [t, a, b] = q.top();
q.pop();
if(crashed[a] || crashed[b]) {
if(!crashed[a]) {
auto [t, b] = findCollide(a);
if(b) q.push({t, a, b});
}
continue;
}
v.emplace_back(a, b);
}
for(auto [a, b] : v) {
crashed[a] = crashed[b] = true;
for(auto i : {a, b}) {
mp[0 ^ z[i]][x[i]].erase({y[i], i});
mp[1 ^ z[i]][y[i]].erase({x[i], i});
mp[2 ^ z[i]][x[i] - y[i]].erase({x[i], i});
mp[3 ^ z[i]][x[i] + y[i]].erase({x[i], i});
}
//cout << a << " and " << b << " crashed at " << t << "\n";
}
}
for(int i = 1; i <= n; i ++)
if(!crashed[i]) cout << i << " ";
cout << "\n";
}
Details
Tip: Click on the bar to expand more detailed information
Subtask #1:
score: 6
Accepted
Test #1:
score: 6
Accepted
time: 0ms
memory: 3844kb
input:
2 675333810 792019962 W 851860476 960355168 W
output:
1 2
result:
ok
Test #2:
score: 6
Accepted
time: 0ms
memory: 3820kb
input:
2 714148610 688520844 W 359519570 789553998 S
output:
1 2
result:
ok
Test #3:
score: 6
Accepted
time: 0ms
memory: 5672kb
input:
2 743286406 87591094 E 108453484 326740470 S
output:
1 2
result:
ok
Test #4:
score: 6
Accepted
time: 0ms
memory: 5880kb
input:
2 629499666 659260200 W 391550936 897208930 N
output:
result:
ok
Test #5:
score: 6
Accepted
time: 0ms
memory: 5608kb
input:
2 509095668 374922996 W 325521434 191348762 S
output:
result:
ok
Test #6:
score: 6
Accepted
time: 0ms
memory: 3876kb
input:
2 357656592 713571312 E 456601638 614626266 S
output:
result:
ok
Test #7:
score: 6
Accepted
time: 1ms
memory: 5588kb
input:
2 353512742 374956722 W 265604916 462864548 N
output:
result:
ok
Test #8:
score: 6
Accepted
time: 0ms
memory: 3584kb
input:
2 253519292 302668732 E 436627396 119560628 S
output:
result:
ok
Test #9:
score: 6
Accepted
time: 1ms
memory: 5912kb
input:
2 741954822 709863076 W 516385128 484293380 S
output:
1 2
result:
ok
Test #10:
score: 6
Accepted
time: 1ms
memory: 5600kb
input:
2 268851874 524109226 E 503673708 758931058 N
output:
1 2
result:
ok
Test #11:
score: 6
Accepted
time: 0ms
memory: 3652kb
input:
2 629380956 395789270 S 557401140 467769088 E
output:
1 2
result:
ok
Test #12:
score: 6
Accepted
time: 0ms
memory: 3668kb
input:
2 606361496 587557658 N 667076156 526843000 W
output:
1 2
result:
ok
Test #13:
score: 6
Accepted
time: 0ms
memory: 3604kb
input:
2 270428340 629167054 N 270428342 179345630 S
output:
1 2
result:
ok
Subtask #2:
score: 0
Wrong Answer
Test #14:
score: 12
Accepted
time: 0ms
memory: 3944kb
input:
100 32 46 N 8 24 W 74 86 W 2 76 N 90 70 N 34 74 N 4 68 N 42 26 N 66 94 N 28 40 W 96 12 W 82 78 W 54 24 N 36 42 W 92 68 W 0 26 N 14 54 N 94 66 N 26 52 N 66 12 W 72 6 W 64 96 W 6 20 N 4 22 W 26 42 N 40 28 W 70 76 N 18 60 N 62 16 N 30 48 N 36 36 W 42 36 W 52 94 N 62 98 N 0 78 N 70 2 W 28 50 N 80 80 W 8...
output:
result:
ok
Test #15:
score: 12
Accepted
time: 0ms
memory: 3620kb
input:
100 70 62 N 56 42 N 42 56 W 64 4 N 50 48 W 56 76 N 78 20 W 96 96 W 60 72 N 44 24 N 2 10 N 52 80 W 38 30 N 94 4 W 58 74 W 68 30 W 54 76 N 0 68 N 36 32 N 10 58 W 70 60 W 86 92 N 100 78 W 2 66 W 20 48 N 16 52 N 8 60 N 98 94 N 86 46 W 74 24 W 26 42 W 66 66 W 28 40 W 56 12 W 90 42 W 8 4 W 76 30 W 78 54 W...
output:
result:
ok
Test #16:
score: 0
Wrong Answer
time: 1ms
memory: 5688kb
input:
100 36 44 E 96 66 E 28 20 E 36 2 E 32 64 W 76 58 E 82 20 E 76 50 E 22 48 W 38 52 E 90 16 N 22 12 W 64 82 S 84 14 E 92 52 E 76 36 E 72 52 N 100 58 S 82 4 E 2 0 N 90 100 E 68 8 S 24 36 S 80 86 W 72 56 W 8 66 W 84 18 S 18 60 N 64 96 E 2 76 S 74 90 E 64 0 S 12 10 S 56 40 S 40 6 S 2 4 S 74 2 S 90 80 N 2 ...
output:
1 4 5 6 8 10 11 12 13 14 15 17 18 19 20 21 26 28 29 30 31 32 35 36 38 40 41 45 46 47 48 50 53 55 56 58 59 60 62 63 65 66 67 68 69 70 73 74 76 77 78 81 84 85 86 88 91 92 93 95 96 98 99
result:
wrong answer
Subtask #3:
score: 0
Skipped
Dependency #2:
0%
Subtask #4:
score: 0
Skipped
Dependency #1:
100%
Accepted
Dependency #2:
0%
Subtask #5:
score: 0
Skipped
Dependency #4:
0%
Subtask #6:
score: 0
Wrong Answer
Test #58:
score: 0
Wrong Answer
time: 2320ms
memory: 139680kb
input:
200000 526715640 430855204 E 731546662 226024182 S 254814720 702756124 E 227354364 730216480 S 764250602 193320242 S 150102088 807468756 E 204858572 752712272 S 635512190 322058654 E 403910248 553660596 S 257917918 4587926 S 949444340 8126504 S 907805098 49765746 S 553836306 403734538 S 40977864 617...
output:
9710 78188 79720
result:
FAIL Unexpected end of file - token expected (/var/uoj_data/9161/58.ans)
Subtask #7:
score: 0
Skipped
Dependency #1:
100%
Accepted
Dependency #2:
0%