Submission #554748

# Submission time Handle Problem Language Result Execution time Memory
554748 2022-04-29T10:48:44 Z alextodoran The Forest of Fangorn (CEOI14_fangorn) C++17
0 / 100
153 ms 65536 KB
/**
 ____ ____ ____ ____ ____
||a |||t |||o |||d |||o ||
||__|||__|||__|||__|||__||
|/__\|/__\|/__\|/__\|/__\|

**/

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef long double ld;

const int T_MAX = 2000;
const int C_MAX = 10000;

struct Point {
    int x, y;
};

int W, H;
int T, C;
Point me;
Point trees[T_MAX + 2];
Point camps[C_MAX + 2];

int quad (const Point &a, const Point &b) {
    if (a.x < b.x && a.y <= b.y) {
        return 1;
    } else if (b.x <= a.x && a.y < b.y) {
        return 2;
    } else if (b.x < a.x && b.y <= a.y) {
        return 3;
    } else {
        return 4;
    }
}

ld getlen (const Point &a, const Point &b) {
    ld x, y;
    if (a.y == b.y) {
        x = -1;
    } else if (a.y > b.y) {
        x = a.x + (ld) (b.x - a.x) / (b.y - a.y) * (0 - a.y);
    } else {
        x = a.x + (ld) (b.x - a.x) / (b.y - a.y) * (H - a.y);
    }
    if (a.x == b.x) {
        y = -1;
    } else if (a.x > b.x) {
        y = a.y + (ld) (b.y - a.y) / (b.x - a.x) * (0 - a.x);
    } else {
        y = a.y + (ld) (b.y - a.y) / (b.x - a.x) * (W - a.x);
    }
    if (!(0 <= x && x <= W)) {
        return (a.x < b.x ? W + y : W + H + W + (H - y));
    } else {
        return (a.y < b.y ? W + H + (W - x) : x);
    }
}

ld ttlen[T_MAX + 2][T_MAX + 2];
int clen[C_MAX + 2];
int cperm[C_MAX + 2];

int id[T_MAX + 2][C_MAX + 2];

int tperm[T_MAX + 2];
void splitBy (int t) {
    iota(tperm + 1, tperm + T + 1, 1);
    swap(tperm[t], tperm[T]);
    sort(tperm + 1, tperm + (T - 1) + 1, [&] (const int &t1, const int &t2) {
        return ttlen[t][t1] < ttlen[t][t2];
    });
    for (int ci = 1, ti = 0; ci <= C; ci++) {
        while (ti + 1 < T && ttlen[t][tperm[ti + 1]] < clen[cperm[ci]]) {
            ti++;
        }
        id[t][cperm[ci]] = (ti > 0 ? ti : T - 1);
    }
}

int main () {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    cin >> W >> H;
    cin >> me.x >> me.y;
    cin >> C;
    for (int c = 1; c <= C; c++) {
        cin >> camps[c].x >> camps[c].y;
    }
    cin >> T;
    for (int t = 1; t <= T; t++) {
        cin >> trees[t].x >> trees[t].y;
    }
    camps[++C] = me;

    for (int t1 = 1; t1 <= T; t1++) {
        for (int t2 = 1; t2 <= T; t2++) {
            if (t1 != t2) {
                trees[t2].x = trees[t1].x * 2 - trees[t2].x;
                trees[t2].y = trees[t1].y * 2 - trees[t2].y;
                ttlen[t1][t2] = getlen(trees[t1], trees[t2]);
                trees[t2].x = trees[t1].x * 2 - trees[t2].x;
                trees[t2].y = trees[t1].y * 2 - trees[t2].y;
            }
        }
    }
    for (int c = 1; c <= C; c++) {
        if (camps[c].y == 0) {
            clen[c] = camps[c].x;
        } else if (camps[c].x == W) {
            clen[c] = W + camps[c].y;
        } else if (camps[c].y == H) {
            clen[c] = W + H + (W - camps[c].x);
        } else {
            clen[c] = W + H + W + (H - camps[c].y);
        }
    }
    iota(cperm + 1, cperm + C + 1, 1);
    sort(cperm + 1, cperm + C + 1, [&] (const int &c1, const int &c2) {
        return clen[c1] < clen[c2];
    });

    for (int t = 1; t <= T; t++) {
        splitBy(t);
    }

    vector <int> reach;
    for (int c = 1; c < C; c++) {
        bool ok = true;
        for (int t = 1; t <= T; t++) {
            if (id[t][c] != id[t][C]) {
                ok = false;
                break;
            }
        }
        if (ok == true) {
            reach.push_back(c);
        }
    }
    cout << (int) reach.size() << "\n";
    for (int c : reach) {
        cout << c << " ";
    }
    cout << "\n";

    return 0;
}
# Verdict Execution time Memory Grader output
1 Correct 1 ms 324 KB Output is correct
2 Incorrect 1 ms 328 KB Output isn't correct
3 Incorrect 1 ms 348 KB Output isn't correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
6 Incorrect 1 ms 348 KB Output isn't correct
7 Correct 1 ms 988 KB Output is correct
8 Correct 1 ms 976 KB Output is correct
# Verdict Execution time Memory Grader output
1 Incorrect 1 ms 596 KB Output isn't correct
2 Correct 1 ms 724 KB Output is correct
3 Correct 1 ms 980 KB Output is correct
4 Incorrect 2 ms 980 KB Output isn't correct
5 Incorrect 1 ms 980 KB Output isn't correct
6 Incorrect 3 ms 1620 KB Output isn't correct
7 Correct 1 ms 328 KB Output is correct
8 Incorrect 1 ms 468 KB Output isn't correct
9 Correct 1 ms 852 KB Output is correct
10 Correct 4 ms 2260 KB Output is correct
11 Correct 5 ms 2476 KB Output is correct
12 Correct 6 ms 2612 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 468 KB Output is correct
2 Correct 1 ms 596 KB Output is correct
3 Correct 1 ms 584 KB Output is correct
4 Incorrect 135 ms 24128 KB Output isn't correct
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Runtime error 153 ms 65536 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -