메뉴 건너뛰기

Programing

BAEKJOON

10070

관리자 2020.04.11 09:27 조회 수 : 44

C++

1.

#include <cstdio>

#include <climits>

#include <algorithm>

 

using namespace std;

const int max_N=2000000;

int N,K;

int tree[max_N*4][2];

 

void update(int t[2], int t2[2])

{

    if(t2[0] > t[1])

        t[0] = t[1] = t2[0];

    else if(t2[1] < t[0])

        t[0] = t[1] = t2[1];

    else

    {

        t[0] = max(t[0], t2[0]);

        t[1] = min(t[1], t2[1]);

    }

}

void lazy_(int idx,int s,int e){

    if(s!=e){

        update(tree[idx << 1], tree[idx]);

        update(tree[(idx << 1) | 1], tree[idx]);

        tree[idx][0]=0;

        tree[idx][1]=INT_MAX;

        return;

    }

}

void update(int idx,int s,int e,int op,int l,int r,int h){

    lazy_(idx,s,e);

    if(r < s || l > e)

        return ;

    if(l<=s&&e<=r){

        if(op-1){

            int t[2] = { 0, h};

            update(tree[idx], t);

        }else{

            int t[2] = { h, INT_MAX};

            update(tree[idx], t);

        }

        return;

    }

    int mid=(s+e)/2;

    update(idx<<1,s,mid,op,l,r,h);

    update((idx<<1)|1,mid+1,e,op,l,r,h);

}

void print(int idx,int s,int e){

    lazy_(idx,s,e);

    if(s==e){

        printf("%d\n",tree[idx][0]);

        return;

    }

    int mid=(s+e)/2;

    print(idx<<1,s,mid);

    print((idx<<1)|1,mid+1,e);

}

int main()

{

    scanf("%d %d",&N,&K);

    for(int i=1;i<=K;i++){

        int op,l,r,h;

        scanf("%d %d %d %d",&op,&l,&r,&h);

        update(1,0,N-1,op,l,r,h);

    }

    print(1,0,N-1);

    return 0;

}

2.
#include <cstdio>
#include <climits>
#include <cstring>
using namespace std;
const int max_N=2000000;
int N,K;
int tree[max_N*4];
int lazy[max_N*4][2];
void build(int idx,int s,int e){
    if(s==e){
        tree[idx]=0;
        lazy[idx][0]=0;
        lazy[idx][1]=INT_MAX;
        return;
    }
    int mid=(s+e)/2;
    build(idx<<1,s,mid);
    build((idx<<1)|1,mid+1,e);
}
void lazy_(int idx,int s,int e){
    if(s!=e){
        if(lazy[idx<<1][0]<lazy[idx][0]){
            lazy[idx<<1][0]=lazy[idx][0];
            if(lazy[idx<<1][1]<lazy[idx][0])
                lazy[idx<<1][1]=lazy[idx][0];
        }
        if(lazy[idx<<1][1]>lazy[idx][1]){
            lazy[idx<<1][1]=lazy[idx][1];
            if(lazy[idx<<1][0]>lazy[idx][1])
                lazy[idx<<1][0]=lazy[idx][1];
        }
        if(lazy[idx<<1|1][0]<lazy[idx][0]){
            lazy[idx<<1|1][0]=lazy[idx][0];
            if(lazy[idx<<1|1][1]<lazy[idx][0])
                lazy[idx<<1|1][1]=lazy[idx][0];
        }
        if(lazy[idx<<1|1][1]>lazy[idx][1]){
            lazy[idx<<1|1][1]=lazy[idx][1];
            if(lazy[idx<<1|1][0]>lazy[idx][1])
                lazy[idx<<1|1][0]=lazy[idx][1];
        }
        lazy[idx][0]=0;
        lazy[idx][1]=INT_MAX;
        return;
    }
    if(tree[idx]>lazy[idx][1]){
        tree[idx]=lazy[idx][1];
    }
    if(tree[idx]<lazy[idx][0]){
        tree[idx]=lazy[idx][0];
    }
    lazy[idx][0]=0;
    lazy[idx][1]=INT_MAX;
    return;
}
void update(int idx,int s,int e,int op,int l,int r,int h){
    lazy_(idx,s,e);
    if(r < s || l > e)
        return ;
    if(l<=s&&e<=r){
        if(op-1){
            if(lazy[idx][1]>h){
                lazy[idx][1]=h;
                if(lazy[idx][0]>h)
                    lazy[idx][0]=h;
            }
        }else{
            if(lazy[idx][0]<h){
                lazy[idx][0]=h;
                if(lazy[idx][1]<h)
                    lazy[idx][1]=h;
            }
        }
        return;
    }
    int mid=(s+e)/2;
    update(idx<<1,s,mid,op,l,r,h);
    update((idx<<1)|1,mid+1,e,op,l,r,h);
}
void print(int idx,int s,int e){
    lazy_(idx,s,e);
    if(s==e){
        printf("%d\n",tree[idx]);
        return;
    }
    int mid=(s+e)/2;
    print(idx<<1,s,mid);
    print((idx<<1)|1,mid+1,e);
}
int main()
{
    memset(tree,-1,sizeof(tree));
    scanf("%d %d",&N,&K);
    build(1,0,N-1);
    for(int i=1;i<=K;i++){
        int op,l,r,h;
        scanf("%d %d %d %d",&op,&l,&r,&h);
        update(1,0,N-1,op,l,r,h);
    }
    print(1,0,N-1);
    return 0;
}
 
번호 제목 글쓴이 날짜 조회 수
공지 안내사항 관리자 2019.12.21 173
74 9663 관리자 2019.12.21 124
73 9345 관리자 2020.04.11 160
72 9019 관리자 2019.12.21 126
71 7569 관리자 2019.12.21 123
70 6987 관리자 2019.12.21 125
69 5842 관리자 2020.04.11 161
68 5625 관리자 2019.12.21 119
67 5419 관리자 2020.04.11 166
66 3392 관리자 2020.04.11 166
65 3019 관리자 2019.12.21 121
64 2933 관리자 2019.12.21 123
63 2931 관리자 2019.12.21 121
62 2836 관리자 2019.12.21 120
61 2667 관리자 2019.12.21 123
60 2636 관리자 2019.12.21 123
59 2629 관리자 2020.04.11 156
58 2615 관리자 2019.12.21 121
57 2610 관리자 2020.04.11 158
56 2606 관리자 2019.12.21 121
55 2585 관리자 2019.12.21 127
54 2578 관리자 2019.12.21 121
53 2573 관리자 2020.04.11 161
52 2557 관리자 2019.12.21 121
51 2512 관리자 2019.12.21 121
50 2504 관리자 2020.04.11 157
49 2481 관리자 2019.12.21 122
48 2478 관리자 2020.04.11 158
47 2473 관리자 2020.04.11 163
46 2470 관리자 2020.04.11 161
위로