답안 #229166

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
229166 2020-05-03T14:26:19 Z VEGAnn Sunčanje (COCI18_suncanje) C++14
91 / 130
4000 ms 230088 KB
#include <bits/stdc++.h>
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("fast-math")
#pragma GCC optimize("no-stack-protector")
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define PB push_back
#define all(x) x.begin(),x.end()
#define pii pair<int,int>
#define MP make_pair
#define ft first
#define sd second
#define sz(x) ((int)x.size())
using namespace std;
using namespace __gnu_pbds;
template <class T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
typedef long long ll;
const int N = 100100;
const int PW = 22;
const int oo = 2e9;
vector<int> xs, ys;
bool mrk[N];
int x1[N], Y1[N], x2[N], y2[N], n, IND;
ordered_set<pii> up, down, Left, Right, st[4][N];

int get_up_left(int x, int y){
    int res = 0;

    for (int v = x; v >= 0; v = (v & (v + 1)) - 1)
        res += sz(st[0][v]) - st[0][v].order_of_key(MP(y - 1, oo));

    return res;
}

int get_down_left(int x, int y){
    int res = 0;

    for (int v = x; v >= 0; v = (v & (v + 1)) - 1)
        res += st[2][v].order_of_key(MP(y, oo));

    return res;
}

int get_up_right(int x, int y){
    int res = 0;

    for (int v = x; v >= 0; v = (v & (v + 1)) - 1)
        res += sz(st[1][v]) - st[1][v].order_of_key(MP(y - 1, oo));

    return res;
}

int get_down_right(int x, int y){
    int res = 0;

    for (int v = x; v >= 0; v = (v & (v + 1)) - 1)
        res += st[3][v].order_of_key(MP(y, oo));

    return res;
}

void update_fi(int tp, int x, int y){
    for (int v = x; v < sz(xs); v = (v | (v + 1)))
        st[tp][v].insert(MP(y, IND));
}

void update_se(int tp, int x, int y){
    for (int v = x; v < sz(xs); v = (v | (v + 1)))
        st[tp][v].insert(MP(y, IND));
}

// ses

void update_fis(int tp, int x, int y){
    for (int v = x; v < sz(ys); v = (v | (v + 1)))
        st[tp][v].insert(MP(y, IND));}

void update_ses(int tp, int x, int y){
    for (int v = x; v < sz(ys); v = (v | (v + 1)))
        st[tp][v].insert(MP(y, IND));
}

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

#ifdef _LOCAL
    freopen("in.txt","r",stdin);
#endif // _LOCAL

    cin >> n;

    for (int i = 0; i < n; i++){
        int X, Y; cin >> x1[i] >> Y1[i] >> X >> Y;
        x2[i] = x1[i] + X;
        y2[i] = Y1[i] + Y;

        xs.PB(x1[i]);
        ys.PB(x2[i]);
    }

    sort(all(xs));
    sort(all(ys));

    xs.resize(unique(all(xs)) - xs.begin());
    ys.resize(unique(all(ys)) - ys.begin());

    up.clear();
    down.clear();
    Left.clear();
    Right.clear();

    for (int i = n - 1; i >= 0; i--){
        if (i < n - 1){
            int kol = 0;
            kol += sz(up) - up.order_of_key(MP(y2[i] - 1, oo));
            kol += Left.order_of_key(MP(x1[i], oo));
            kol += down.order_of_key(MP(Y1[i], oo));
            kol += sz(Right) - Right.order_of_key(MP(x2[i] - 1, oo));

            int loc = upper_bound(all(ys), x1[i]) - ys.begin() - 1;
            kol -= get_up_left(loc, y2[i]);

            loc = upper_bound(all(ys), x1[i]) - ys.begin() - 1;
            kol -= get_down_left(loc, Y1[i]);

            loc = lower_bound(all(xs), x2[i]) - xs.begin();
            kol -= get_up_right(sz(xs) - 1 - loc, y2[i]);

            loc = lower_bound(all(xs), x2[i]) - xs.begin();
            kol -= get_down_right(sz(xs) - 1 - loc, Y1[i]);

            if (kol < n - i - 1)
                mrk[i] = 1;
        }

        // add new elements
        up.insert(MP(Y1[i], i));
        down.insert(MP(y2[i], i));
        Left.insert(MP(x2[i], i));
        Right.insert(MP(x1[i], i));

        IND = i;

        int loc = lower_bound(all(ys), x2[i]) - ys.begin();
        update_fis(2, loc, y2[i]);

        loc = lower_bound(all(xs), x1[i]) - xs.begin();
        update_fi(3, sz(xs) - 1 - loc, y2[i]);

        loc = lower_bound(all(ys), x2[i]) - ys.begin();
        update_ses(0, loc, Y1[i]);

        loc = lower_bound(all(xs), x1[i]) - xs.begin();
        update_se(1, sz(xs) - 1 - loc, Y1[i]);
    }

    for (int i = 0; i < n; i++)
        cout << (mrk[i] ? "NE\n" : "DA\n");

    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 140 ms 47864 KB Output is correct
2 Correct 192 ms 51704 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 439 ms 64504 KB Output is correct
2 Correct 2140 ms 142716 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 922 ms 87336 KB Output is correct
2 Correct 2754 ms 167424 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1397 ms 107224 KB Output is correct
2 Correct 2176 ms 146452 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2338 ms 151132 KB Output is correct
2 Correct 3016 ms 176884 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2561 ms 158124 KB Output is correct
2 Correct 2770 ms 168180 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2503 ms 157128 KB Output is correct
2 Correct 3404 ms 188568 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 4083 ms 220224 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 4083 ms 230088 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 4073 ms 225376 KB Time limit exceeded
2 Halted 0 ms 0 KB -