AtCoder Beginner Contest 292 に参加しました&反省会
AtCoder Beginner Contest 292 の振り返り
- A、B問題を解くことができた
- A問題:
transform
関数を使ったが、エラーの解消に時間がかかった - B問題:イエローカード、レッドカードを提示された選手を管理するsetを用意しイベントを実装する
- C問題:愚直に問題文に沿って実装するとTLEとなった。計算量を減らす方法がわからず。
- D問題:グラフ問題。連結と頂点・辺を結び付けられなかった
A問題
方針
- 大文字化する方法を検索したところ
transform
関数を見つけた - サンプルに沿って引数を設定した
実装
#include<bits/stdc++.h> #include <algorithm> //using namespace std; int main () { std::string s; std::cin >> s; std::transform (s.begin(), s.end(), s.begin(), toupper); std::cout << s << std::endl; return 0; }
当初、using namespace std;
を利用してstd::
を省いて実装したが、エラーとなった。
エラーの原因は、以下の記事のコメント*1によると型推論できなかったためのようだ。using namespace std;
によってstd
名前空間内のstd::toupper
がtoupper
と認識されている。
C headerのtoupper
は通常の関数に対し、C++ headerのstd::toupper
関数は関数テンプレートだ。関数テンプレートは型を明示的に指定しないと型推論できない。
using namespace std;
と併用するならtransform (s.begin(), s.end(), s.begin(), ::toupper);
と記述する必要がある。
using namespace std;
を使わないことを推奨する理由に名前空間での衝突が挙げられていたが、それを痛感した。
参考
解説*2から
toupper()
関数を使う
実装例
#include <bits/stdc++.h> using namespace std; int main() { string S; cin>>S; string T = ""; for(int i=0;i<S.size();i++)T += toupper(S[i]); cout<<T<<endl; return 0; }
B問題
方針
- イエローカード、レッドカードを提示された選手を管理する
set
を用意する set
のinsert()
とcount()
を利用する
実装
#include<bits/stdc++.h> using namespace std; int main () { int n, q; cin >> n >> q; set<int> yellow; set<int> red; for (int i = 0; i < q; i++) { int e, x; cin >> e >> x; if (e == 1) { if (yellow.count(x)) { red.insert(x); } else { yellow.insert(x); } } else if (e == 2) { red.insert(x); } else { if (red.count(x)) cout << "Yes" << endl; else cout << "No" << endl; } } return 0; }
C問題
方針
- で全探索するとであり、実行時間制限に引っかかる
- とし、 を満たすの個数、 を満たすの個数を求める
解説*3から
- の値をと仮定すると、の値はと定まる。の値を仮定するとの値が、の値を仮定するとの値が定まる
- の値を全探索するとになるが、 を満たすの個数、 を満たすの個数は独立に求められるため、となる
- と仮定すると、を満たす はを満たすため、( も同様に調べることで)で答えを求められる
実装例
#include <bits/stdc++.h> using namespace std; int main() { int N; cin>>N; long long ans = 0; for(int i=1;i<N;i++){ int X = i,Y = N-i; long long x = 0,y = 0; for(int j=1;j*j<=X;j++){ if(X%j==0){ x++; if(X!=j*j)x++; } } for(int j=1;j*j<=Y;j++){ if(Y%j==0){ y++; if(Y!=j*j)y++; } } ans += x * y; } cout<<ans<<endl; return 0; }