답안 #305181

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
305181 2020-09-22T17:07:02 Z phathnv Sunčanje (COCI18_suncanje) C++11
0 / 130
1350 ms 97124 KB
#include <bits/stdc++.h>

#define mp make_pair
#define X first
#define Y second
#define taskname "SUMCANJE"

using namespace std;

typedef long long ll;
typedef pair <int, int> ii;

const int N = 1e5 + 1;
const int INF = 1e9;

struct rectangle{
    int x1, x2, y1, y2;
    rectangle(int _x1 = 0, int _x2 = 0, int _y1 = 0, int _y2 = 0){
        x1 = _x1;
        x2 = _x2;
        y1 = _y1;
        y2 = _y2;
    }
};

struct segmentTree{
    set <ii> d[N * 8];
    bool check(set <ii> &s, int l, int r){
        if (s.empty())
            return 1;
        auto it = s.lower_bound(mp(l, 0));
        if (it != s.end()){
            if ((*it).X <= r)
                return 0;
        }
        if (it != s.begin()){
            --it;
            if ((*it).Y >= l)
                return 0;
        }
        return 1;
    }
    void add(set <ii> &s, int l, int r){
        if (s.empty()){
            s.insert(mp(l, r));
            return;
        }

        auto first = s.upper_bound(mp(l, 0));
        auto last = s.upper_bound(mp(r, INF));
        if (first != s.begin()){
            --first;
            if ((*first).Y < l)
                ++first;
        }

        vector <ii> tmp;
        while (first != last){
            tmp.push_back(*first);
            ++first;
        }
        for(ii p : tmp){
            s.erase(p);
            l = min(l, p.X);
            r = max(r, p.Y);
        }
        s.insert(mp(l, r));
    }
    bool addRect(int id, int l, int r, int x1, int x2, int y1, int y2){
        if (x2 < l || r < x1)
            return 1;

        if (x1 <= l && r <= x2){
            bool res = check(d[id], y1, y2);
            add(d[id], y1, y2);
            return res;
        }

        add(d[id], y1, y2);

        bool res = 1;
        int mid = (l + r) >> 1;
        res = res && addRect(id << 1, l, mid, x1, x2, y1, y2);
        res = res && addRect(id << 1 | 1, mid + 1, r, x1, x2, y1, y2);
        return res;
    }
} ST;

int n;
rectangle rect[N];

int x[2 * N], nX, y[2 * N], nY;
bool ans[N];

void readInput(){
    cin >> n;
    for(int i = 1; i <= n; i++){
        int x, y, a, b;
        cin >> x >> y >> a >> b;
        rect[i] = rectangle(x, x + a - 1, y, y + b - 1);
    }
}

void prepare(){
    for(int i = 1; i <= n; i++){
        x[++nX] = rect[i].x1;
        x[++nX] = rect[i].x2;
        y[++nY] = rect[i].y1;
        y[++nY] = rect[i].y2;
    }
    sort(x + 1, x + 1 + nX);
    sort(y + 1, y + 1 + nY);
    nX = unique(x + 1, x + 1 + nX) - (x + 1);
    nY = unique(y + 1, y + 1 + nY) - (y + 1);
    for(int i = 1; i <= n; i++){
        rect[i].x1 = lower_bound(x + 1, x + 1 + nX, rect[i].x1) - x;
        rect[i].x2 = lower_bound(x + 1, x + 1 + nX, rect[i].x2) - x;
        rect[i].y1 = lower_bound(y + 1, y + 1 + nY, rect[i].y1) - y;
        rect[i].y2 = lower_bound(y + 1, y + 1 + nY, rect[i].y2) - y;
    }
}

void solve(){
//    for(int i = 1; i <= n; i++)
//        cerr << rect[i].x1 << ' ' << rect[i].y1 << ' ' << rect[i].x2 << ' ' << rect[i].y2 << endl;

    for(int i = n; i >= 1; i--){
        ans[i] = ST.addRect(1, 1, nX, rect[i].x1, rect[i].x2, rect[i].y1, rect[i].y2);
        cerr << endl;
    }
    for(int i = 1; i <= n; i++)
        if (ans[i])
            cout << "DA\n";
        else
            cout << "NE\n";
}

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    //freopen(taskname".inp", "r", stdin);
    //freopen(taskname".out", "w", stdout);
    readInput();
    prepare();
    solve();
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 66 ms 41864 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 133 ms 44664 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 237 ms 47804 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 341 ms 51708 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 669 ms 66428 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 631 ms 62712 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 830 ms 77560 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1350 ms 97124 KB Output is correct
2 Incorrect 623 ms 60280 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1262 ms 88388 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1337 ms 86284 KB Output isn't correct
2 Halted 0 ms 0 KB -