QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#497355#9161. Naval battleQwerty1232#6 1ms3920kbC++235.7kb2024-07-29 02:43:072024-07-29 02:43:07

Judging History

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

  • [2024-07-29 02:43:07]
  • 评测
  • 测评结果:6
  • 用时:1ms
  • 内存:3920kb
  • [2024-07-29 02:43:07]
  • 提交

answer

#include <bits/stdc++.h>

constexpr std::string_view dir_ch = "ENWS";
constexpr std::array<std::pair<int, int>, 4> dlt = {{{1, 0}, {0, -1}, {-1, 0}, {0, 1}}};

struct Fuck {
    int x, y;
    int dir;
    int id;
};

int32_t main() {
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);

    int n;
    std::cin >> n;
    std::vector<Fuck> input(n);
    // for (auto& i : input) {
    for (int i = 0; i < n; i++) {
        std::cin >> input[i].x >> input[i].y;
        // std::cin >> input[i].y >> input[i].x;

        char ch;
        std::cin >> ch;
        input[i].dir = dir_ch.find(ch);
        input[i].id = i;
    }

    std::vector<std::set<std::array<int, 3>>> set;
    std::vector<std::set<std::array<int, 3>>> set2;
    std::multiset<std::array<int, 3>> set3;

    auto get_min = [&](int i) {
        auto &st = set[i];
        auto &st2 = set2[i];

        std::array<int, 3> min{(int)2.1e9, -1, -1};
        if (st.empty())
            return min;
        for (auto it = std::next(st.begin()); it != st.end(); it++) {
            auto [x1, d1, id1] = *std::prev(it);
            auto [x2, d2, id2] = *it;
            if (d1 == 1 && d2 == -1) {
                assert(x1 < x2);
                assert((x2 - x1) % 2 == 0);
                min = std::min(min, {(x2 - x1) / 2, id1, id2});
            }
        }
        return min;
    };
    auto insert = [&](int i, int x, int dr, int id) {
        if (i == -1) {
            return;
        }
        set3.extract(get_min(i));

        auto &st = set[i];
        auto &st2 = set2[i];
        st.insert({x, dr, id});

        set3.insert(get_min(i));
    };
    auto erase = [&](int i, int x, int dr, int id) {
        if (i == -1) {
            return;
        }
        set3.extract(get_min(i));

        auto &st = set[i];
        auto &st2 = set2[i];
        st.erase({x, dr, id});

        set3.insert(get_min(i));
    };
    // auto get_global_min = [&]() {
    //     return *set3.begin();
    // };

    std::vector<std::vector<std::array<int, 3>>> vec;
    for (auto [i, f] : std::vector<std::pair<int, int (*)(const Fuck &)>>{
             {0, [](const Fuck &a) -> int { return a.x; }},
             {1, [](const Fuck &a) -> int { return a.y; }},
             {2, [](const Fuck &a) -> int { return a.x + a.y; }},
             {3, [](const Fuck &a) -> int { return a.x + a.y; }},
             {4, [](const Fuck &a) -> int { return a.x - a.y; }},
             {5, [](const Fuck &a) -> int { return a.x - a.y; }}}) {
        vec.emplace_back(n);

        auto cmp = [&](auto a, auto b) { return f(a) < f(b); };
        std::sort(input.begin(), input.end(), cmp);

        for (int it = 0; it < input.size();) {
            int it2 = std::upper_bound(input.begin() + it, input.end(), input[it], cmp) - input.begin();
            // if (it + 1 == it2) {
            //     it++;
            //     continue;
            // }
            int s = set.size();
            set.push_back({}), set2.push_back({});
            auto &st = set.back();
            auto &st2 = set2.back();

            for (; it < it2; it++) {
                auto [x, y, dr, id] = input[it];
                vec[i][id].fill(-1);
                auto check = [&](int d, char ch1, char ch2) {
                    return dir_ch[d] == ch1 || dir_ch[d] == ch2;
                };
                /*  */ if (i == 0 && check(dr, 'W', 'E')) {
                    vec[i][id] = {s, x, (dir_ch[dr] == 'E') * 2 - 1};
                } else if (i == 1 && check(dr, 'N', 'S')) {
                    vec[i][id] = {s, y, (dir_ch[dr] == 'S') * 2 - 1};
                } else if (i == 2 && check(dr, 'S', 'E')) {
                    vec[i][id] = {s, y - x, (dir_ch[dr] == 'S') * 2 - 1};
                } else if (i == 3 && check(dr, 'W', 'N')) {
                    vec[i][id] = {s, y - x, (dir_ch[dr] == 'W') * 2 - 1};
                } else if (i == 4 && check(dr, 'N', 'E')) {
                    vec[i][id] = {s, x + y, (dir_ch[dr] == 'E') * 2 - 1};
                } else if (i == 5 && check(dr, 'W', 'S')) {
                    vec[i][id] = {s, x + y, (dir_ch[dr] == 'S') * 2 - 1};
                }
                insert(vec[i][id][0], vec[i][id][1], vec[i][id][2], id);
            }
        }
    }

    std::sort(input.begin(), input.end(), [&](auto a, auto b) { return a.id < b.id; });
    std::map<std::pair<int, int>, int> map;
    for (auto f : input) {
        map[{f.x, f.y}] = f.id;
    }
    std::set<int> alive;
    for (int i = 0; i < n; i++) {
        alive.insert(i);
    }
    while (set3.size()) {
        auto [mn, id1, id2] = *set3.begin();
        if (id1 == -1) {
            break;
        }
        assert(mn >= 0);
        
        std::set<int> to_erase;  // = {id1, id2};
        std::pair<int, int> pos = {input[id1].x + dlt[input[id1].dir].first * mn, input[id1].y + dlt[input[id1].dir].second * mn};
        for (int d = 0; d < 4; d++) {
            std::pair<int, int> pos2(pos.first + dlt[d].first * mn, pos.second + dlt[d].second * mn);
            int id = map.contains(pos2) ? map[pos2] : -1;
            if (id != -1) {
                if (input[id].dir == (d + 2) % 4) {
                    to_erase.insert(id);
                }
            }
        }
        for (auto id : to_erase) {
            if (!alive.contains(id)) {
                continue;
            }
            alive.erase(id);
            for (int i = 0; i < vec.size(); i++) {
                erase(vec[i][id][0], vec[i][id][1], vec[i][id][2], id);
            }
        }
    }

    for (auto &i : alive) {
        std::cout << i + 1 << "\n";
    }

    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Subtask #1:

