回答編集履歴

2

記述修正

2020/05/15 16:41

投稿

dodox86
dodox86

スコア9183

test CHANGED
@@ -28,7 +28,7 @@
28
28
 
29
29
 
30
30
 
31
- ```Python
31
+ ```Python3
32
32
 
33
33
  import random
34
34
 

1

検証結果を追記

2020/05/15 16:41

投稿

dodox86
dodox86

スコア9183

test CHANGED
@@ -11,3 +11,135 @@
11
11
  [競プロの回答がTLEとなる - teratail#205829](https://teratail.com/questions/205829)
12
12
 
13
13
  [AtcoderでTLEとなる原因について【ABC問題】 - teratail#212668](https://teratail.com/questions/212668)
14
+
15
+
16
+
17
+ ---
18
+
19
+ ** 追記しました:2020-05-16 01:40 **
20
+
21
+
22
+
23
+ 私自身の回答が気になったので検証してみました。質問者さんのオリジナルのコードをもとに、`index`メソッドを使わない方法で試してみます。
24
+
25
+
26
+
27
+ まず、AtCoderの各コンテストのテストケースが収められている[AtCoder のテストケース](https://atcoder.jp/posts/20)をあたってみると、残念ながらABC041のテストケースは無いようでした。その為、テストケースを作成するコードを作りました。簡単にするために、身長は出席番号の取り得る値と同じ(10の5乗)としています。
28
+
29
+
30
+
31
+ ```Python
32
+
33
+ import random
34
+
35
+
36
+
37
+ n = pow(10, 5)
38
+
39
+ l = [str(v) for v in range(1, n + 1)]
40
+
41
+
42
+
43
+ print(n)
44
+
45
+ random.shuffle(l)
46
+
47
+ print(' '.join(l))
48
+
49
+ ```
50
+
51
+
52
+
53
+ このプログラムを実行すると、以下のように生徒100000人分の身長ダミーデータを出力します。
54
+
55
+ ```PlainText
56
+
57
+ 100000
58
+
59
+ 80228 51819 9780 60213 55267 31769 29648 4721...(100000件のデータ)
60
+
61
+ ```
62
+
63
+
64
+
65
+ このデータ(ファイル in1.txt)をもとに、まず質問者さんオリジナルのコードで実行し、実行時間を`time`コマンドで計測してみます。尚、実行環境としてはWindows10/WSL(Ubuntu) 、CPUはIntel Core i7-4870HQ 2.5GHz です。
66
+
67
+
68
+
69
+ ```sh
70
+
71
+ $ time python3 x1.py < in1.txt > out1.txt
72
+
73
+
74
+
75
+ real 0m59.463s
76
+
77
+ user 0m59.422s
78
+
79
+ sys 0m0.031s
80
+
81
+ ```
82
+
83
+ およそ59.5秒かかります。AtCoderでは完全にTLEです。
84
+
85
+
86
+
87
+ このコードをもとに`index`メソッドを使用せず、身長をキーとして、出席番号(-1)を値とした辞書(hash)で検索するよう実装してみます。
88
+
89
+ ```Python3
90
+
91
+ n = int(input())
92
+
93
+ a = list(map(int,input().split()))
94
+
95
+ A = list(reversed(sorted(a)))
96
+
97
+
98
+
99
+ kv = {}
100
+
101
+ for i in range(n):
102
+
103
+ kv[a[i]] = i
104
+
105
+
106
+
107
+ for i in range(n):
108
+
109
+ print(kv[A[i]] + 1)
110
+
111
+ ```
112
+
113
+
114
+
115
+ これを同じデータでテストします。
116
+
117
+ ```sh
118
+
119
+ $ time python3 x1b.py < in1.txt > out1b.txt
120
+
121
+ real 0m0.208s
122
+
123
+ user 0m0.141s
124
+
125
+ sys 0m0.031s
126
+
127
+ ```
128
+
129
+ 実行時間が0.2秒強、となりました。AtCoderのサイトで実際に提出した訳ではありませんが、これであればACできそうです。それぞれ、出力結果も同じです。
130
+
131
+ ```sh
132
+
133
+ $ ls -l out1.txt out1b.txt
134
+
135
+ -rwxrwxrwx 1 user01 user01 588895 May 16 01:17 out1.txt
136
+
137
+ -rwxrwxrwx 1 user01 user01 588895 May 16 01:23 out1b.txt
138
+
139
+ $ diff out1.txt out1b.txt
140
+
141
+ $
142
+
143
+ ```
144
+
145
+ 参考になれば幸いです。