質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

4135閲覧

Python 競技プログラミング タイムオーバーになる原因がわからない

akidon0000

総合スコア8

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2020/01/21 07:46

編集2020/01/21 11:49

発生している問題・エラーメッセージ

paizaの問題ですが大規模データでタイムオーバーとなります。
どこが原因か教えていただきたいです。
paizaの規約により問題文はお見せすることはできません。
よろしくお願いします。

またimport sysを使ったのですが、基本データでは使わない時よりも処理速度が0.01secほど遅くなっていました。 何故ですか?
ソース:Pythonの知っておくと良い細かい処理速度の違い8個

該当のソースコード

python

1#import sys 2#input = sys.stdin.readline 3""" 4入力例 510 3 62 6 76 8 83 4 9 10出力例 115 12""" 13#xは使わなくても解けたので使いませんでした 14x,y = map(int,input().split()) 15li = [] 16 17for i in range(y): 18 a,b = map(int,input().split()) 19 liSec = [i for i in range(a,b+1)] 20 liThi = list(set(li)-set(liSec)) 21 if len(liThi) == abs(len(li)-len(liSec)): 22 li = liThi 23 else: 24 li = list(set(li + liSec)) 25print(len(li))

##追記
問題文をアレンジしてみました。
本当の問題文とは大きく異なりますが、よろしくお願いします。
###問題
L個の"0"が入った配列Aがあります。 A = ["0","0","0","0",,,,,,]
a_i番目からb_i番目を指定すると、そのインデックスにある"0"は"1"へと変化します。
A[a_i]からA[b_i]が全て"1"の場合は、全て"0"へとなります。
またA[a_i]からA[b_i]が全て"1"の場合でない場合は"0"からは"1"、"1"はそのままとなる.

N回操作を行った時,配列Aに入ってる"1"の個数を求めよ

####入力例
L N
a_1 b_1
a_2 b_2
...
a_N b_N

制約
1 ≦ L ≦ 1,000,000,000 , 0 ≦ N ≦ 100,000
1 ≦ a_i ≦ b_i ≦ L (1 ≦ i ≦ N)

####例
10 3
2 6
6 8
3 4
の時

A = ["0","0","0","0","0","0","0","0","0","0"]

2番目から6番目の時
A = ["0","1","1","1","1","1","0","0","0","0"]
6から8の時
A = ["0","1","1","1","1","1","1","1","0","0"]
3から4の時
A = ["0","1","1","0","0","1","1","1","0","0"]
よって"1"の個数は5である。

###私の考え
Lの数が膨大になるため配列内にN個の"0"を生成するやり方ではなく、
新しい配列「li」 にインデックス番号を追加し、説明するのは難しいが
配列「li」にある要素全ては問題でいう”1”の時のインデックス番号が入っているため、
最後に配列「li」の要素数を出力すればいいという考え方です
10 3
2 6
6 8
3 4
の時

li = []

2番目から6番目の時
li = ["2","3","4","5","6"]
6から8の時
li = ["2","3","4","5","6","7","8"]
3から4の時
li = ["2","5","6","7","8"]
よって"1"の個数は5である。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

なんでlistが出てくるのか分からない

あと、ナイーブなやり方では絶対にタイムオーバーになる問題の可能性

投稿2020/01/21 08:39

編集2020/01/21 08:54
quickquip

総合スコア11038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

akidon0000

2020/01/21 11:52

返信ありがとうございます。アレンジした問題文を追加しました。ご教授お願いします。 またナイーブでないやり方とは、かなり頭を捻ったやり方という意味でしょうか?
quickquip

2020/01/21 12:01

後者はyes。数学的、アルゴリズム的、もしくはデータ構造的な「解」がある問題の可能性があります。 前者は拒否します。paizaの問題なら回答に書いた以上の情報はなく(回答する気もありませんが)、アレンジされた問題なら上記の理由から回答する意味はありません。
guest

0

ベストアンサー

そもそも問題がわからないと、提示のコードが合ってるかどうかもわからないわけで、
回答不能かと思われます

投稿2020/01/21 08:06

y_waiwai

総合スコア87749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

akidon0000

2020/01/21 08:13

返信ありがとうございます。そうですか。。。 Paizaの規約にかからないようにしつつ、この問題を解決することはなかなか困難ですね。。 ありがとうございました。
y_waiwai

2020/01/21 08:15

まあ、エスパーな人の登場を待つというのも一つの手でしょうけど。。 模範解答などがわかるなら、どこがどうと検討はできるとは思いますが
退会済みユーザー

退会済みユーザー

2020/01/21 09:37 編集

まぁ基本エスパーじゃないと厳密な回答はできないのは間違いないですね… あえて言うなら再帰やwhileを使っている訳ではないので永久ループではない →単純にループの中の処理が重たいんじゃないですかね? あとxを使わないで解けるような問題を本当に出題するのかという謎も残りますが...
akidon0000

2020/01/21 11:55

返信ありがとうございます。かなりアレンジした問題文を追加しました。ご教授お願いします。
退会済みユーザー

退会済みユーザー

2020/01/21 12:08

liSec = [i for i in range(a,b+1)] これのサイズを考えたら条件次第で平気でとてつもないことになる
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問