score: 6
Accepted

Test #1:

score: 6
Accepted
time: 0ms
memory: 3660kb

input:

2
675333810 792019962 W
851860476 960355168 W

output:

1
2

result:

ok 

Test #2:

score: 6
Accepted
time: 0ms
memory: 3836kb

input:

2
714148610 688520844 W
359519570 789553998 S

output:

1
2

result:

ok 

Test #3:

score: 6
Accepted
time: 0ms
memory: 3568kb

input:

2
743286406 87591094 E
108453484 326740470 S

output:

1
2

result:

ok 

Test #4:

score: 6
Accepted
time: 0ms
memory: 3848kb

input:

2
629499666 659260200 W
391550936 897208930 N

output:


result:

ok 

Test #5:

score: 6
Accepted
time: 0ms
memory: 3556kb

input:

2
509095668 374922996 W
325521434 191348762 S

output:


result:

ok 

Test #6:

score: 6
Accepted
time: 0ms
memory: 3536kb

input:

2
357656592 713571312 E
456601638 614626266 S

output:


result:

ok 

Test #7:

score: 6
Accepted
time: 0ms
memory: 3836kb

input:

2
353512742 374956722 W
265604916 462864548 N

output:


result:

ok 

Test #8:

score: 6
Accepted
time: 0ms
memory: 3776kb

input:

2
253519292 302668732 E
436627396 119560628 S

output:


result:

ok 

Test #9:

score: 6
Accepted
time: 0ms
memory: 3848kb

input:

2
741954822 709863076 W
516385128 484293380 S

output:

1
2

result:

ok 

Test #10:

score: 6
Accepted
time: 0ms
memory: 3544kb

input:

2
268851874 524109226 E
503673708 758931058 N

output:

1
2

result:

ok 

Test #11:

score: 6
Accepted
time: 0ms
memory: 3800kb

input:

2
629380956 395789270 S
557401140 467769088 E

output:

1
2

result:

ok 

Test #12:

score: 6
Accepted
time: 0ms
memory: 3640kb

input:

2
606361496 587557658 N
667076156 526843000 W

output:

1
2

result:

ok 

Test #13:

score: 6
Accepted
time: 0ms
memory: 3564kb

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: 1ms
memory: 3876kb

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: 1ms
memory: 3616kb

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: 3920kb

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
17
18
19
20
21
22
23
24
26
28
29
30
31
32
33
35
36
37
39
40
41
42
45
46
47
49
50
51
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
73
74
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
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%