본문 바로가기
IT/BOJ

백준(BOJ) 5676 음주코딩 **

by 빨강자몽 2018. 6. 1.

우선 알고리즘은 기본적인 세그먼트 트리를 이용하여 풀면 됩니다.

이번 문제를 풀면서 넘나 부끄러웠습니다....
알고리즘을 이해하였다고해서 기본적인 실수를 하면서...
많은 시간을 썼습니다...

우선 항상 숫자입력을 받다보니 문자 입력을 이상하게 받아오고
정답이 오버플로우가 나타날수 있다는 것도 깨닫지 못했습니다.....

다음부터 기본부터 실수 하는일이 없도록 조심해야할 것 같습니다.


#include <iostream>
#include <algorithm>
#include <vector>
#include <string.h>
#include <math.h>
#include <queue>
#include <set>
#include <utility>
#include <functional>
#define MAX 100005
#define MOD 1000000007
#pragma warning(disable:4996)
using namespace std;

int n,m,a,b,map[MAX*4],ans;

int segtree(int cur,int val, int left, int right, int ldest,int rdest)
{
    if(left==ldest&&right==rdest)
    {
        map[cur]=val;
        return map[cur];
    }
    if(right<ldest||rdest<left)
        return map[cur];
    int mid=(left+right)/2;
    map[cur]=segtree(cur*2,val,left,mid,ldest,rdest)*segtree(cur*2+1,val,mid+1,right,ldest,rdest);
    return map[cur];
}
// 세그먼트 트리의 update를 하는 과정 하나씩 트리를 완성해간다.

void result(int cur,int left, int right, int ldest,int rdest)
{
    if(ldest<=left&&right<=rdest)
    {
        ans*=map[cur];
        return;
    }
    if(right<ldest||rdest<left)
        return;
    
    int mid=(left+right)/2;
    result(cur*2,left,mid,ldest,rdest);
    result(cur*2+1,mid+1,right,ldest,rdest);
}
// 정답을 출력하기위해 계산을한다.

int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        fill_n(&map[0],MAX*4,1);
        for(int i=1;i<=n;i++)
        {
            int tmp;
            scanf("%d",&tmp);
            if(tmp>0)
                segtree(1,1,1,n,i,i);
            else if(tmp<0)
                segtree(1,-1,1,n,i,i);
            else
                segtree(1,0,1,n,i,i);
            // 정답의 오버플로우 방지를 위해서 0,1,-1 이용한다.
        }
        for(int i=0;i<m;i++)
        {
            ans=1;
            char tmp;
            scanf(" %c %d %d",&tmp,&a,&b);
            if(tmp=='C')
            {
                if(b>0)
                    segtree(1,1,1,n,a,a);
                else if(b<0)
                    segtree(1,-1,1,n,a,a);
                else
                    segtree(1,0,1,n,a,a);
                // 정답의 오버플로우 방지를 위해서 0,1,-1 이용한다.
            }
            else if(tmp )
            {
                result(1,1,n,a,b);
                if(ans==0)
                    printf("0");
                else if(ans>0)
                    printf("+");
                else
                    printf("-");
            }
        }
        printf("\n");
    }
}


'IT > BOJ' 카테고리의 다른 글

백준(BOJ) 2188 축사 배정 ***  (0) 2018.06.01
백준(BOJ) 6086 최대 유량 ***  (0) 2018.06.01
백준(BOJ) 11505 구간 곱 구하기 *  (0) 2018.06.01
백준(BOJ) 2336 굉장한 학생 ***  (0) 2018.06.01
백준(BOJ) 1920 수찾기 *  (0) 2018.06.01