๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๋ฐฑ์ค€/Gold

[BOJ] 20056 : ๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด์™€ ํŒŒ์ด์–ด๋ณผ

by Jaeguk 2022. 5. 24.
๋ฌธ์ œ ๋งํฌ

20056๋ฒˆ: ๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด์™€ ํŒŒ์ด์–ด๋ณผ (acmicpc.net)

 

20056๋ฒˆ: ๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด์™€ ํŒŒ์ด์–ด๋ณผ

์ฒซ์งธ ์ค„์— N, M, K๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ M๊ฐœ์˜ ์ค„์— ํŒŒ์ด์–ด๋ณผ์˜ ์ •๋ณด๊ฐ€ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ฃผ์–ด์ง„๋‹ค. ํŒŒ์ด์–ด๋ณผ์˜ ์ •๋ณด๋Š” ๋‹ค์„ฏ ์ •์ˆ˜ ri, ci, mi, si, di๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ํŒŒ์ด์–ด๋ณผ์˜ ์œ„์น˜

www.acmicpc.net

๋งˆ๋ฒ•์‚ฌ๊ฐ€ ๋œ ์ƒ์–ด๊ฐ€ ํŒŒ์ด์–ด๋ณผ์— ๋‚ด๋ฆฐ ๋ช…๋ น์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฌธ์ œ.

์ด์ „์— ํ’€์—ˆ๋˜ ์•„๊ธฐ์ƒ์–ด ๋ฌธ์ œ์˜ ์—ฐ๊ด€ ๋ฌธ์ œ์ธ ๊ฒƒ๊ฐ™๋‹ค.

ํ’€์ด

ํŒŒ์ด์–ด๋ณผ์€ ํฌ๊ธฐ๊ฐ€ N x N์ธ ๊ฒฉ์ž์—์„œ ์›€์ง์ด๋ฉฐ 1๋ฒˆ ํ–‰๊ณผ ์—ด์€ ๊ฐ๊ฐ N๋ฒˆ ํ–‰๊ณผ ์—ด๊ณผ ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋‹ค. ์ฆ‰ ํŒŒ์ด์–ด๋ณผ์ด ๊ฒฉ์ž ๋ฐ–์œผ๋กœ ๋‚˜๊ฐ€๋Š” ์ผ์€ ์—†๋‹ค.

๋ชจ๋“  ํŒŒ์ด์–ด๋ณผ์€ ๋ช…๋ น 1๋ฒˆ๋‹น 1ํšŒ์”ฉ ์ด๋™ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋™ ํ›„ ํ•œ ์นธ์— ์—ฌ๋Ÿฌ๊ฐœ์˜ ํŒŒ์ด์–ด๋ณผ์ด ์žˆ์œผ๋ฉด ํ•ฉ์ณ์กŒ๋‹ค๊ฐ€ 4๊ฐœ์˜ ํŒŒ์ด์–ด๋ณผ๋กœ ๋ถ„ํ• ๋œ๋‹ค.

๋‚ด๊ฐ€ ์ €์žฅํ•ด์•ผํ•  ์ •๋ณด๋Š”

โ‘ . ํŒŒ์ด์–ด๋ณผ๋“ค์— ๋Œ€ํ•œ ์ •๋ณด

โ‘ก. ๊ฐ ์นธ์— ์–ด๋Š ํŒŒ์ด์–ด๋ณผ์ด ๋“ค์–ด์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ •๋ณด

=> ๊ฐ ์นธ์— ๋“ค์–ด์žˆ๋Š” ํŒŒ์ด์–ด๋ณผ์˜ ์ธ๋ฑ์Šค๋ฅผ ์ €์žฅํ•ด๋‘์—ˆ๋‹ค.

๋งŒ์•ฝ ์ž„์˜์˜ ์นธ์— ๋“ค์–ด์žˆ๋Š” ํŒŒ์ด์–ด๋ณผ์ด 2๊ฐœ์ด์ƒ์ด๋ฉด ์ด ์นธ์— ์žˆ๋Š” ํŒŒ์ด์–ด๋ณผ์€ ๋ถ„ํ• ๋˜์–ด์•ผํ•œ๋‹ค.

โ‘ . ํŒŒ์ด์–ด๋ณผ๋“ค์— ๋Œ€ํ•œ ์ •๋ณด๋Š” ๋‚˜๋Š” vector<pair<pair<int, int>, pair<int, pair<int, int>>>> Fireball; ์ด๋ ‡๊ฒŒ

โ‘ก. ๊ฐ ์นธ์— ๋“ค์–ด์žˆ๋Š” ํŒŒ์ด์–ด๋ณผ์— ๋Œ€ํ•œ ์ •๋ณด๋Š” 

