๋ง๋ฒ์ฌ ์์ด์ ํ์ด์ด๋ณผ ์ฑ๊ณต
1 ์ด 512 MB 13402 5276 3173 35.720% ๋ฌธ์
์ด๋ฅธ ์์ด๊ฐ ๋ง๋ฒ์ฌ๊ฐ ๋์๊ณ , ํ์ด์ด๋ณผ์ ๋ฐฐ์ ๋ค.
๋ง๋ฒ์ฌ ์์ด๊ฐ ํฌ๊ธฐ๊ฐ N×N์ธ ๊ฒฉ์์ ํ์ด์ด๋ณผ M๊ฐ๋ฅผ ๋ฐ์ฌํ๋ค. ๊ฐ์ฅ ์ฒ์์ ํ์ด์ด๋ณผ์ ๊ฐ์ ์์น์์ ์ด๋์ ๋๊ธฐํ๊ณ ์๋ค. i๋ฒ ํ์ด์ด๋ณผ์ ์์น๋ (ri, ci), ์ง๋์ mi์ด๊ณ , ๋ฐฉํฅ์ di, ์๋ ฅ์ si์ด๋ค. ์์น (r, c)๋ rํ c์ด์ ์๋ฏธํ๋ค.
๊ฒฉ์์ ํ๊ณผ ์ด์ 1๋ฒ๋ถํฐ N๋ฒ๊น์ง ๋ฒํธ๊ฐ ๋งค๊ฒจ์ ธ ์๊ณ , 1๋ฒ ํ์ N๋ฒ๊ณผ ์ฐ๊ฒฐ๋์ด ์๊ณ , 1๋ฒ ์ด์ N๋ฒ ์ด๊ณผ ์ฐ๊ฒฐ๋์ด ์๋ค.
ํ์ด์ด๋ณผ์ ๋ฐฉํฅ์ ์ด๋ค ์นธ๊ณผ ์ธ์ ํ 8๊ฐ์ ์นธ์ ๋ฐฉํฅ์ ์๋ฏธํ๋ฉฐ, ์ ์๋ก๋ ๋ค์๊ณผ ๊ฐ๋ค.
7 0 1 6 2 5 4 3 ๋ง๋ฒ์ฌ ์์ด๊ฐ ๋ชจ๋ ํ์ด์ด๋ณผ์๊ฒ ์ด๋์ ๋ช ๋ นํ๋ฉด ๋ค์์ด ์ผ๋ค์ด ์ผ์ด๋๋ค.
- ๋ชจ๋ ํ์ด์ด๋ณผ์ด ์์ ์ ๋ฐฉํฅ di๋ก ์๋ ฅ si์นธ ๋งํผ ์ด๋ํ๋ค.
- ์ด๋ํ๋ ์ค์๋ ๊ฐ์ ์นธ์ ์ฌ๋ฌ ๊ฐ์ ํ์ด์ด๋ณผ์ด ์์ ์๋ ์๋ค.
- ์ด๋์ด ๋ชจ๋ ๋๋ ๋ค, 2๊ฐ ์ด์์ ํ์ด์ด๋ณผ์ด ์๋ ์นธ์์๋ ๋ค์๊ณผ ๊ฐ์ ์ผ์ด ์ผ์ด๋๋ค.
- ๊ฐ์ ์นธ์ ์๋ ํ์ด์ด๋ณผ์ ๋ชจ๋ ํ๋๋ก ํฉ์ณ์ง๋ค.
- ํ์ด์ด๋ณผ์ 4๊ฐ์ ํ์ด์ด๋ณผ๋ก ๋๋์ด์ง๋ค.
- ๋๋์ด์ง ํ์ด์ด๋ณผ์ ์ง๋, ์๋ ฅ, ๋ฐฉํฅ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ์ง๋์ ⌊(ํฉ์ณ์ง ํ์ด์ด๋ณผ ์ง๋์ ํฉ)/5⌋์ด๋ค.
- ์๋ ฅ์ ⌊(ํฉ์ณ์ง ํ์ด์ด๋ณผ ์๋ ฅ์ ํฉ)/(ํฉ์ณ์ง ํ์ด์ด๋ณผ์ ๊ฐ์)⌋์ด๋ค.
- ํฉ์ณ์ง๋ ํ์ด์ด๋ณผ์ ๋ฐฉํฅ์ด ๋ชจ๋ ํ์์ด๊ฑฐ๋ ๋ชจ๋ ์ง์์ด๋ฉด, ๋ฐฉํฅ์ 0, 2, 4, 6์ด ๋๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด 1, 3, 5, 7์ด ๋๋ค.
- ์ง๋์ด 0์ธ ํ์ด์ด๋ณผ์ ์๋ฉธ๋์ด ์์ด์ง๋ค.
๋ง๋ฒ์ฌ ์์ด๊ฐ ์ด๋์ K๋ฒ ๋ช ๋ นํ ํ, ๋จ์์๋ ํ์ด์ด๋ณผ ์ง๋์ ํฉ์ ๊ตฌํด๋ณด์.
์ ๋ ฅ
์ฒซ์งธ ์ค์ N, M, K๊ฐ ์ฃผ์ด์ง๋ค.
๋์งธ ์ค๋ถํฐ M๊ฐ์ ์ค์ ํ์ด์ด๋ณผ์ ์ ๋ณด๊ฐ ํ ์ค์ ํ๋์ฉ ์ฃผ์ด์ง๋ค. ํ์ด์ด๋ณผ์ ์ ๋ณด๋ ๋ค์ฏ ์ ์ ri, ci, mi, si, di๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
์๋ก ๋ค๋ฅธ ๋ ํ์ด์ด๋ณผ์ ์์น๊ฐ ๊ฐ์ ๊ฒฝ์ฐ๋ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง์ง ์๋๋ค.
์ถ๋ ฅ
๋ง๋ฒ์ฌ ์์ด๊ฐ ์ด๋์ K๋ฒ ๋ช ๋ นํ ํ, ๋จ์์๋ ํ์ด์ด๋ณผ ์ง๋์ ํฉ์ ์ถ๋ ฅํ๋ค.
์ ํ
- 4 ≤ N ≤ 50
- 0 ≤ M ≤ N2
- 1 ≤ K ≤ 1,000
- 1 ≤ ri, ci ≤ N
- 1 ≤ mi ≤ 1,000
- 1 ≤ si ≤ 1,000
- 0 ≤ di ≤ 7
ํ์ด
๋จ์ ๊ตฌํ๋ฌธ์ ์ด๋ฏ๋ก ๋ฌธ์ ์ ๋์จ๋๋ก ๊ตฌํํ๋ฉด ๋๋ค.
ํ์ด์ด๋ณผ์ ์์๊ฐ 5๊ฐ๋ ๋๊ธฐ ๋๋ฌธ์ ๊ตฌ์กฐ์ฒด๋ ํด๋์ค๋ก ๊ตฌํํ๋๊ฒ ์ ํฉํ๋ค๊ณ ์๊ฐํด
struct fb{
int r,c,m,d,s;
};
์ด๋ ๊ฒ ๊ฐ์ฒด๋จ์๋ก ์ฌ์ฉํ ์ ์๋๋ก ๊ตฌ์กฐ์ฒด๋ก ๋ง๋ค์ด์ฃผ์๋ค.
๊ฒฉ์๋ฌด๋ฌ ํ์ ํ์ด์ด๋ณผ์ด ์ฌ๋ฌ๊ฐ ๋ค์ด๊ฐ ์์๋๋ ์ฝ๊ฒ ๋ํ๋ด ์ค ์ ์๊ฒ ํ๊ธฐ ์ํด
์ด์ฐจ์ ๋ฒกํฐ๋ก ๋ง๋ค์ด์ฃผ์๋ค.
vector<fb>v[51][51];
ํ์ด์ด๋ณผ์ด ์์ง์ด๋ ๊ฒฝ์ฐ๋
(ํ์ฌ์ ์ขํ(x๊ฐ, y๊ฐ ๋ฐ๋ก) + ๋ณํ๋ * ์๋) % N ์ ํด์ค ๊ฒฝ์ฐ์์
0์ดํ์ผ ๊ฒฝ์ฐ์๋ง N์ ๋ฐ๋ก ๋ํด์ฃผ๊ณ , 0 ์ด๊ณผ์ผ ๊ฒฝ์ฐ์๋ ๋ฐ๋ก ๊ณ์ฐ์ ํด์ฃผ์ง ์์๋ ๋๋ค.
while(!v[i][j].empty()){
auto move_fb = v[i][j][v[i][j].size()-1];
v[i][j].pop_back();
int nx = (move_fb.r+dx[move_fb.d]*move_fb.s)%N;
int ny = (move_fb.c+dy[move_fb.d]*move_fb.s)%N;
if(nx <= 0) nx += N;
if(ny <= 0) ny += N;
move_fb.r = nx; move_fb.c = ny;
q.push(move_fb);
}
์ ๋ถ ๋ค ์์ง์ธ ๊ฒฝ์ฐ์๋ ์ด์ฐจ์ ๋ฒกํฐ์ ๋ชจ๋ ์ธ์๊ฐ ๋น ์ ธ๋๊ฐ ์ํ์ด๋ค.
์ด๋ ๊ฒ ๊ตฌํํ ์ด์ ๋ ์์ง์ธ ๋ค์ ๋ฐ๋ก ๋ฒกํฐ์ ๋ฃ์ด์ฃผ๋ฉด ํ์ด์ด๋ณผ์ด ์ฌ๋ฌ๋ฒ ์ฐธ์กฐ๊ฐ ๋์ด ํ๋ฒ์ด ์๋ ์ฌ๋ฌ๋ฒ ์์ง์ฌ ์ง ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ ๋ค์์๋ ๋ชจ๋ ์ขํ๋ฅผ ๋์์ผ๋ก, ๋๊ฐ ์ด์์ ํ์ด์ด๋ณผ์ด ์์๋ ๋๋ ์ฃผ๋ฉด ๋๋ค.
์ด ์ฐ์ฐ์ ๋ํ๊ณ , ๋๋๋ ๊ฒ์ด ์ ๋ถ๋ค.
๋ค๋ง ์๋๊ฐ ๋ชจ๋ ํ์๋, ์ง์์ผ ๊ฒฝ์ฐ๋ฅผ ์ฒดํฌํด์ฃผ๋๊ฒ์ ์์ผ๋ฉด ์๋๋ค.
if(v[i][j].size() <=1) continue;
int ms=0,ds1=0, ds2=0,ss=0,count=v[i][j].size();
while(!v[i][j].empty()){
ms += v[i][j][v[i][j].size()-1].m;
if(v[i][j][v[i][j].size()-1].d %2 == 0)
ds1 += 1;
else
ds2 += 1;
ss += v[i][j][v[i][j].size()-1].s;
v[i][j].pop_back();
}
ms /= 5; ss /= count;
if(ms == 0) continue;
for(int k=0; k<4; k++){
fb divide_fb;
divide_fb.r = i;
divide_fb.c = j;
divide_fb.m = ms;
divide_fb.s = ss;
if(ds1==0 || ds2 == 0){
divide_fb.d = 2*k;
}else{
divide_fb.d = 2*k+1;
}
v[i][j].push_back(divide_fb);
}
์ ์ฒด ์ฝ๋
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;
struct fb{
int r,c,m,d,s;
};
int N,M,K,dx[8]={-1,-1,0,1,1,1,0,-1},dy[8]={0,1,1,1,0,-1,-1,-1};
vector<fb>v[51][51];
int main(){
cin>>N>>M>>K;
for(int i=0; i<M; i++){
fb new_fb;
cin>>new_fb.r>>new_fb.c>>new_fb.m>>new_fb.s>>new_fb.d;
v[new_fb.r][new_fb.c].push_back(new_fb);
}
while(K--){
queue<fb>q;
for(int i=1; i<=N; i++)
for(int j=1; j<=N; j++){
if(v[i][j].empty()) continue;
while(!v[i][j].empty()){
auto move_fb = v[i][j][v[i][j].size()-1];
v[i][j].pop_back();
int nx = (move_fb.r+dx[move_fb.d]*move_fb.s)%N;
int ny = (move_fb.c+dy[move_fb.d]*move_fb.s)%N;
if(nx <= 0) nx += N;
if(ny <= 0) ny += N;
move_fb.r = nx; move_fb.c = ny;
q.push(move_fb);
}
}
while(!q.empty()){
v[q.front().r][q.front().c].push_back(q.front());
q.pop();
}
for(int i=1; i<=N; i++)
for(int j=1; j<=N; j++){
if(v[i][j].size() <=1) continue;
int ms=0,ds1=0, ds2=0,ss=0,count=v[i][j].size();
while(!v[i][j].empty()){
ms += v[i][j][v[i][j].size()-1].m;
if(v[i][j][v[i][j].size()-1].d %2 == 0)
ds1 += 1;
else
ds2 += 1;
ss += v[i][j][v[i][j].size()-1].s;
v[i][j].pop_back();
}
ms /= 5; ss /= count;
if(ms == 0) continue;
for(int k=0; k<4; k++){
fb divide_fb;
divide_fb.r = i;
divide_fb.c = j;
divide_fb.m = ms;
divide_fb.s = ss;
if(ds1==0 || ds2 == 0){
divide_fb.d = 2*k;
}else{
divide_fb.d = 2*k+1;
}
v[i][j].push_back(divide_fb);
}
}
}
int ans = 0;
for(int i=1; i<=N; i++)
for(int j=1; j<=N; j++){
if(v[i][j].empty()) continue;
for(auto f : v[i][j]){
ans += f.m;
}
}
cout<<ans;
}