티스토리 뷰

ps

BOJ 18407(가로 블록 쌓기)풀이

KWG07(joseph0528) 2021. 3. 5. 21:58

solved.ac 티어 : 플래 3

www.acmicpc.net/problem/18407

 

18407번: 가로 블록 쌓기

가로 블록만 등장하는 테트리스 게임을 해보려고 한다. 가로 블록은 총 N개가 등장할 예정이고, 등장하는 순서대로 1, 2, ..., N번이다. i번 블록의 높이는 1이고, 너비는 Wi이다. i번 블록은 왼쪽 벽

www.acmicpc.net

새로 떨어지는 블록은 자신의 구간에서의 최댓값+1이다. 그러므로 세그레이지로 max를 구해주고 max+1 값을 구간에 저장해준다. 그리고 max값이 최대 높이일 경우 최대 높이를 올려준다음 마지막에 나온 최대 높이를 출력해주면 된다.

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct qu{
    ll left,right;
};
vector<qu>l(2000001);
ll a,tree_size;
vector<ll>tree(8010000);
vector<ll>tree1(8010000);
vector<ll>A;
ll seg(ll n,ll s,ll e){
    if(s==e){return tree[n]=0;}
    return tree[n]=max(seg(n*2,s,(s+e)/2),seg(n*2+1,(s+e)/2+1,e));
}
void propagate(ll n,ll s,ll e){
    if(tree1[n]!=0){
        if(s!=e){
            tree1[n*2]=max(tree1[n*2],tree1[n]);
            tree1[n*2+1]=max(tree1[n*2+1],tree1[n]);
        }
        tree[n]=max(tree[n],tree1[n]);
        tree1[n]=0;
    }
}
ll max1(ll n,ll s,ll e,ll left,ll right){
    propagate(n,s,e);
    if(left>e||right<s){return 0;}
    if(left<=s&&e<=right){return tree[n];}
    return max(max1(n*2,s,(s+e)/2,left,right),max1(n*2+1,(s+e)/2+1,e,left,right));
}
void change(ll n,ll s,ll e,ll s1,ll e1,ll f){
    propagate(n,s,e);
    if(s1<=s&&e<=e1){tree1[n]=max(f,tree1[n]);propagate(n,s,e);return;}
    if(e1<s||s1>e){return;}
    change(n*2,s,(s+e)/2,s1,e1,f);
    change(n*2+1,(s+e)/2+1,e,s1,e1,f);
    tree[n]=max(tree[n*2],tree[n*2+1]);
}
int main()
{
    ll b,c,d,q,k,gh,gk,cnt=0,val=0,as=0;
    scanf("%lld",&a);
    int i;
    for(i=0;i<a;i++){
        scanf("%lld %lld\n",&l[i].left,&l[i].right);
        as=l[i].right;
        l[i].right+=l[i].left-1;
        l[i].left=as;
        
        A.push_back(l[i].left);
        A.push_back(l[i].right);
    }
    sort(A.begin(),A.end());
    A.erase(unique(A.begin(),A.end()),A.end());
    for(i=0;i<a;i++){
        l[i].left=lower_bound(A.begin(),A.end(),l[i].left)-A.begin();
        l[i].right=lower_bound(A.begin(),A.end(),l[i].right)-A.begin();
    }
    seg(1,0,2000000);
    for(i=0;i<a;i++){
        //printf("%lld %lld\n",l[i].left,l[i].right);
        val=max1(1,0,2000000,l[i].left,l[i].right);
        if(val==cnt)cnt++;
        //printf("#%lld\n",val);
        change(1,0,2000000,l[i].left,l[i].right,val+1);
        //printf("%lld\n",cnt);
    }
    printf("%lld\n",cnt);
}

'ps' 카테고리의 다른 글

BOJ 14268(회사 문화 2)풀이  (0) 2021.03.07
BOJ 14267(회사 문화 1)풀이  (0) 2021.03.07
BOJ 14574(헤븐스 키친)풀이  (0) 2021.03.03
BOJ 17472(다리 만들기 2)풀이  (0) 2021.03.01
BOJ 16404(주식회사 승범이네)풀이  (0) 2021.02.26
댓글