vector<int> Map[MAX_N][MAX_N] ์ด๋ ‡๊ฒŒ Map์ด๋ผ๋Š” ๋ฒกํ„ฐ 2์ฐจ์›๋ฐฐ์—ด์„ ์„ ์–ธํ•ด์„œ ์ •๋ณด๋ฅผ ์ €์žฅํ–ˆ๋‹ค.

 

 1. ๋ชจ๋“  ํŒŒ์ด์–ด๋ณผ์ด ์ž์‹ ์˜ ๋ฐฉํ–ฅ di๋กœ ์†๋ ฅ si์นธ ๋งŒํผ ์ด๋™ํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ Si๊ฐ€ ๊ฒฉ์ž์˜ ํฌ๊ธฐ์ธ N๋ณด๋‹ค ํฌ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. ๋งŒ์•ฝ ํฌ๊ธฐ๊ฐ€ 6์ธ ๊ฒฉ์ž์—์„œ x์ถ•๋ฐฉํ–ฅ์œผ๋กœ 6๋งŒํผ ์ด๋™ํ•˜๋ฉด ์ œ์ž๋ฆฌ๋กœ ๋Œ์•„์˜ค๊ฒŒ ๋œ๋‹ค. ์ œ์ž๋ฆฌ๋กœ ๋Œ์•„์˜ค๋Š” ๋งŒํผ์˜ ์ด๋™์€ ๊ตณ์ด ๊ตฌํ˜„ํ•ด์ค„ ํ•„์š”๊ฐ€ ์—†๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— Si % N๋งŒํผ ์ด๋™ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์—ฌ๊ธฐ์„œ ํŒŒ์ด์–ด๋ณผ์„ ์ด๋™์‹œ์ผฐ์„ ๋•Œ ํ–‰์ด๋‚˜ ์—ด์ด 1๋ณด๋‹ค ์ž‘์•„์ง€๊ฑฐ๋‚˜ N๋ณด๋‹ค ์ปค์ง€๋Š” ๊ฒฝ์šฐ๋ฅผ ์ž˜ ์ƒ๊ฐํ•ด์„œ ํŒŒ์ด์–ด๋ณผ๋“ค์„ ์ด๋™์‹œ์ผœ ์ค€๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด๋™ ํ›„์˜ ์œ„์น˜๋ฅผ ( r , c ) ๋ผ๊ณ  ํ•œ๋‹ค๋ฉด Map[r][c] ์— ์ด๋™์‹œํ‚จ ํŒŒ์ด์–ด๋ณผ์˜ ์ธ๋ฑ์Šค๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.

 

2. ์ด๋™์ด ๋ชจ๋‘ ๋๋‚œ ๋’ค, 2๊ฐœ ์ด์ƒ์˜ ํŒŒ์ด์–ด๋ณผ์ด ์žˆ๋Š” ์นธ์—์„œ๋Š” ๋ถ„ํ• ์ด ์ผ์–ด๋‚œ๋‹ค.

๋ถ„ํ•  ํ›„ โ‘ . ํŒŒ์ด์–ด๋ณผ๋“ค์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋ณ€๊ฒฝ๋  ๊ฒƒ์ด๋‹ค. ๊ธฐ์กด์˜ ํŒŒ์ด์–ด๋ณผ์€ ์—†์–ด์ง€๊ณ  ์ƒˆ๋กœ์šด ํŒŒ์ด์–ด๋ณผ๋งŒ ๋‚จ์•„์žˆ์–ด์•ผํ•œ๋‹ค.๊ทธ๋ž˜์„œ ๋‚˜๋Š” temp๋ผ๋Š” ๋ฒกํ„ฐ์— ๋ถ„ํ•  ํ›„์— ์žˆ์–ด์•ผ ํ•˜๋Š” ํŒŒ์ด์–ด๋ณผ๋“ค์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•ด๋‘์—ˆ๋‹ค.

Map๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋ฅผ ๋Œ๋ฉด์„œ ํ•ด๋‹น ์นธ์˜ ๋ฒกํ„ฐ ํฌ๊ธฐ๊ฐ€ 0์ด๋ฉด ์ฆ‰ ํŒŒ์ด์–ด๋ณผ์ด 0๊ฐœ ์žˆ์œผ๋ฉด ์Šคํ‚ต.

ํ•ด๋‹น ์นธ ๋ฒกํ„ฐ ํฌ๊ธฐ๊ฐ€ 1์ด๋ฉด ํŒŒ์ด์–ด๋ณผ์ด 1๊ฐœ ์žˆ๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ ๋ถ„ํ• ํ•  ํ•„์š” X. ๊ทธ๋ฆฌ๊ณ  ๋ถ„ํ•  ํ›„์—๋„ ๊ทธ๋Œ€๋กœ ๋‚จ์•„์žˆ์–ด์•ผํ•จ

=> temp ๋ฐฐ์—ด์— ํ•ด๋‹น ํŒŒ์ด์–ด๋ณผ ์ •๋ณด ์ €์žฅ

