imomoの勉強記録

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

ABC190に参加しました

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

解いた問題

A問題

問題の概要

高橋君と青木君が交互にアメを食べあうゲームを行います。
高橋君はA個のアメ、青木君はB個のアメを持っていて、
C = 0の時は高橋君が先に、C = 1の時は青木君が先にアメを食べ始めます。
先にアメが無くなるのはどちらでしょうか。

制約
  • 1 \leq A,B \leq 100
  • C0または1のいずれか
  • 入力はすべて整数
どのように考えたか

処理分けが面倒くさいので、高橋君が選考になるようにしたい。
青木君のアメからCを引いてあげると、高橋君が先行の場合何も起きず、後攻の場合のみ1引かれるので青木君が先にアメを食べたことになる。
後は、高橋君が青木君より多くアメを持っていたら高橋君の勝ちで、そうでなければ青木君の勝ちになる。

結果

1発AC
・提出したコード

#include<bits/stdc++.h>
#include<atcoder/all>

#define rep(i, n) for (long long i = 0; i < (long long)(n); i++)
#define REP(i,v,n) for(long long i = v; i <= (long long)(n); i++)
#define rrep(i,n) for(long long i = n;0 <= (long long)(i); i--)
#define RREP(i,n,v) for(long long i = n;v <= (long long)(i); i--)
#define all(v) v.begin(), v.end()
#define rall(v) v.rbegin(), v.rend()
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }
using namespace std;
using namespace atcoder;
using ll = long long;
using pi = pair<int, int>;
ll pows(ll x, ll n) {ll ret = 1;while (n > 0) {if (n & 1) ret *= x;x *= x;n >>= 1;}return ret;}

int main() {
	int a,b,c;
	cin >>a >> b>> c;
	b -= c;
	bool ans = false;
	if(b < a)ans  =true;
	cout << ((ans)?"Takahashi":"Aoki") << endl;
	return 0;
}

A問題にしては難しかったです

ACまでの時間

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

f:id:iiiimmmmo:20210130233155p:plain
ABC189_A

B問題

問題の概要

高橋君はN種類の呪文を使うことができ、i番目の呪文は詠唱がX_i秒、威力がY_i秒かかります。
詠唱がSより小さく、威力がDより大きい呪文は存在しますか?

制約
  • 1 \leq N \leq 100
  • 1 \leq X_i \leq 10^9
  • 1 \leq Y_i \leq 10^9
  • 1 \leq S \leq 10^9
  • 1 \leq D \leq 10^9
  • 入力はすべて整数
どのように考えたか

入力を全て受け取り、一致したものがあるかを全て確認した

結果

1発AC
提出したコード

#include<bits/stdc++.h>
#include<atcoder/all>

#define rep(i, n) for (long long i = 0; i < (long long)(n); i++)
#define REP(i,v,n) for(long long i = v; i <= (long long)(n); i++)
#define rrep(i,n) for(long long i = n;0 <= (long long)(i); i--)
#define RREP(i,n,v) for(long long i = n;v <= (long long)(i); i--)
#define all(v) v.begin(), v.end()
#define rall(v) v.rbegin(), v.rend()
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }
using namespace std;
using namespace atcoder;
using ll = long long;
using pi = pair<int, int>;
ll pows(ll x, ll n) {ll ret = 1;while (n > 0) {if (n & 1) ret *= x;x *= x;n >>= 1;}return ret;}

int main() {
	int n,s,d,x,y;
	cin >> n >> s >> d;
	bool ans = false;
	rep(i,n){
		cin >> x >>y;
		if(x < s && d < y)ans = true;
	}
	cout << ((ans)?"Yes":"No") << endl;
	return 0;
}

比較するだけだったから簡単だった

ACまでの時間

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

f:id:iiiimmmmo:20210130234436p:plain
ABC190_B

C問題

問題の概要

1,2,..,Nの番号がついたN個の皿と、1,2,...,Mの番号がついたM個の条件があります。
条件iは皿A_iと皿B_iの両方にボールが一個以上置かれている時に満たします。
1,2,...,Kの番号がついたK人の人がいて、人iは皿C_iか皿D_iのどちらか一方にボールを置きます。
満たされる条件の最大個数を求めて下さい。


制約
  • 2 \leq N \leq 100
  • 1 \leq M \leq 100
  • 1 \leq A_i < B_i \leq N
  • 1 \leq K \leq 16
  • 1 \leq C_i \leq D_i \leq N
  • 入力はすべて整数
どのように考えたか

Nが小さいため、K人が皿の上にボールを置けるすべてのパターンを列挙するためにbit全探索を用いた

結果

1発AC
提出したコード

#include<bits/stdc++.h>
#include<atcoder/all>

#define rep(i, n) for (long long i = 0; i < (long long)(n); i++)
#define REP(i,v,n) for(long long i = v; i <= (long long)(n); i++)
#define rrep(i,n) for(long long i = n;0 <= (long long)(i); i--)
#define RREP(i,n,v) for(long long i = n;v <= (long long)(i); i--)
#define all(v) v.begin(), v.end()
#define rall(v) v.rbegin(), v.rend()
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }
using namespace std;
using namespace atcoder;
using ll = long long;
using pi = pair<int, int>;
ll pows(ll x, ll n) {ll ret = 1;while (n > 0) {if (n & 1) ret *= x;x *= x;n >>= 1;}return ret;}

int main() {
	int n,m,a,b,k,ans=0;
	cin >> n >> m;
	vector<pi>AB(m);
	rep(i,m)cin >>AB[i].first >> AB[i].second;
	cin >> k;
	vector<pi>hu(k);
	rep(i,k)cin >> hu[i].first >> hu[i].second;
	for(int bit = 0;bit <(1 << k);bit++){
		vector<int>dish(n,0);
		rep(i,k){
			auto [c,d] = hu[i];
			c--,d--;
			if(bit & (1 << i))dish[c]++;
			else dish[d]++;
		}
		int tmp = 0;
		rep(i,m){
			auto [e,f] = AB[i];
			e--,f--;
			if(1 <= dish[e] && 1 <= dish[f])tmp++;
		}
		chmax(ans,tmp);
	}
	cout << ans << endl;
	return 0;
}

久々のbit全探索でバグらせないか心配だったが、無事一発で通せてよかった

ACまでの時間

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

f:id:iiiimmmmo:20210131000159p:plain
ABC190_C

結果

コンテスト結果

ABCの3完でした。
Cまでは早く解けたがD問題が解けず悔しかった

f:id:iiiimmmmo:20210131000301p:plain
ABC190

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

今回のパフォーマンスは796、前回より50近く上がりました。
レーティングはそれに伴い+10の711となりました。

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

反省点

今回は特に緊張してパニックにはならずC問題まで順調に解けて、D問題は解けなかったですがそれまでは特に時間の無駄遣いはせずD問題に注力することができました。
ただ、等差数列の式変形や検索でD問題を解いたという人の話を聞き、そこも鍛えていかないとダメだなと感じました。
今のところレートは上昇し続けているので、このまま緑を目指したいです。