답안 #616898

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
616898 2022-08-01T07:31:43 Z 박상훈(#8502) 청소 (JOI20_sweeping) C++17
0 / 100
2028 ms 66040 KB
#include <bits/stdc++.h>

typedef long long ll;
using namespace std;
namespace I{
    vector<int> X, Y, T, A, B;
}

struct Seg{
    int tree[4400400], lazy[4400400];
    void propagate(int i, int l, int r){
        tree[i] = max(tree[i], lazy[i]);
        if (l!=r){
            lazy[i<<1] = max(lazy[i<<1], lazy[i<<1|1]);
            lazy[i<<1|1] = max(lazy[i<<1|1], lazy[i]);
        }
        lazy[i] = 0;
    }
    void update(int i, int l, int r, int s, int e, int x){
        propagate(i, l, r);
        if (r<s || e<l) return;
        if (s<=l && r<=e){
            lazy[i] = x;
            propagate(i, l, r);
            return;
        }
        int m = (l+r)>>1;
        update(i<<1, l, m, s, e, x); update(i<<1|1, m+1, r, s, e, x);
        tree[i] = max(tree[i<<1], tree[i<<1|1]);
    }
    int query(int i, int l, int r, int s){
        propagate(i, l, r);
        if (r<s || s<l) return 0;
        if (l==r) return tree[i];
        int m = (l+r)>>1;
        return max(query(i<<1, l, m, s), query(i<<1|1, m+1, r, s));
    }
    int left_bound(int i, int l, int r, int x){
        propagate(i, l, r);
        if (tree[i] <= x) return -1;
        if (l==r) return l;

        int m = (l+r)>>1;
        int ret = left_bound(i<<1, l, m, x);
        if (ret!=-1) return ret;
        return left_bound(i<<1|1, m+1, r, x);
    }
    int right_bound(int i, int l, int r, int x){
        propagate(i, l, r);
        if (tree[i] <= x) return -1;
        if (l==r) return l;

        int m = (l+r)>>1;
        int ret = right_bound(i<<1|1, m+1, r, x);
        if (ret!=-1) return ret;
        return right_bound(i<<1, l, m, x);
    }
}treex, treey;

int n, q;

vector<int> X, Y;
void compress(vector<int> &X){sort(X.begin(), X.end()); X.erase(unique(X.begin(), X.end()), X.end());}
int getidx(const vector<int> &a, int x) {return lower_bound(a.begin(), a.end(), x) - a.begin();}

void input(){
    cin.tie(NULL);
    ios_base::sync_with_stdio(false);
    X.push_back(-2e9);
    X.push_back(2e9);
    Y.push_back(-2e9);
    Y.push_back(2e9);

    int d;
    cin >> d >> n >> q;
    I::X.resize(n+1);
    I::Y.resize(n+1);
    I::T.resize(q+1);
    I::A.resize(q+1);
    I::B.resize(q+1);

    for (int i=1;i<=n;i++){
        cin >> I::X[i] >> I::Y[i];
        X.push_back(I::X[i]);
        Y.push_back(I::Y[i]);
    }

    for (int i=1;i<=q;i++){
        cin >> I::T[i] >> I::A[i];
        if (I::T[i]==4){
            cin >> I::B[i];
            ++n;
        }
        else if (I::T[i]==2){
            I::B[i] = I::A[i];
            I::A[i] = d-I::A[i];
        }
        else if (I::T[i]==3){
            I::B[i] = d-I::A[i];
        }

        if (I::T[i]>=2){
            X.push_back(I::A[i]);
            Y.push_back(I::B[i]);
        }

    }

    compress(X); compress(Y);
    for (int i=1;i<=n;i++){
        I::X[i] = getidx(X, I::X[i]);
        I::Y[i] = getidx(Y, I::Y[i]);
    }

    for (int i=1;i<=q;i++){
        if (I::T[i]>=2){
            I::A[i] = getidx(X, I::A[i]);
            I::B[i] = getidx(Y, I::B[i]);
        }
    }
    ///

    for (int i=1;i<=n;i++){
        treex.update(1, 1, n, i, i, I::X[i]);
        treey.update(1, 1, n, i, i, I::Y[i]);
    }
}

int main(){
    input();

    for (int i=1;i<=q;i++){
        int t = I::T[i], u = I::A[i], v = I::B[i];
        if (t==1){
            printf("%d %d\n", X[treex.query(1, 1, n, u)], Y[treey.query(1, 1, n, u)]);
            continue;
        }

        int l = treey.right_bound(1, 1, n, v)+1;
        int r = treex.left_bound(1, 1, n, u)-1;
        if (l==0) l = 1;
        if (r==-2) r = n;
        //printf("l = %d, r = %d\n", l, r);
        if (l>r) continue;

        if (t==2){
            treex.update(1, 1, n, l, r, u);
        }
        if (t==3){
            treey.update(1, 1, n, l, r, v);
        }
    }
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Runtime error 7 ms 1108 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 679 ms 66040 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2028 ms 62316 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2028 ms 62316 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 7 ms 1108 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -