๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm๐Ÿฐ/๋ฐฑ์ค€

[๋ฐฑ์ค€] 3020 ๊ฐœ๋˜ฅ๋ฒŒ๋ ˆ prefix sum(๋ˆ„์ ํ•ฉ)

by Jouureee 2022. 2. 21.

๋ฌธ์ œ :

https://www.acmicpc.net/problem/3020

 

3020๋ฒˆ: ๊ฐœ๋˜ฅ๋ฒŒ๋ ˆ

๊ฐœ๋˜ฅ๋ฒŒ๋ ˆ ํ•œ ๋งˆ๋ฆฌ๊ฐ€ ์žฅ์• ๋ฌผ(์„์ˆœ๊ณผ ์ข…์œ ์„)๋กœ ๊ฐ€๋“์ฐฌ ๋™๊ตด์— ๋“ค์–ด๊ฐ”๋‹ค. ๋™๊ตด์˜ ๊ธธ์ด๋Š” N๋ฏธํ„ฐ์ด๊ณ , ๋†’์ด๋Š” H๋ฏธํ„ฐ์ด๋‹ค. (N์€ ์ง์ˆ˜) ์ฒซ ๋ฒˆ์งธ ์žฅ์• ๋ฌผ์€ ํ•ญ์ƒ ์„์ˆœ์ด๊ณ , ๊ทธ ๋‹ค์Œ์—๋Š” ์ข…์œ ์„๊ณผ ์„์ˆœ์ด

www.acmicpc.net

 

๋ถ„์„ :

1. ์„์ˆœ๊ณผ ์ข…์œ ์„์˜ ๊ตฌ๋ถ„์€ ์ง์ˆ˜์ธ์ง€ ํ™€์ˆ˜์ธ์ง€๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐœ๋˜ฅ๋ฒŒ๋ ˆ๊ฐ€ ๋†’์ด 1์ธ ๊ณณ์„ ์ง€๋‚œ๋‹ค๋ฉด ์ข…์œ ์„์€ 1์ธ ๋†’์ด, ์„์ˆœ์€ H -1 ์ธ ๋†’์ด๋ฅผ ๋™์‹œ์— ์ง€๋‚œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

2. ์„์ˆœ๋ผ๋ฆฌ์˜ (๋˜๋Š” ์ข…์œ ์„๋ผ๋ฆฌ์˜) ์ˆœ์„œ ๋ฐ”๋€œ์€ ์ƒ๊ด€์ด ์—†๋‹ค. ๊ฐœ๋˜ฅ๋ฒŒ๋ ˆ๋Š” N ๊ธธ์ด๋ฅผ ํ†ต๊ณผํ•˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์„์ˆœ์˜ ๊ธธ์ด๋งŒํผ ๊ฐ€์ง„ ์„์ˆœ ๊ฐœ์ˆ˜๋ฅผ ๋ฐฐ์—ด์— ์ €์žฅํ•œ๋‹ค. (์ข…์œ ์„๋„ ๋˜‘๊ฐ™๋‹ค)

3. ๋†’์ด๊ฐ€ H์ผ๋•Œ ๊ฐœ๋˜ฅ๋ฒŒ๋ ˆ๋Š” ์ข…์œ ์„์˜ H ๋†’์ด๋งŒ์„ ์ง€๋‚˜๊ฐ„๋‹ค. H-1์ผ๋•Œ๋Š” H-1 ๋†’์ด์ธ ์ข…์œ ์„ + H ๋†’์ด์ธ ์ข…์œ ์„์„ ์ง€๋‚˜๊ฐ„๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ H-2์ผ๋•Œ ==> H-2 ๋†’์ด ์ข…์œ ์„ + H-1 ๋†’์ด ์ข…์œ ์„ + H ๋†’์ด ์ข…์œ ์„์„ ์ง€๋‚˜๊ฐ„๋‹ค. ๋ˆ„์ ํ•ฉ์„ ์ ์šฉํ•˜๋ฉด ๋ ๊ฑฐ ๊ฐ™๋‹ค.

4. ์„์ˆœ๊ณผ ์ข…์œ ์„์„ ๋™์‹œ์— ์ง€๋‚˜๊ฐ€๋ฏ€๋กœ sum ๋ฐฐ์—ด์— i๋†’์ด ์„์ˆœ + H-i ๋†’์ด ์ข…์œ ์„์„ ๋”ํ•ด ๊ฐœ๋˜ฅ๋ฒŒ๋ ˆ๊ฐ€ ์ง€๋‚˜๊ฐˆ ์ด ์žฅ์• ๋ฌผ์„ ์ €์žฅํ•œ๋‹ค.

 

c++ ์ฝ”๋“œ :

//
//  3020_ firefly.cpp
//  SOMA๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป
//
//  Created by JoSoJeong on 2022/02/21.
//

#include <iostream>
#include <string.h>
#include <algorithm>

using namespace std;
int N, H, h;
long long mite[5000001]; //์„์ˆœ
long long tite[5000001]; //์ข…์œ ์„
long long sum[5000001];

int main(){
    cin >> N >> H;
    memset(mite, 0, sizeof(mite));
    memset(tite, 0, sizeof(tite));
    memset(sum, 0, sizeof(sum));
    
    for(int i = 1; i <= N; i++){
        cin >> h;
        if(i % 2 == 1){ // ์„์ˆœ
            mite[h]++; //h ๋†’์ด์ธ ๊ฐœ์ˆ˜
        }else{
            tite[h]++;
        }
    }
    
    for(int i = H - 2; i >= 1; i--){ // ๋ˆ„์ ํ•ฉ
        mite[i] += mite[i+1];
        tite[i] += tite[i+1];
    }
    
    for(int i = 1; i <= H; i++){
        sum[i] = mite[i] + tite[H + 1 - i]; // i ๋†’์ด ์„์ˆœ + H - i ๋†’์ด ์ข…์œ ์„
    }
    
    sort(sum+1, sum+H+1); // 1 ~ H
    
    int cnt = 0;
    int target = sum[1];
    for(int i = 1; i <= H; i++){
        if(sum[i] == target){
            cnt++;
        }
    }

    
    cout << target << " " << cnt <<'\n';
    
    return 0;
}

 

๋Œ“๊ธ€