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

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

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

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

859閲覧

競技プログラミングABC199C問題にて起きるTLEとなる原因について

ramu13

総合スコア1

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/05/01 04:11

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

Atcoder Beginer Contest 199 C問題 : https://atcoder.jp/contests/abc199/tasks/abc199_c
において以下のコードを書いて提出したのですが、TLEとなる理由についてわかりません。
ご教授ください。

エラーメッセージ: AC × 12, TLE × 10

該当のソースコード

#include<bits/stdc++.h> using namespace std; using ll = long long; using P = pair<int, int>; template<class T> inline bool chmax(T &a, T b) {if(a < b){a = b; return true;} return false;} template<class T> inline bool chmin(T &a, T b) {if(a > b){a = b; return true;} return false;} #define rep(i,n) for(int i = 0; i < (n); ++i) const int INF = 2e9; int main(){ int N; cin >> N; string S; cin >> S; int Q; cin >> Q; int theFirst = 0; vector<string> s(2); rep(i,2){ s[i] = ""; for(int j = i*N; j < (i+1)*N; ++j){ s[i] = s[i] + S[j]; } } rep(q, Q){ int T, A, B; cin >> T >> A >> B; --A; --B; if(T == 1){ if(A < N && B < N){ char temp = s[theFirst][A]; s[theFirst][A] = s[theFirst][B]; s[theFirst][B] = temp; } else if(A < N && N <= B){ char temp = s[theFirst][A]; s[theFirst][A] = s[(theFirst + 1) % 2][B-N]; s[(theFirst + 1) % 2][B-N] = temp; } else{ char temp = s[(theFirst + 1) % 2][A-N]; s[(theFirst + 1) % 2][A-N] = s[(theFirst + 1) % 2][B-N]; s[(theFirst + 1) % 2][B-N] = temp; } } else{ theFirst = (theFirst + 1) % 2; } } cout << s[theFirst] + s[(theFirst + 1) % 2] << endl; return 0; }

コードの説明

文字列 S を前半と後半に分けて配列 s にしまっています。 前半を theFirst で、後半を (theFirst + 1) % 2 で指しています。

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

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

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

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

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

guest

回答2

0

ベストアンサー

文字列 S を前半と後半に分けるときに、1文字ずつ足していってるのが悪いのではないでしょうか。
substrあたりを使ったらどうでしょうか。

投稿2021/05/01 04:39

actorbug

総合スコア2431

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

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

ramu13

2021/05/01 05:59

そもそもクエリ前でTLEでしたか笑 盲点でした ありがとうございます。
guest

0

解決済みになっていますが、どのようにして解決したのでしょうか?

C++ の参考演算子 a ? b : c は、b と c が左辺値の時、結果も左辺値になるので
swap が使えて次のようなコードが書けます。

C++

1#include <iostream> 2#include <string> 3#include <algorithm> // swap 4using namespace std; 5 6int main() 7{ 8 int n, q; 9 cin >> n; 10 char *s = new char[n * 2 + 1], *s1 = s, *s2 = s + n; 11 cin >> s >> q; 12 while (--q >= 0) { 13 int t, a, b; 14 cin >> t >> a >> b; 15 if (t == 1) 16 swap(--a < n ? s1[a] : s2[a-n], --b < n ? s1[b] : s2[b-n]); 17 else 18 swap(s1, s2); 19 } 20 cout << string(s1, n) << string(s2, n) << endl; 21 delete[] s; 22}

投稿2021/05/01 06:32

kazuma-s

総合スコア8224

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問