ํ•ด๋‹น ์นธ์˜ ๋ฒกํ„ฐ ํฌ๊ธฐ๊ฐ€ 2์ด์ƒ์ด๋ฉด ํŒŒ์ด์–ด๋ณผ๋“ค์„ ํ•ฉ์นœ ํ›„ ๋ถ„ํ• ์‹œ์ผœ์•ผํ•œ๋‹ค.

์ƒˆ๋กœ ๋งŒ๋“ค์–ด์งˆ 4๊ฐœ์˜ ํŒŒ์ด์–ด๋ณผ๋“ค์— ๋Œ€ํ•œ ์ •๋ณด๋งŒ temp์— ์ €์žฅํ•ด์ค€๋‹ค.

=> ๊ธฐ์กด์˜ ํŒŒ์ด์–ด๋ณผ์€ ์‚ฌ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ.

์ด๋ ‡๊ฒŒ ํ•ด์„œ ๋งˆ์ง€๋ง‰์— Fireball = temp ๋ฅผ ํ†ตํ•ด ํŒŒ์ด์–ด๋ณผ๋“ค์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ณ€๊ฒฝ์‹œํ‚จ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <string.h>
#include <string>
#include <stack>
#include <vector>
#include <math.h>
#include <queue>
#include <climits>
#include <deque>
#include <algorithm>
#include <iomanip>
#include <map>
#define mod 998244353
using namespace std;
typedef long long ll;
typedef priority_queue<pair<intint>vector<pair<intint>>, greater<pair<intint>>> Priority_queue;
const int INF = INT_MAX;
const int MAX_N = 50 + 5;
int N, M, K;
int dx[] = { 0,1,1,1,0,-1,-1,-1 };
int dy[] = { -1,-1,0,1,1,1,0,-1 };
vector<pair<pair<intint>pair<intpair<intint>>>> Fireball;
vector<pair<pair<intint>pair<intpair<intint>>>> temp;
vector<int> Map[MAX_N][MAX_N];
 
void move_and_seperate();
 
int main(void) {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> N >> M >> K;
    for (int i = 0; i < M; i++) {
        int r, c, m, d, s;
        cin >> r >> c >> m >> s >> d;
        Fireball.push_back({ {r,c},{m,{d,s}} });
    }
    while (K--) {
        move_and_seperate();
    }
    int ans = 0;
    for (int i = 0; i < Fireball.size(); i++) {
        ans += Fireball[i].second.first;
    }
    cout << ans << "\n";
    return 0;
}
 
void move_and_seperate() {
    //Move
    for (int i = 0; i < Fireball.size(); i++) {
        pair<intint> now = Fireball[i].first;
        int mass = Fireball[i].second.first;
        int direct = Fireball[i].second.second.first;
        int speed = Fireball[i].second.second.second;
        int move = speed % N;
        pair<intint> next = { now.first + dy[direct] * move, now.second + dx[direct] * move };
        if (next.first < 1) {
            next.first %= N;
            next.first += N;
        }
        else if (next.first > N)
            next.first %= N;
 
        if (next.second < 1) {
            next.second %= N;
            next.second += N;
        }
        else if (next.second > N)
            next.second %= N;
 
        Fireball[i].first = next;
        Map[next.first][next.second].push_back(i);
    }
    //Seperate
    temp.clear();
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= N; j++) {
            if (Map[i][j].empty())
                continue;
            else if (Map[i][j].size() == 1) {
                temp.push_back(Fireball[Map[i][j][0]]);
                Map[i][j].clear();
                continue;
            }
            int Mass_total = 0;
            int Speed_total = 0;
            int odd = 0;
            for (int k = 0; k < Map[i][j].size(); k++) {
                Mass_total += Fireball[Map[i][j][k]].second.first;
                Speed_total += Fireball[Map[i][j][k]].second.second.second;
                if (Fireball[Map[i][j][k]].second.second.first % 2)
                    odd++;
            }
            Mass_total = (int)floor((double)Mass_total / 5);
            if (Mass_total == 0) {
                Map[i][j].clear();
                continue;
            }
            Speed_total = (int)floor((double)Speed_total / Map[i][j].size());
            int Direction[] = { 0,2,4,6 };
            if (odd != 0 && odd != Map[i][j].size())
                for (int i = 0; i < 4; i++)
                    Direction[i] ++;
            for (int k = 0; k < 4; k++)
                temp.push_back({ {i,j},{Mass_total,{Direction[k], Speed_total}} });
            Map[i][j].clear();
        }
    }
    Fireball = temp;
}
cs

ํ•˜๊ณ  ๋‚˜๋‹ˆ๊นŒ ์‚ฌ์‹ค ๋ณ„๊ฑฐ ์•„๋‹Œ๊ฑฐ๊ฐ™์€๋ฐ, ๋‚ด ๊ธฐ์ค€์œผ๋กœ ๊ตฌํ˜„์ด ์กฐ๊ธˆ ๊นŒ๋‹ค๋กญ๊ณ  ์˜ค๋ž˜๊ฑธ๋ ธ๋‹ค.

728x90