QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#670747 | #9161. Naval battle | oyzr | 6 | 36ms | 408740kb | C++23 | 7.3kb | 2024-10-24 00:06:59 | 2024-10-24 00:06:59 |
Judging History
answer
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN = 2e5 + 5;
int read(){
int flag = 1;
int res = 0;
char c = getchar();
for (;!isdigit(c); c = getchar())
if (c == '-')
flag = -1;
for (;isdigit(c); c = getchar())
res = (res << 1) + (res << 3) + (c ^ 48);
return res * flag;
}
struct Information{
int minAns, idL, idR;
int leftPos, leftId, rightPos, rightId;
Information(){
minAns = 1e18;
leftPos = -1e18, rightPos = 1e18;
leftId = 0, rightId = 0;
idL = 0, idR = 0;
}
Information (int pos, int type, int id){
minAns = 1e18;
leftPos = -1e18, rightPos = 1e18;
if (type == 0)
leftPos = pos, leftId = id;
else
rightPos = pos, rightId = id;
}
friend Information operator + (Information x, Information y){
Information res;
res.minAns = min({x.minAns, y.minAns, y.rightPos - x.leftPos});
if (x.minAns == res.minAns)
res.idL = x.idL, res.idR = x.idR;
else if (y.minAns == res.minAns)
res.idL = y.idL, res.idR = y.idR;
else
res.idL = x.leftId, res.idR = y.rightId;
res.leftPos = max(x.leftPos, y.leftPos);
if (x.leftPos == res.leftPos)
res.leftId = x.leftId;
else
res.leftId = y.leftId;
res.rightPos = min(x.rightPos, y.rightPos);
if (x.rightPos == res.rightPos)
res.rightId = x.rightId;
else
res.rightId = y.rightId;
return res;
}
};
class SegmentTree{
private:
const static int MAXNODE = 4 * MAXN;
#define ls (id << 1)
#define rs (id << 1 | 1)
struct Node{
int L, R;
Information info;
}t[MAXNODE];
void update(int id){
t[id].info = t[ls].info + t[rs].info;
}
void buildTree(int id, int L, int R){
t[id].L = L, t[id].R = R;
if (L == R){
t[id].info = initialVal[L];
return;
};
int mid = (L + R) >> 1;
buildTree(ls, L, mid);
buildTree(rs, mid + 1, R);
update(id);
}
void change(int id, int pos, Information info){
if (t[id].L == t[id].R){
t[id].info = info;
return;
}
if (pos <= t[ls].R)
change(ls, pos, info);
else
change(rs, pos, info);
update(id);
}
Information query(int id, int l, int r){
if (t[id].L == l && t[id].R == r)
return t[id].info;
if (r <= t[ls].R)
return query(ls, l, r);
else if (l >= t[rs].L)
return query(rs, l, r);
else
return query(ls, l, t[ls].R) + query(rs, t[rs].L, r);
}
public:
Information initialVal[MAXN];
void buildTree(int n){
buildTree(1, 1, n);
}
void change(int pos, Information info){
change(1, pos, info);
}
Information query(int l, int r){
if (l > r)
return Information();
return query(1, l, r);
}
}tree[6];
struct Node{
int x, y, a, id;
}t[MAXN];
bool cmp1(Node a, Node b){
if (a.x + a.y == b.x + b.y)
return a.x < b.x;
return a.x + a.y < b.x + b.y;
}
bool cmp2(Node a, Node b){
if (a.x - a.y == b.x - b.y)
return a.x < b.x;
return a.x - a.y < b.x - b.y;
}
bool cmp3(Node a, Node b){
if (a.x == b.x)
return a.y < b.y;
return a.x < b.x;
}
bool cmp4(Node a, Node b){
if (a.y == b.y)
return a.x < b.x;
return a.y < b.y;
}
bool cmp5(Node a, Node b){
return a.id < b.id;
}
struct Segment{
int l, r, x;
}seg[6 * MAXN];
int segId[6][MAXN];
int id[6][MAXN];
int type[6][4]{
{1, 0, -1, -1},
{-1, 0, 1, -1},
{-1, -1, 0, 1},
{0, -1, -1, 1},
{0, -1, 1, -1},
{-1, 0, -1, 1}
};
struct Plan{
int time, x, y;
bool operator < (const Plan T) const{
return time > T.time;
}
};
priority_queue <Plan> q;
int getNum(Node a, int x){
if (x == 4)
return a.y / 2;
else if (x == 5)
return a.x / 2;
else
return a.x;
}
int vis[MAXN];
void push(int i, int l, int r){
Information res = tree[i].query(l, r);
if (res.minAns >= 1e12)
return;
q.push({res.minAns, res.idL, res.idR});
}
int cnt = 0;
void getAllId(int n){
sort(t + 1, t + n + 1, cmp1);
for (int i = 1, lst = 1; i <= n; i++){
id[0][t[i].id] = id[2][t[i].id] = i;
if (t[i].x + t[i].y != t[i + 1].x + t[i + 1].y){
seg[++cnt] = {lst, i, 0};
for (int j = lst; j <= i; j++)
segId[0][t[j].id] = segId[2][t[j].id] = cnt;
lst = i + 1;
}
}
sort(t + 1, t + n + 1, cmp2);
for (int i = 1, lst = 1; i <= n; i++){
id[1][t[i].id] = id[3][t[i].id] = i;
if (t[i].x - t[i].y != t[i + 1].x - t[i + 1].y){
seg[++cnt] = {lst, i, 1};
for (int j = lst; j <= i; j++)
segId[1][t[j].id] = segId[3][t[j].id] = cnt;
lst = i + 1;
}
}
sort(t + 1, t + n + 1, cmp3);
for (int i = 1, lst = 1; i <= n; i++){
id[4][t[i].id] = i;
if (t[i].x != t[i + 1].x){
seg[++cnt] = {lst, i, 4};
for (int j = lst; j <= i; j++)
segId[4][t[j].id] = cnt;
lst = i + 1;
}
}
sort(t + 1, t + n + 1, cmp4);
for (int i = 1, lst = 1; i <= n; i++){
id[5][t[i].id] = i;
if (t[i].y != t[i + 1].y, 5){
seg[++cnt] = {lst, i, 5};
for (int j = lst; j <= i; j++)
segId[5][t[j].id] = cnt;
lst = i + 1;
}
}
}
void init(int n){
sort(t + 1, t + n + 1, cmp5);
for (int i = 1; i <= n; i++){
for (int j = 0; j < 6; j++){
if (type[j][t[i].a] == -1)
continue;
tree[j].initialVal[id[j][i]] = Information(getNum(t[i], j), type[j][t[i].a], i);
}
}
for (int i = 0; i < 6; i++)
tree[i].buildTree(n);
for (int i = 1; i <= cnt; i++){
auto [l, r, x] = seg[i];
push(x, l, r);
if (x == 0)
push(2, l, r);
else if (x == 1)
push(3, l, r);
}
}
void solve(int x){
for (int i = 0; i < 6; i++){
if (type[i][t[x].a] != -1)
tree[i].change(id[i][x], Information());
auto [l, r, useless] = seg[segId[i][x]];
push(i, l, r);
}
}
signed main(){
int n = read();
for (int i = 1; i <= n; i++){
t[i].x = read(), t[i].y = read(), t[i].id = i;
char c;
cin >> c;
if (c == 'S')
t[i].a = 0;
else if (c == 'E')
t[i].a = 1;
else if (c == 'N')
t[i].a = 2;
else
t[i].a = 3;
}
getAllId(n);
init(n);
while (!q.empty()){
auto [tim, x, y] = q.top();
q.pop();
if (tim >= 1e12)
break;
if ((vis[x] != 0 && vis[x] < tim) || (vis[y] != 0 && vis[y] < tim))
continue;
solve(x), vis[x] = tim;
solve(y), vis[y] = tim;
}
for (int i = 1; i <= n; i++)
if (!vis[i])
cout << i << endl;
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Subtask #1:
score: 6
Accepted
Test #1:
score: 6
Accepted
time: 11ms
memory: 408328kb
input:
2 675333810 792019962 W 851860476 960355168 W
output:
1 2
result:
ok
Test #2:
score: 6
Accepted
time: 24ms
memory: 408740kb
input:
2 714148610 688520844 W 359519570 789553998 S
output:
1 2
result:
ok
Test #3:
score: 6
Accepted
time: 24ms
memory: 408156kb
input:
2 743286406 87591094 E 108453484 326740470 S
output:
1 2
result:
ok
Test #4:
score: 6
Accepted
time: 7ms
memory: 408408kb
input:
2 629499666 659260200 W 391550936 897208930 N
output:
result:
ok
Test #5:
score: 6
Accepted
time: 4ms
memory: 407224kb
input:
2 509095668 374922996 W 325521434 191348762 S
output:
result:
ok
Test #6:
score: 6
Accepted
time: 16ms
memory: 407936kb
input:
2 357656592 713571312 E 456601638 614626266 S
output:
result:
ok
Test #7:
score: 6
Accepted
time: 15ms
memory: 406748kb
input:
2 353512742 374956722 W 265604916 462864548 N
output:
result:
ok
Test #8:
score: 6
Accepted
time: 15ms
memory: 408176kb
input:
2 253519292 302668732 E 436627396 119560628 S
output:
result:
ok
Test #9:
score: 6
Accepted
time: 12ms
memory: 407120kb
input:
2 741954822 709863076 W 516385128 484293380 S
output:
1 2
result:
ok
Test #10:
score: 6
Accepted
time: 3ms
memory: 407732kb
input:
2 268851874 524109226 E 503673708 758931058 N
output:
1 2
result:
ok
Test #11:
score: 6
Accepted
time: 36ms
memory: 407836kb
input:
2 629380956 395789270 S 557401140 467769088 E
output:
1 2
result:
ok
Test #12:
score: 6
Accepted
time: 23ms
memory: 408680kb
input:
2 606361496 587557658 N 667076156 526843000 W
output:
1 2
result:
ok
Test #13:
score: 6
Accepted
time: 24ms
memory: 408432kb
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: 11ms
memory: 407520kb
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: 36ms
memory: 408120kb
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: 16ms
memory: 407276kb
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 2 3 4 5 6 8 10 11 12 13 14 15 19 20 21 23 24 26 28 29 30 31 32 33 35 36 37 39 40 41 42 45 46 47 48 49 50 51 53 54 56 57 58 59 61 62 63 64 65 67 69 70 71 73 74 76 77 78 79 80 81 83 84 85 87 89 91 92 93 95 96 98 99
result:
FAIL Unexpected end of file - token expected (/var/uoj_data/9161/16.ans)
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
Time Limit Exceeded
Test #58:
score: 0
Time Limit Exceeded
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:
result:
Subtask #7:
score: 0
Skipped
Dependency #1:
100%
Accepted
Dependency #2:
0%