imomoの勉強記録

主に勉強の記録などを残していきます

ABC177に参加しました

AtCoderのコンテストに参加した際の結果と考え方、反省点などを書いていきます。
コンテストページはこちら

解いた/挑んだ問題

A問題

問題の概要

Dメートル先にある公園に向かって分速Sメートルで走ったとき、T分後にはついているかどうか

制約
  • 1 \leq D \leq 10000
  • 1 \leq T \leq 10000
  • 1 \leq S \leq 10000
  • 入力はすべて整数
どのように考えたか

S*T とDを比較してS*TがD以上かどうか

結果

一発AC
・提出ししたコード

#include"bits/stdc++.h"

#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define REP(i, n) for (int i = 1; i <= (int)(n); i++)
#define all(v) v.begin(), v.end()
#define rall(v) v.rbegin(), v.rend()
using namespace std;
using ll = long long;
using pi = pair<int, int>;
const ll INF = 1LL << 60;

int main() {
	int d, t, s;
	cin >> d >>  t >> s;
	bool ans = false;
	if ((t * s) >= d)ans = true;
	if (ans) {
		cout << "Yes" << endl;
	}
	else {
		cout << "No" << endl;
	}
	return 0;
}

比較的簡単な問題だった

ACまでの時間

ACしたのはコンテスト開始から1.5分後です。

f:id:iiiimmmmo:20200829232556p:plain
ABC177_A

B問題

問題の概要

文字列S,Tが与えられる
文字列Tが文字列Sの部分文字列になるためにTを最小限いくつ書き換える必要があるか

制約
  • S,Tは1文字以上1000文字以下
  • Tの長さはSの長さ以下
  • S,Tは英小文字のみ含む
どのように考えたか

SとTの文字数の差の数繰り返しを行い
Tの文字分Sから抜き出し、一文字ずつ比較し文字が違うときにカウント
変数ansにカウントとのminをとり結果を出力

結果

一発AC
提出したコード

#include"bits/stdc++.h"

#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define REP(i, n) for (int i = 1; i <= (int)(n); i++)
#define all(v) v.begin(), v.end()
#define rall(v) v.rbegin(), v.rend()
using namespace std;
using ll = long long;
using pi = pair<int, int>;
const ll INF = 1LL << 60;

int main() {
	string s, ss,t;
	int cnt = 0;
	int ans = 1000000;
	cin >> s >> ss;
	rep(i, s.size() - ss.size() + 1) {
		t = s.substr(i, ss.size());
		cnt = 0;
		rep(j, ss.size()) {
			if (ss[j] != t[j])cnt++;
		}
		ans = min(ans, cnt);
	}
	cout << ans << endl;
	return 0;
}

少しバグりそうで怖かった

ACまでの時間

ACしたのはコンテスト開始から8分後。

f:id:iiiimmmmo:20200829232724p:plain
ABC177_B

C問題

問題の概要

N個の整数A_1,...,A_Nが与えられる
1 \leq i < j \leq Nを満たす全ての組(i,j)についてのA_i × A_jの和をmod(10^9 + 7)で求めよ

制約
  • 2 \leq N \leq 2×10^5
  • 0 \leq A_i \leq 10^9
  • 入力はすべて整数
どのように考えたか

愚直に二重ループを行うとTLEしてしまうので(1回目)、同類項を纏めるために累積和を使いO(N)で求める

結果

二回目でAC
・提出したコード

#include"bits/stdc++.h"

#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define REP(i, n) for (int i = 1; i <= (int)(n); i++)
#define all(v) v.begin(), v.end()
#define rall(v) v.rbegin(), v.rend()
using namespace std;
using ll = long long;
using pi = pair<int, int>;
const ll INF = 1LL << 60;

int main() {
	int n;
	ll mod = 1e9 + 7;
	cin >> n;
	vector<ll>As(n+1,0),A(n);
	ll a;
	rep(i, n) {
		cin >> a;
		A[i] = a;
		As[i + 1] = As[i] + a;
	}
	ll ans = 0;
	rep(i, n - 1) {
		ans += (A[i] * ((As[n] - As[i+1]) % mod));
		ans %= mod;
	}
	cout << ans << endl;
	return 0;
}

分配法則でO(N)にできることに気づくまでに時間がかかってしまった

ACまでの時間

コンテスト開始から66分後です

f:id:iiiimmmmo:20200829232742p:plain
ABC177_C

D問題

問題の概要

N人の人がいて、人Aと人Bが友達であり人Bと人Cが友達の時、AとCも友達であるとする
M個の二人が友達という情報が与えられる
このN人を同じグループ内に友達がいないようにグループ分けを行うとき、最小で何グループになるか

制約
  • 2 \leq N \leq 2 × 10^5
  • 0 \leq M \leq 2 × 10^5
  • 1 \leq A_i,B_i \leq N
  • A_i ≠ B_i

どのように考えたか

一番大きい友達のグループの友達の数が答えであること

結果

コンテスト中にACできませんでした

ACまでの時間

なし

f:id:iiiimmmmo:20200829232811p:plain
ABC177_D

結果

コンテスト結果

ABCの3完でした。
C問題をもっと早く解ければよかったです

f:id:iiiimmmmo:20200829232838p:plain
ABC177

パフォーマンス、レーティング変動

今回のパフォーマンスは575、前回より40近く下がってしまいました。
レーティングはそれに伴い-1の588となりました。

f:id:iiiimmmmo:20200829232918p:plain
コンテスト成績表
f:id:iiiimmmmo:20200829232941p:plain
ABC177を終えた時点でのレーティング

反省点

今回はC問題の解法を見つけるのに非常に時間がかかってしまいかなり時間を無駄にしたと感じた
考察力を鍛え、違う方法で解を求められないか模索する力を高めていきたいです