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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

787閲覧

Atcoder ABC 217(今日の問題) のD問題

schoolstudent

総合スコア5

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/09/04 15:02

今日のAtcoderコンテストでD問題がACできませんでした、、。初めてD問題まで来たので悔しいです。条件通りの変数データ保持量になってるんですが、TLEになってしまいます。ですが、TLE以外はACしています。
https://atcoder.jp/contests/abc217/tasks/abc217_d
どなたかわかる方がいたらご教授お願いします。

C言語

1#include<stdio.h> 2int main(void){ 3 long long int q,c[20000000],x[20000000],min=0,min2=0,dai,tiisai,i,j; 4 long long int l; 5 scanf("%lld",&l); 6 scanf("%lld",&q); 7 for(i=1;i<=q;i++){ 8 scanf("%lld",&c[i]); 9 scanf("%lld",&x[i]); 10 } 11 min=l; 12 min2=l; 13 x[0]=l; 14 for(i=1;i<=q;i++){ 15 if(c[i]==2){ 16 for(j=0;j<i;j++){ 17 if(x[i]<x[j]&&min>x[j]-x[i]){ 18 min=x[j]-x[i]; 19 dai=x[j]; 20 } 21 if(x[i]>x[j]&&min2>x[i]-x[j]){ 22 min2=x[i]-x[j]; 23 tiisai=x[j]; 24 } 25 } 26 printf("%lld\n",dai-tiisai); 27 min=l; 28 min2=l; 29 x[i]=0; 30    dai=0; 31     tiisai=0; 32 } 33 34 } 35 return 0; 36}

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

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

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

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

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

actorbug

2021/09/04 15:59

何が知りたいのでしょうか。 TLEになる理由でしょうか。それとも、TLEを修正する方法でしょうか。 TLEになる理由は計算量がO(Q^2)だからですし、TLEを修正する方法は公式解説を見ればわかるでしょう。
schoolstudent

2021/09/04 16:45

知りたいのはTLEを修正する方法ですね、、。公式解説のアドバイスありがとうございます!ですが、公式解説はC++で行われているためよくわからないと言いますか、私の知識不足で申し訳ないです、、。良ければCでの解決方法を教えていただけますか?
jimbe

2021/09/04 18:07 編集

それまでのxを保存し、次のxに最も近い前後の位置を"高速に"取り出せる機能が必要だ、と当たり前のことを言っている解説に思います。 C++なら使えるモノがあるのでこう書けるというだけです。 無ければ「平衡二分探索木やB-Tree」と呼ばれるものがお勧めという感じでしょうか。
actorbug

2021/09/04 23:43

上記リンク先の一番下のソースは、「座標圧縮」と「セグメント木」が理解できれば、読めると思います。
actorbug

2021/09/08 13:33 編集

試しにB-Treeで実装したところ、そこまで大変ではありませんでした(90行)。 「平衡二分探索木やB-Tree」について調べて、実装してみてはいかがでしょうか。 上記リンク先に、私のB-Treeによる作例や、他の方の平衡二分探索木による作例が追加されてるので、必要であれば参照してみてください。
schoolstudent

2021/09/11 22:29

大変、時間が空いてしまい申し訳ありませんでした、、。jimbeさん、actorbugさん回答ありがとうございます。actorbugさん、わざわざコードを書いてくださり、ありがとうございます。まだまだプログラミング能力は未熟だと身に沁みました。平衡二分探索木について全く知らなかったので、コードを確認しながら理解するとともに、身に付けていきたいと思います。 ぜひ、actorbugさんをベストアンサーにしたいのですが、ここに書いてくださったと同様に、URLを添付して回答していただけないでしょうか?お手数おかけします。
guest

回答2

0

ベストアンサー

TLEを修正する方法については、公式解説を参照してください。

また、C言語でACとなった回答については、以下のリンク先で確認することができます。

https://atcoder.jp/contests/abc217/submissions?f.Task=abc217_d&f.LanguageName=C&f.Status=AC&f.User=

上記リンク先に、私のB-Treeによる作例や、他の方の平衡二分探索木による作例が追加されているので、必要であれば参照してみてください。

投稿2021/09/11 23:56

actorbug

総合スコア2431

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

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

0

C で書いてみました。単純なコードなので、時間制限に引っかかるかもしれません。

C

1#include <stdio.h> // scanf, printf 2 3int search(int v[], int n, int x) 4{ 5 int a = 0, b = n - 1; 6 while (a <= b) { 7 int m = (a + b) / 2; 8 if (x < v[m]) b = m - 1; 9 else a = m + 1; 10 } 11 return a; 12} 13 14int main(void) 15{ 16 static int v[200002]; 17 v[0] = 0; 18 int q, c, x, n = 2; 19 scanf("%d%d", &v[1], &q); 20 while (--q >= 0) { 21 scanf("%d%d", &c, &x); 22 int i = search(v, n, x); 23 if (c == 1) { 24 for (int j = n++; j > i; j--) v[j] = v[j-1]; 25 v[i] = x; 26 } 27 else printf("%d\n", v[i] - v[i-1]); 28 } 29} 30

これのどこが分からないのかをコメントしてください。

投稿2021/09/07 12:45

編集2021/09/07 14:03
kazuma-s

総合スコア8224

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問