質問編集履歴
1
質問内容が途中までの内容でアップロードされていたため、更新しました
title
CHANGED
File without changes
|
body
CHANGED
@@ -16,26 +16,93 @@
|
|
16
16
|
```標準入力
|
17
17
|
H W
|
18
18
|
A1,1 A1,2 ・・・ A1,W
|
19
|
-
A2,1 A2,2 ・・・ A2,
|
19
|
+
A2,1 A2,2 ・・・ A2,W
|
20
|
+
:
|
21
|
+
AH,1 AH,2 ・・・ AH,W
|
20
22
|
```
|
21
23
|
|
24
|
+
**出力**
|
25
|
+
```出力
|
26
|
+
B1,1 B1,2 ・・・ B1,W
|
27
|
+
B2,1 B2,2 ・・・ B2,W
|
28
|
+
:
|
29
|
+
BH,1 BH,2 ・・・ BH,W
|
30
|
+
```
|
22
31
|
|
32
|
+
### 自分の回答
|
33
|
+
マス(i,j)ごとにi行の合計とj列の合計を計算すると、計算量はo(HW(H+W))となる。
|
34
|
+
これでは計算量がo(10^9)となり、計算量が膨大となるため、以下の方法で回答を作成した。
|
35
|
+
①前処理として、先にi行の合計及びj列の合計を求め、結果をメモする
|
36
|
+
②マス(i,j)の出力として(i行の合計値)+(j列の合計値)-(マス(i,j)の値)を計算
|
37
|
+
以上の処理を行うことで、計算量としてはo(HW)に抑えられる。
|
23
|
-
|
38
|
+
以上の考えのもと、以下のコードを作成した。
|
39
|
+
```C#
|
40
|
+
using System;
|
41
|
+
using System.Collections.Generic;
|
42
|
+
using System.Linq;
|
24
43
|
|
44
|
+
namespace AtCoder
|
25
|
-
|
45
|
+
{
|
26
|
-
|
46
|
+
class Problem
|
27
|
-
|
47
|
+
{
|
48
|
+
static void Main()
|
49
|
+
{
|
50
|
+
// Step1 入力を受け取る
|
51
|
+
// 整数H,Wを受け取る
|
52
|
+
var input = Console.ReadLine().Split(" ").Select(int.Parse).ToArray();
|
53
|
+
var H = input[0];
|
54
|
+
var W = input[1];
|
28
55
|
|
29
|
-
|
56
|
+
// H行W列の配列を受け取る
|
57
|
+
int[,] nums = new int[H,W];
|
58
|
+
for(int i = 0; i < H; i++)
|
59
|
+
{
|
60
|
+
var gyou = Console.ReadLine().Split().Select(int.Parse).ToArray();
|
61
|
+
for (int j = 0; j < W; j++)
|
62
|
+
{
|
63
|
+
nums[i,j] = gyou[j];
|
64
|
+
}
|
65
|
+
}
|
30
66
|
|
67
|
+
// (前処理)1行ごと1列ごとに合計を求め、メモする
|
68
|
+
// 横方向の合計の計算メモを作成
|
69
|
+
int[] sumArrayH = new int[H];
|
70
|
+
// 縦方向の合計の計算メモを作成
|
71
|
+
int[] sumArrayW = new int[W];
|
72
|
+
|
73
|
+
// 縦方向と横方向の計算結果をメモに入力する
|
74
|
+
for (int i = 0; i < H; i++)
|
75
|
+
{
|
76
|
+
for (int j = 0; j < W; j++)
|
77
|
+
{
|
78
|
+
sumArrayH[i] += nums[i,j];
|
79
|
+
sumArrayW[j] += nums[i,j];
|
80
|
+
}
|
81
|
+
}
|
82
|
+
|
83
|
+
// Step3 マス(i,j)の計算を行い、結果を出力する
|
84
|
+
for (int i = 0; i < H; i++)
|
85
|
+
{
|
31
|
-
|
86
|
+
var sum = 0;
|
32
|
-
|
87
|
+
for (int j = 0; j < W; j++)
|
88
|
+
{
|
89
|
+
sum = sumArrayH[i] + sumArrayW[j] - nums[i,j];
|
90
|
+
Console.Write("{0} ", sum);
|
91
|
+
}
|
92
|
+
Console.WriteLine("");
|
93
|
+
}
|
94
|
+
}
|
95
|
+
}
|
96
|
+
}
|
33
97
|
```
|
34
98
|
|
35
|
-
###
|
99
|
+
### 提出結果
|
36
100
|
|
101
|
+
AC 14
|
37
|
-
|
102
|
+
TLE 2 (hand04.txt、random07.txt)
|
38
103
|
|
39
|
-
### 補足情報(FW/ツールのバージョンなど)
|
40
104
|
|
105
|
+
### 分からない点
|
106
|
+
|
107
|
+
公式の回答も前処理を使っており、TLEとなる原因がわかりません。
|
41
|
-
|
108
|
+
教えていただけると幸いです。
|