본문 바로가기

ps(알고리즘)

사탕상자

 

간단한 세그트리 응용 문제이다.

세그트리에는 1부터 1000000까지의 맛이 각각 몇개 들어있는지 저장하면 된다.

쿼리가 약간 다른데, 순위가 x인 사탕의 맛을 찾으려면 x가 seg[n*2]보다 크면 x에서 seg[n*2]를 빼고 seg[n*2+1]로 이동하면 되고,

작으면 seg[n*2]로 이동하면 된다.

#include<stdio.h>
int N;
long long M=1000000;
long long seg[4000004];
void update(long long n, long long s, long long e, long long ind, long long v)
{
    if(ind<s || e<ind) return;
    seg[n] += v;
    if(s!=e)
    {
        long long m = (s+e)/2;
        update(n*2,s,m,ind,v);
        update(n*2+1,m+1,e,ind,v);
    }
    return;
}
long long finds(long long n, long long s, long long e, long long v)
{
    if(s==e) return s;
    long long m = (s+e)/2;
    if(seg[n*2] < v)
    {
        return finds(n*2+1,m+1,e,v-seg[n*2]);
    }
    else
    {
        return finds(n*2,s,m,v);
    }
}
int main()
{
    scanf("%d",&N);
    for(int i=1;i<=N;i++)
    {
        int a;
        scanf("%d",&a);
        if(a==1)
        {
            long long b;
            scanf("%lld",&b);
            int x = finds(1,1,M,b);
            printf("%lld\n",x);
            update(1,1,M,x,-1);
        }
        if(a==2)
        {
            long long b,c;
            scanf("%lld %lld",&b,&c);
            update(1,1,M,b,c);
        }
    }
}

어렵지 않으니 update와 find 함수 부분만 보면 바로 이해할 수 있다.

'ps(알고리즘)' 카테고리의 다른 글

선분 그룹  (0) 2024.12.03
전깃줄-2  (0) 2024.12.03
볼록 껍질  (0) 2024.12.03
Strongly Connected Componen  (0) 2024.12.03
백조의 호수  (0) 2024.11.28