답안 #154591

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
154591 2019-09-23T03:45:39 Z AQT Sunčanje (COCI18_suncanje) C++14
39 / 130
415 ms 140668 KB
#include <bits/stdc++.h>

using namespace std;

struct Node{
    int l, r;
    set<int> f, fcan;
    int can, p;
};

int N, M;
bool ans[100005];
pair<int, int> arr[100005];
int xo[100005], xx[100005], yo[100005], yx[100005];
vector<int> cmp;
Node seg[600005];

int getidx(int n){
    return lower_bound(cmp.begin(), cmp.end(), n) - cmp.begin() + 1;
}

void build(int l, int r, int idx){
    seg[idx].can = N+1;
    seg[idx].l = l, seg[idx].r = r;
    if(l == r){
        return;
    }
    int mid = l+r>>1;
    build(l, mid, 2*idx);
    build(mid+1, r, 2*idx+1);
}

void pu(int idx){
    seg[idx].p = 0;
    seg[idx].can = N+1;
    if(seg[idx].l != seg[idx].r){
        seg[idx].p = max(seg[2*idx].p, seg[2*idx+1].p);
        seg[idx].can = min(seg[2*idx].can, seg[2*idx+1].can);
    }
    seg[idx].p = max(seg[idx].f.size() ? *(--seg[idx].f.end()) : 0, seg[idx].p);
    seg[idx].can = min(seg[idx].fcan.size() ? *(seg[idx].fcan.begin()) : N+1, seg[idx].can);
}

void remc(int l, int r, int v, int idx){
    if(seg[idx].l == l && seg[idx].r == r){
        seg[idx].fcan.erase(v);
        pu(idx);
        return;
    }
    int mid = seg[idx].l + seg[idx].r >> 1;
    if(r <= mid){
        remc(l, r, v, 2*idx);
    }
    else if(l > mid){
        remc(l, r, v, 2*idx+1);
    }
    else{
        remc(l, mid, v, 2*idx);
        remc(mid+1, r, v, 2*idx+1);
    }
    pu(idx);
}

void add(int l, int r, int v, int idx){
    //cout << l << " " << r << " " << v << endl;
    if(seg[idx].f.size() && *(--seg[idx].f.end()) > v){
        ans[v] = 1;
    }
    while(seg[idx].fcan.size() && *seg[idx].fcan.begin() < v){
        int n = *seg[idx].fcan.begin();
        remc(yo[n], yx[n], n, 1);
        ans[n] = 1;
    }
    if(seg[idx].l == l && seg[idx].r == r){
        seg[idx].f.insert(v);
        seg[idx].fcan.insert(v);
        //cout << *seg[idx].can.begin() << endl;
        while(seg[idx].can < v){
            ans[seg[idx].can] = 1;
            remc(yo[seg[idx].can], yx[seg[idx].can], seg[idx].can, 1);
        }
        if(seg[idx].p > v){
            ans[v] = 1;
        }
        pu(idx);
        return;
    }
    int mid = seg[idx].l + seg[idx].r >> 1;
    if(r <= mid){
        add(l, r, v, 2*idx);
    }
    else if(l > mid){
        add(l, r, v, 2*idx+1);
    }
    else{
        add(l, mid, v, 2*idx);
        add(mid+1, r, v, 2*idx+1);
    }
    pu(idx);
}

void rem(int l, int r, int v, int idx){
    if(seg[idx].l == l && seg[idx].r == r){
        assert(seg[idx].f.erase(v));
        if(seg[idx].fcan.count(v)){
            seg[idx].fcan.erase(v);
        }
        pu(idx);
        return;
    }
    int mid = seg[idx].l + seg[idx].r >> 1;
    if(r <= mid){
        rem(l, r, v, 2*idx);
    }
    else if(l > mid){
        rem(l, r, v, 2*idx+1);
    }
    else{
        rem(l, mid, v, 2*idx);
        rem(mid+1, r, v, 2*idx+1);
    }
    pu(idx);
}

int main(){
    cin.sync_with_stdio(0);
    cin.tie(0);
    cin >> N;
    for(int i = 1; i<=N; i++){
        cin >> xo[i] >> yo[i] >> xx[i] >> yx[i];
        xx[i] += xo[i];
        yx[i] += yo[i];
        yx[i]--;
        cmp.push_back(yo[i]);
        cmp.push_back(yx[i]);
    }
    sort(cmp.begin(), cmp.end());
    cmp.erase(unique(cmp.begin(), cmp.end()), cmp.end());
    M = cmp.size();
    build(1, M, 1);
    for(int i = 1; i<=N; i++){
        yo[i] = getidx(yo[i]), yx[i] = getidx(yx[i]);
        arr[i].first = xo[i];
        arr[i+N].first = xx[i];
        arr[i].second = i;
        arr[i+N].second = -i;
    }
    sort(arr+1, arr+1+2*N);
    for(int n = 1; n<=2*N; n++){
        if(arr[n].second > 0){
            add(yo[arr[n].second], yx[arr[n].second], arr[n].second, 1);
        }
        else{
            rem(yo[-arr[n].second], yx[-arr[n].second], -arr[n].second, 1);
        }
    }
    for(int i = 1; i<=N; i++){
        if(ans[i]){
            cout << "NE\n";
        }
        else{
            cout << "DA\n";
        }
    }
}

/*
5
1 1 20 20
1 1 1 1
1 2 1 1
1 2 2 2
1 1 10 10

3
1 1 2 2
1 4 2 2
3 2 5 5
*/

Compilation message

suncanje.cpp: In function 'void build(int, int, int)':
suncanje.cpp:28:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
     int mid = l+r>>1;
               ~^~
suncanje.cpp: In function 'void remc(int, int, int, int)':
suncanje.cpp:50:26: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
     int mid = seg[idx].l + seg[idx].r >> 1;
               ~~~~~~~~~~~^~~~~~~~~~~~
suncanje.cpp: In function 'void add(int, int, int, int)':
suncanje.cpp:88:26: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
     int mid = seg[idx].l + seg[idx].r >> 1;
               ~~~~~~~~~~~^~~~~~~~~~~~
suncanje.cpp: In function 'void rem(int, int, int, int)':
suncanje.cpp:111:26: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
     int mid = seg[idx].l + seg[idx].r >> 1;
               ~~~~~~~~~~~^~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 76 ms 66680 KB Output is correct
2 Correct 82 ms 66808 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 112 ms 67192 KB Output is correct
2 Correct 237 ms 69620 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 172 ms 68088 KB Output is correct
2 Runtime error 351 ms 140088 KB Execution killed with signal 11 (could be triggered by violating memory limits)
# 결과 실행 시간 메모리 Grader output
1 Correct 220 ms 68868 KB Output is correct
2 Correct 236 ms 69748 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 320 ms 70236 KB Output is correct
2 Runtime error 220 ms 140320 KB Execution killed with signal 11 (could be triggered by violating memory limits)
# 결과 실행 시간 메모리 Grader output
1 Runtime error 415 ms 140504 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 251 ms 69888 KB Output is correct
2 Runtime error 216 ms 140668 KB Execution killed with signal 11 (could be triggered by violating memory limits)
# 결과 실행 시간 메모리 Grader output
1 Runtime error 221 ms 139924 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 228 ms 139812 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 244 ms 140136 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -