상세 컨텐츠

본문 제목

Truth Tellers (JUNGOL 4973)

PS,CP

by 코딩생활 2026. 4. 25. 16:00

본문

https://jungol.co.kr/problem/4973?cursor=MTIsMSw0


아이디어

어떠한 x에 대하여 x가 Ai이상 Bi이하인 i의 개수가 x이상이여야합니다. 그러기 위해서는 초기에 arr[1]=-1, arr[2]=-2, ... arr[N]=-N으로 저장한 다음, Ai, Bi가 주어지면 [Ai,Bi]에 1을 더해주는 쿼리를 느리게 갱신되는 세그먼트 트리로 처리해준 다음, arr배열에서 0이상의 수가 존재하는 가장 큰 인덱스를 찾아주면 됩니다.


소스코드

#include <iostream>
#define ll long long
using namespace std;

ll tree[2020202]={0},lazy[2020202]={0};
void pp(ll s,ll e,ll node)
{
    tree[node]+=lazy[node];
    if (s!=e)
    {
        lazy[node*2]+=lazy[node];
        lazy[node*2+1]+=lazy[node];
    }
    lazy[node]=0;
}
void update(ll s,ll e,ll node,ll l,ll r,ll num)
{
    pp(s,e,node);
    if (e<l || r<s) return;
    if (l<=s && e<=r)
    {
        lazy[node]=num;
        pp(s,e,node);
        return;
    }

    ll mid=(s+e)/2;
    update(s,mid,node*2,l,r,num);
    update(mid+1,e,node*2+1,l,r,num);
    tree[node]=max(tree[node*2],tree[node*2+1]);
}
ll MaxIdx(ll s,ll e,ll node)
{
    pp(s,e,node);
    if (s==e) return s;
    ll mid=(s+e)/2;

    pp(s,mid,node*2),pp(mid+1,e,node*2+1);
    if (tree[node*2+1]>=0) //오른쪽 범위에 0이상인 수가 있다
        return MaxIdx(mid+1,e,node*2+1);
    return MaxIdx(s,mid,node*2);
}

ll L[505050]={0},R[505050]={0};

int main()
{
    ios_base::sync_with_stdio(false); cin.tie(NULL);
    ll N,i;

    cin>>N;
    for (i=1;i<=N;i++) update(0,N,1,i,i,-i);
    for (i=1;i<=N;i++)
    {
        cin>>L[i]>>R[i];
        update(0,N,1,L[i],R[i],1);
    }

    cout<<MaxIdx(0,N,1)<<' ';

    ll Q,a,b,c;
    cin>>Q;
    for (i=1;i<=Q;i++)
    {
        cin>>a>>b>>c;
        update(0,N,1,L[a],R[a],-1);
        L[a]=b,R[a]=c;
        update(0,N,1,L[a],R[a],1);

        cout<<MaxIdx(0,N,1)<<' ';
    }
}

'PS,CP' 카테고리의 다른 글

소방서의 고민 (JUNGOL 6276)  (0) 2026.04.26
왼손에는 콜라, 오른손에는 피자 (JUNGOL 8356)  (0) 2026.04.26
구간의 합 2 (JUNGOL 8082)  (0) 2026.04.25
해밍 경로 2 (JUNGOL 5686)  (0) 2026.04.24
성적 바꾸기 (JUNGOL 1246)  (0) 2026.04.24

관련글 더보기