くるのプログラミング記録

プログラミングの感想とか解説とか。

ARC 093 E - Bichrome Spanning Tree (900)

900点。
天才解法というよりは理詰めで押し切れた問題なのでよかった。
リンク:E - Bichrome Spanning Tree
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

問題文

{\displaystyle N}頂点{\displaystyle M}辺からなる重み付き無向グラフがあります。 グラフの{\displaystyle i}番目の辺は頂点{\displaystyle U_i}と頂点{\displaystyle V_i}を結んでおり、重みは{\displaystyle W_i}です。 さらに、整数{\displaystyle X}が与えられます。

このグラフの各辺を白または黒に塗る方法であって、以下の条件を満たすものの個数を{\displaystyle 10^{9} + 7}で割ったあまりを求めてください。

白く塗られた辺と黒く塗られた辺をともに含む全域木が存在する。さらに、そのような全域木のうち最も重みが小さいものの重みは{\displaystyle X}である。
ただし、全域木の重みとは、その全域木に含まれる辺の重みの和を表します。

制約

{\displaystyle 1 \leq N \leq 1000}

{\displaystyle 1 \leq M \leq 2000}

{\displaystyle 1 \leq U_i, V_i \leq N (1 \leq i \leq M)}

{\displaystyle 1 \leq W_i \leq 10^9}

{\displaystyle i \neq j} のとき {\displaystyle (U_i, V_i) \neq (U_j, V_j)} かつ {\displaystyle (U_i, V_i) \neq (V_j, U_j)}

{\displaystyle U_i \neq V_i (1 \leq i \leq M)}

与えられるグラフは連結である。

{\displaystyle 1 \leq X \leq 10^{12}}

入力値はすべて整数である。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
まず問題文がややこしい。サンプル見ないと何をしたい問題か分からなかった。


まず愚直を考えると全辺について白か黒かの2択があるので{\displaystyle 2^M ( M  \leq 2000)} 通り。
ここから最小全域木を求めると (先に辺を重みでソートしておいた上で)更に{\displaystyle O(M)} かかるので絶対無理。
大体{\displaystyle O(M \log M + 2^MM)}ぐらい......?(Union findを考慮してないので本当はもう少し大きそう)


辺のソートと最小全域木の構築は避けられないと思ったので、辺の塗り方を最適化する問題かなあという方針で進める。
問題文読み返してみると「白く塗られた辺と黒く塗られた辺をともに含む」とあるので白と黒をそれぞれ最低一つずつ用意する必要があるなと。


2辺決めうちして貪欲......?
これだと{\displaystyle M(M-1)/2}通り試せば良く、比較的マシになった気がするのでこの方針で進める。
この2辺をそれぞれ{\displaystyle A,B}とする。


最小全域木を構築する際、どう塗り分けるにしても最小重みの辺は必ず使うことに気づいたので、2本のうち1本が決まることに(すなわち{\displaystyle A = \min(W_i)})
この最小辺{\displaystyle A}に対して、{\displaystyle B}は残りの辺について{\displaystyle (M-1)}通り試せばよく、
全体のオーダーも{\displaystyle O(M^2)}となり比較的高速。おっ、解けそう。


ただ、ここからが分からなくなった。
決め打ちした2辺を必ず使う、かつ白黒に当てはめるって方針なので、例えば{\displaystyle A}が黒の場合、{\displaystyle B}は白。ここで他の{\displaystyle B}より軽い辺が白色でかつたくさんあった場合、決め打ちしたにも関わらず{\displaystyle B}最小全域木に含まれなくなってしまうことが起こりえる。


なので直感的には、{\displaystyle B}より軽い辺は全て{\displaystyle B}と違った色であってほしい。
けど全ての{\displaystyle B}より軽い辺が本当にそれで適切かといわれるとそうではないので難しい。
({\displaystyle B}より軽くても最小全域木に使わない辺に関しては白黒の2通りがあるため)


簡単な場合を考えて、色塗りを気にせず最小全域木を求めると{\displaystyle N-1}本の辺が決まる(この辺の集合を{\displaystyle S}とする。)
この{\displaystyle S}に属する{\displaystyle N-1}辺全ての色が同じでない場合は、残りの{\displaystyle M - (N-1)}辺(この辺の集合を{\displaystyle T}とする。)をどう塗ろうとも必ず同じ最小全域木になってしまう(自明といえば自明)


なので{\displaystyle S}が全て同じ色(黒あるいは白一色) or それ以外(白黒混ざっている)で場合分けができる。


{\displaystyle S}に白黒両方の色が混ざっているとき

{\displaystyle (2^{N-1} - 2)(2^{(M-(N-1))})}通り
( 最小全域木に用いる{\displaystyle S}{\displaystyle N-1}辺に関しては(全て黒)と(全て白)を除いて{\displaystyle (2^{N-1} - 2)}通り、
 {\displaystyle T}{\displaystyle M - (N-1)}辺に関してはそれぞれ白か黒の{\displaystyle (2^{(M-(N-1))})}通りなので)


{\displaystyle S}が全て同じ色のとき

{\displaystyle T}{\displaystyle M - (N-1)}辺から1辺を選び、{\displaystyle B}と決め打ちする({\displaystyle B = T_i ( 1 \leq i \leq M - (N - 1)) })
{\displaystyle B}と違う色と仮定し、{\displaystyle A=\min(W_i)}{\displaystyle B = T_i}を用いた最小全域木を構築する。


ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
このときの{\displaystyle B( = T_i ( 1 \leq i \leq M - (N - 1))) }の選び方だが、{\displaystyle T}{\displaystyle M - (N-1)}辺から貪欲に軽い辺から選び、最小全域木を構築する。
使った辺は{\displaystyle S}と同じ色として扱う、すなわち{\displaystyle T}から除き集合{\displaystyle S}に加える。
このとき{\displaystyle 2*(2^{(M-(N-1 + i))})}通り
これを繰り返し2辺決め打ち全探索をする。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー


という嘘解法で詰まる。

{\displaystyle T}から貪欲に軽い辺を{\displaystyle B}として選んだからといってそれが毎回最小全域木に用いられるとは限らないので。
辺の重みの順序で{\displaystyle T}から{\displaystyle S}に加えていくのではなく、{\displaystyle B ( = T_i ( 1 \leq i \leq M - (N - 1))) }を用いたときの最小全域木の重みの順序で{\displaystyle T}から{\displaystyle S}に加えていく。そうすることで上記のような解法がまかり通る(これも気付いてみると自明な気もする)


結論としては、一番軽い辺{\displaystyle A}とそれを除いた{\displaystyle M - 1}辺から{\displaystyle B}として1つを選んだ{\displaystyle A,B}を用いて{\displaystyle M - 1}個の最小全域木を得る。
これらの最小全域木の重みの軽い方から処理する、このとき1度用いた{\displaystyle B}{\displaystyle A}と同じ色として数え上げていく。

以下実装。

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
using ll = long long;

#define REP(i,n) for(int i = 0; i < int(n); i++)
#define FOR(i, m, n) for(int i = int(m);i < int(n);i++)
#define ALL(obj) (obj).begin(),(obj).end()
#define fi first 
#define se second

const ll MOD = (ll)1e9 + 7;

//Class - Union Find Tree
template<class T> class Union_Find {
public:
	vector<int> prnt;
	vector<int> rank;
	vector<T> dist;

	Union_Find(int N = 1) :prnt(vector<int>(N)), rank(vector<int>(N, 0)), dist(vector<int>(N, 0)) {
		for (int i = 0; i < N; ++i) prnt[i] = i;
	}

	int root(int x) {
		if (prnt[x] == x) return x;
		else {
			int r = root(prnt[x]);
			dist[x] += dist[prnt[x]];
			return prnt[x] = r;
		}
	}

	T updated_dist(int x) {
		root(x);
		return dist[x];
	}

	bool same(int x, int y) {
		return root(x) == root(y);
	}

	bool merge(int x, int y, T d) {
		d += updated_dist(x);
		d -= updated_dist(y);
		x = root(x); y = root(y);
		if (x == y) return false;
		if (rank[x] < rank[y]) {
			swap(x, y);
			d = -d;
		}
		if (rank[x] == rank[y]) ++rank[x];
		prnt[y] = x;
		dist[y] = d;
		return true;
	}

	T diff(int x, int y) {
		return updated_dist(y) - updated_dist(x);
	}
};

int main() {
	ll N, M, X; cin >> N >> M >> X;
	vector<pair<ll, pair<int, int>>> edge(M);

	//入力
	REP(i, M) {
		int U, V;
		ll W;
		cin >> U >> V >> W;
		U--;
		V--;
		edge[i] = { W,{ U,V } };
	}

	//重みでソート
	sort(ALL(edge));

	//コーナーケース
	if (N <= 2 || M < 2) {
		cout << 0 << endl;
		return 0;
	}

	//2の累乗をメモ
	vector<ll> pow2(M + 1, 1);
	FOR(i, 1, M + 1) pow2[i] = (pow2[i - 1] * 2) % MOD;

	//M-1個の最小全域木の重み
	vector<ll> sum(M - 1, 0);
	FOR(B, 1, M) {

		//UnionFind木
		Union_Find<int> UF(N);

		//最小辺とBを用いた最小全域木
		sum[B - 1] += edge[0].fi + edge[B].fi;
		UF.merge(edge[0].se.fi, edge[0].se.se, 1);
		UF.merge(edge[B].se.fi, edge[B].se.se, 1);

		//クラスカル法による最小全域木の構築
		FOR(j, 1, M) {
			int U = edge[j].se.fi;
			int V = edge[j].se.se;
			ll W = edge[j].fi;

			//連結済ならcontinue
			if (UF.same(U, V)) continue;

			//辺をmergeし重みを加える
			UF.merge(U, V, 1);
			sum[B - 1] += W;
		}
	}

	//最小全域木の重みでソート
	sort(ALL(sum));

	//軽い方からsum[i] == Xとなるものを数え上げ
	ll ans = 0;
	REP(i, M - 1) if (sum[i] == X) (ans += ((2 * pow2[M - 2 - i]) % MOD)) %= MOD;

	cout << ans << endl;
	return 0;
}

説明がややこしくなったので実装を見るのが一番な気がする。



 

 

ABC 104

ningenMe - AtCoderです。 ABC104に参加しました。

久々によく解けました。 114位/75:09

実装遅かったので順位表見るまでは微妙かなあという気持ちでしたが。

 

A - Rated for Me

if文3つ。A問題なので制約よく読まずに提出。

 

B - AcCepted

これ難しい。10分かかる。 'A'との差分でどういう数字になるのか把握していなかったので良い勉強でした。  

 

C - All Green

難しい。飛ばした。D終わった後考えた。 全埋めでもらえる天井ボーナスが厄介。 天井なかったら貪欲なのにな......天井なくせばいいんじゃね? ってことで使い切る問題の解く点数帯を決め打ちして全探索。2D通り どれを使い切るか決めたら残りは貪欲シミュレーションなので高々103回。 400点ぐらいありそう。  

 

D - We Love ABC

こういうの真ん中決め打ちでしょ?って感じで解法はすぐ降りた。 実装はinf分。 真ん中決め打ち('B' or '?')したときに左の('A' or '?')の数と右の('C' or '?')が分かるとそれぞれO(1)だなあと。 なので累積和で前計算。for流す方向少し気を付ける必要があるから難しい。 後は各('B' or '?')を見て組み合わせを計算するんですが、使わない '?'に対してそれぞれ3通り出てくるのでそれを考慮する。 3105とかやばそうだしMOD取りにくかったのでCombinationModライブラリの中の繰り返し二乗法を引っ張ってくる。 ライブラリ作っててよかったなと思いました。  

 

全体的にサンプル強くて助かりました。ABCこんなに難しかったっけ? おしまい。

AGC 018 A - Getting Difference (300)

300点とは思えない程考えさせられました。

リンク:A - Getting Difference
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

問題文

箱に{\displaystyle N}個のボールが入っていて、{\displaystyle i} 番目のボールには整数{\displaystyle A_i} が書かれています。 すぬけ君は、次の操作を好きな回数だけ行うことができます。

箱から二つのボールを取り出し、その二つのボールに書かれている数の差の絶対値を書いた新しいボールと一緒に箱に戻す。
すぬけ君が、整数{\displaystyle K}の書かれたボールが箱の中に入っている状態にできるかどうか判定してください。

制約

{\displaystyle 1 \leq N \leq 10^{5}}

{\displaystyle 1 \leq A_i \leq 10^{9}}

{\displaystyle 1 \leq K \leq 10^{9}}

入力はすべて整数である。 

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

とりあえず想定解{\displaystyle O(N)}{\displaystyle O(N\log N)}かなあ、ソートぐらいしかできることないな、と。

シミュレーションっぽいことすると二数の取り方の組合せがやばいのと、数列の要素数がどんどん大きくなりそうで厳しい。

 

題意の通り操作した際どんな数が出来るか少し考えてみると、作れそうな数は{\displaystyle A_i}同士のgcdの倍数ということに気付く。

{\displaystyle A_i}同士のgcdの倍数をいい感じに作って{\displaystyle K}になるか判定する問題かな……って思うものの出来ることが特にない。

愚直に全通りgcdを作ると{\displaystyle O(N^{2}\log A)}ぐらい?で大きすぎるので。要素も次々に増えるしね。


とりあえずコーナーケースを省くと、{\displaystyle K \gt \max \{ A_i \} }のときどうやっても無理なので"IMPOSSIBLE"。

それとgcdが1になるものを見つけると何でも作れるため"POSSIBLLE"になる。

 

gcdが1は解く鍵になると思って最初に素数を考えるものの、素数があったところで嬉しい訳でもなく({\displaystyle N = 2, K = 3, A_1 = 14, A_2 = 7 }とかで自明に無理)、互いに素かどうかが大事だなと。しかも素じゃなくてもいいやと気付き結局gcdかよと(無駄考察)

 

じゃあgcdがどんな数になれば嬉しいかというと{\displaystyle A_i - K }(このとき{\displaystyle A_i \gt K })の約数になってほしいよねと。すなわち{\displaystyle K }との差分が数列{\displaystyle A }のある二要素のgcdの倍数になれば嬉しい。"POSSIBLE"であると。

なので{\displaystyle A_i - K }を列挙しておく。({\displaystyle A_i}あるいは{\displaystyle A_i}からなるgcd)からある数{\displaystyle g}を決め打ちして列挙した数のいずれかが1つ割り切れるかを確認することで判定が可能だなと。

 

ここから嘘解法感の漂う証明のない考察。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

{\displaystyle g}の決め方ですが、小さい方が良い。{\displaystyle A_i - K }の要素が割り切れる、というのは最悪の場合で素数であったとしても、1で割り切ることが出来るため。
数字が小さい方が余りの種類が少ないため当たり判定が大きいイメージ。素因数考えると分かりやすい?

また小さい数{\displaystyle g}{\displaystyle A_i}のgcdをそれぞれとると必ず{\displaystyle g}以下になるためその最小の数{\displaystyle f}を次の{\displaystyle g}として採用できる。

{\displaystyle f = g}だった場合これ以上gcdを取るという操作では数列の要素は増えず{\displaystyle K}を作ることは出来ないので"IMPOSSIBLE"

計算量とかを深く考えず実装していく。 

#include <iostream>
#include <vector>
#include <set>
#include <algorithm>

using namespace std;

int gcd(int a, int b) {
	if (a < b) swap(a, b);
	while (b != 0) {
		a = a%b;
		swap(a, b);
	}
	return a;
}

int main() {
	int N, K; cin >> N >> K;
	vector<int> A(N),v; 
	for (int i = 0; i < N; ++i) cin >> A[i];
	set<int> st;

	for (int i = 0; i < N; ++i) {
		
		//最初にあれば終わり
		if (A[i] == K) {
			cout << "POSSIBLE" << endl;
			return 0;
		}

		//差分列挙
		if (A[i] > K) v.push_back(A[i] - K);

		//ユニークだけを列挙
		st.insert(A[i]);
	}

	//最大値がKより小さい場合
	if (v.size() == 0) {
		cout << "IMPOSSIBLE" << endl;
		return 0;
	}

	int mini = 0, mini2 = *min_element(A.begin(),A.end());

	//最小値が更新される限りループ
	while (mini2 != mini) {
		mini = mini2;

		//割り切れればPOSSIBLE
		for (int i = 0; i < v.size(); ++i) {
			if (v[i] % mini == 0) {
				cout << "POSSIBLE" << endl;
				return 0;
			}
		}

		vector<int> u;
		//gcdを作っていく
		for (auto itr = st.begin(); itr != st.end(); ++itr) {
			int g = gcd(mini, *itr);
			u.push_back(g);
		}
		for (int i = 0; i < u.size(); ++i) st.insert(u[i]);
		mini2 = *min_element(u.begin(), u.end());
	}

	cout << "IMPOSSIBLE" << endl;
	return 0;
}

ACしたもののテストケース厳しいならTLEするような気もする……。
間違いあれば是非教えてください。

ABC過去問を全部解きました。[後編]

くる(ningenMe - AtCoder)です。
Atcoder Beginner Contest(001-098)の過去問を全部解きました。
D問題の感想と点数(主観)を書いていきたいと思います。
AとBとCはこちら。
ningenme.hatenablog.com


以下ものすごくネタバレを含んだ感想。



感雨時刻の整理(300)
https://beta.atcoder.jp/contests/abc001/tasks/abc001_4
1次元imos。てか感雨って何?

派閥(400)
https://beta.atcoder.jp/contests/abc002/tasks/abc002_4
実装考えたら400かなあと。

atcoder社の冬(450)
https://beta.atcoder.jp/contests/abc003/tasks/abc003_4
包除だから500かなとも思うけど愚直でも解ける。

マーブル(400)
https://beta.atcoder.jp/contests/abc004/tasks/abc004_4
難しかったけど解ける人は解けるな、と。

おいしいたこ焼の焼き方(450)
https://beta.atcoder.jp/contests/abc005/tasks/abc005_4
400なんだけど典型2個だから450。

トランプ挿入ソート(400)
https://beta.atcoder.jp/contests/abc006/tasks/abc006_4
難しいけど典型なので。ABC唯一のLIS。唯一は嘘でした。

禁止された数字(400)
https://beta.atcoder.jp/contests/abc007/tasks/abc007_4
桁dp知らないけど愚直で解けたので。

金塊ゲーム(750)
https://beta.atcoder.jp/contests/abc008/tasks/abc008_4
発想も実装も厳しい。800でもいい。

漸化式(500)
https://beta.atcoder.jp/contests/abc009/tasks/abc009_4
典型だけどDの典型ではないので。唯一の行列累乗。

浮気予防(600)
https://beta.atcoder.jp/contests/abc010/tasks/abc010_4
これも典型だけどね。唯一のフロー。

大ジャンプ(500)
https://beta.atcoder.jp/contests/abc011/tasks/abc011_4
解けそうで解けない。

バスと避けられない運命(400)
https://beta.atcoder.jp/contests/abc012/tasks/abc012_4


阿弥陀(500)
https://beta.atcoder.jp/contests/abc013/tasks/abc013_4
本質より1回のあみだをO(N)で解く方が難しく感じた。

閉路(600)
https://beta.atcoder.jp/contests/abc014/tasks/abc014_4
典型。唯一のLCA

高橋君の苦悩(400)
https://beta.atcoder.jp/contests/abc015/tasks/abc015_4


一刀両断(400)
https://beta.atcoder.jp/contests/abc016/tasks/abc016_4
線形交差判定って典型なんですかね。

サプリメント(700)
https://beta.atcoder.jp/contests/abc017/tasks/abc017_4
無理。dp。しゃくとりィ。

バレンタインデー(450)
https://beta.atcoder.jp/contests/abc018/tasks/abc018_4
実装を加味して450。

高橋君と木の直径(450)
https://beta.atcoder.jp/contests/abc019/tasks/abc019_4
インタラクティブ

LCM Rush(800)
https://beta.atcoder.jp/contests/abc020/tasks/abc020_d
数学。

多重ループ(400)
https://beta.atcoder.jp/contests/abc021/tasks/abc021_d
高校数学。

Big Bang(400)
https://beta.atcoder.jp/contests/abc022/tasks/abc022_d


射撃王(400)
https://beta.atcoder.jp/contests/abc023/tasks/abc023_d
400だとは思うけど苦手。

動的計画法(500)
https://beta.atcoder.jp/contests/abc024/tasks/abc024_d
数学。

25個の整数(700)
https://beta.atcoder.jp/contests/abc025/tasks/abc025_d
入力が全部0なら600。

高橋君ボール1号(400)
https://beta.atcoder.jp/contests/abc026/tasks/abc026_d
400だけど解けなかったよね。

ロボット(500)
https://beta.atcoder.jp/contests/abc027/tasks/abc027_d
難しいけど解けないといけない。

乱数生成(400)
https://beta.atcoder.jp/contests/abc028/tasks/abc028_d

1(400)
https://beta.atcoder.jp/contests/abc029/tasks/abc029_d
愚直。

へんてこ辞書(450)
https://beta.atcoder.jp/contests/abc030/tasks/abc030_d
余りの取り方勉強になる。

語呂合わせ(600)
https://beta.atcoder.jp/contests/abc031/tasks/abc031_d
AGCっぽい。

ナップサック問題(550)
https://beta.atcoder.jp/contests/abc032/tasks/abc032_d
実装がアレなのでコンテストでは嫌だな。

三角形の分類(500)
https://beta.atcoder.jp/contests/abc033/tasks/abc033_d
難しい。

食塩水(500)
https://beta.atcoder.jp/contests/abc034/tasks/abc034_d


トレジャーハント(500)
https://beta.atcoder.jp/contests/abc035/tasks/abc035_d


塗り絵(450)
https://beta.atcoder.jp/contests/abc036/tasks/abc036_d
唯一の木dp。

経路(400)
https://beta.atcoder.jp/contests/abc037/tasks/abc037_d
Dっぽい。

プレゼント(500)
https://beta.atcoder.jp/contests/abc038/tasks/abc038_d
BIT難しいね。LISでも解けます。

画像処理高橋君(400)
https://beta.atcoder.jp/contests/abc039/tasks/abc039_d


道路の老朽化対策について(600)
https://beta.atcoder.jp/contests/abc040/tasks/abc040_d
解けそうで解けないし難しい。

徒競走(700)
https://beta.atcoder.jp/contests/abc041/tasks/abc041_d
解けなさそうだし解けないし難しい。

いろはちゃんとマス目(400)
https://beta.atcoder.jp/contests/abc042/tasks/arc058_b


アンバランス(400)
https://beta.atcoder.jp/contests/abc043/tasks/arc059_b


桁和(500)
https://beta.atcoder.jp/contests/abc044/tasks/arc060_b
賢い。

すぬけ君の塗り絵(400)
https://beta.atcoder.jp/contests/abc045/tasks/arc061_b


AtCoDeerくんと変なじゃんけん(350)
https://beta.atcoder.jp/contests/abc046/tasks/arc062_b
300は低すぎ。

高橋君と見えざる手(400)
https://beta.atcoder.jp/contests/abc047/tasks/arc063_b


An Ordinary Game(500)
https://beta.atcoder.jp/contests/abc048/tasks/arc064_b
ゲームは悪。

連結(450)
https://beta.atcoder.jp/contests/abc049/tasks/arc065_b
最後の数え上げ難しくない?

Xor Sum(700)
https://beta.atcoder.jp/contests/abc050/tasks/arc066_b
最初解説すら読めなかったよね。

Candidates of No Shortest Paths(400)
https://beta.atcoder.jp/contests/abc051/tasks/abc051_d
問題そのものが本当に典型。

Walk and Teleport(300)
https://beta.atcoder.jp/contests/abc052/tasks/arc067_b
500の顔すんなお前!!!

Card Eater(400)
https://beta.atcoder.jp/contests/abc053/tasks/arc068_b


Mixing Experiment(450)
https://beta.atcoder.jp/contests/abc054/tasks/abc054_d
難しい。

Menagerie(450)
https://beta.atcoder.jp/contests/abc055/tasks/arc069_b
難しくない。

No Need(600)
https://beta.atcoder.jp/contests/abc056/tasks/arc070_b
D問題の気持ちにならないとね。

Maximum Average Sets(400)
https://beta.atcoder.jp/contests/abc057/tasks/abc057_d
400なんだけど……確かに400なんだけど……。

井井井 (500)
https://beta.atcoder.jp/contests/abc058/tasks/arc071_b
数学。

Alice&Brown(500)
https://beta.atcoder.jp/contests/abc059/tasks/arc072_b
だからゲームは良くないんだって。

Simple Knapsack(400)
https://beta.atcoder.jp/contests/abc060/tasks/arc073_b
初めて解いたD問題。

Score Attack(400)
https://beta.atcoder.jp/contests/abc061/tasks/abc061_d
唯一のベルマンフォード。

3N Numbers(500)
https://beta.atcoder.jp/contests/abc062/tasks/arc074_b


Widespread(400)
https://beta.atcoder.jp/contests/abc063/tasks/arc075_b
解けないといけないんだけど苦手。

Insertion(400)
https://beta.atcoder.jp/contests/abc064/tasks/abc064_d


Built?(500)
https://beta.atcoder.jp/contests/abc065/tasks/arc076_b
唯一の最小全域木

11(500)
https://beta.atcoder.jp/contests/abc066/tasks/arc077_b
AGC感。

Fennec VS. Snuke(400)
https://beta.atcoder.jp/contests/abc067/tasks/arc078_b
400だけど解けるけど難しくない?

Decrease (Contestant ver.)(600)
https://beta.atcoder.jp/contests/abc068/tasks/arc079_b
こういうのが構築?難しい。

Grid Coloring(400)
https://beta.atcoder.jp/contests/abc069/tasks/arc080_b


Transit Tree Path(400)
https://beta.atcoder.jp/contests/abc070/tasks/abc070_d
水色の今なら文章そのままだなって感じるね。

Coloring Dominoes(400)
https://beta.atcoder.jp/contests/abc071/tasks/arc081_b
最近のDらしい難易度になってきたね。

Derangement(400)
https://beta.atcoder.jp/contests/abc072/tasks/arc082_b


joisino's travel(400)
https://beta.atcoder.jp/contests/abc073/tasks/abc073_d
やるだけ。

Restoring Road Network(400)
https://beta.atcoder.jp/contests/abc074/tasks/arc083_b
日本語が難しい。

Axis-Parallel Rectangle(400)
https://beta.atcoder.jp/contests/abc075/tasks/abc075_d
400なんだけどな~お前な~。

AtCoder Express(500)
https://beta.atcoder.jp/contests/abc076/tasks/abc076_d
君は500点だよ!初めてのABCだったのでよく覚えてる。

Small Multiple(750)
https://beta.atcoder.jp/contests/abc077/tasks/arc084_b
ABCも天才以外お断り。

ABS(400)
https://beta.atcoder.jp/contests/abc078/tasks/arc085_b
ゲームは嫌いですが解けたのでこれは好き!!!

Wall(400)
https://beta.atcoder.jp/contests/abc079/tasks/abc079_d
灰色当時何もできなかった。

Recording(400)
https://beta.atcoder.jp/contests/abc080/tasks/abc080_d


Non-decreasing(500)
https://beta.atcoder.jp/contests/abc081/tasks/arc086_b
コンテスト中ではないけど自力600はこれが初めて。

FT Robot(500)
https://beta.atcoder.jp/contests/abc082/tasks/arc087_b
シミュレーションしたくなるよね。

Wide Flip(500)
https://beta.atcoder.jp/contests/abc083/tasks/arc088_b
こういうの一生解ける気しない。

2017-like Number(400)
https://beta.atcoder.jp/contests/abc084/tasks/abc084_d


Katana Thrower(350)
https://beta.atcoder.jp/contests/abc085/tasks/abc085_d
お前は400点じゃない!!!初めてコンテスト中に通せたD問題。

Checker(500)
https://beta.atcoder.jp/contests/abc086/tasks/arc089_b
実装が大変。

People on a Line(450)
https://beta.atcoder.jp/contests/abc087/tasks/arc090_b
500ない?400じゃないでしょ?難しくない?

Grid Repainting(400)
https://beta.atcoder.jp/contests/abc088/tasks/abc088_d


Practical Skill Test(400)
https://beta.atcoder.jp/contests/abc089/tasks/abc089_d


Remainder Reminder(400)
https://beta.atcoder.jp/contests/abc090/tasks/arc091_b
D問題らしいのが並ぶね。

Two Sequences(500)
https://beta.atcoder.jp/contests/abc091/tasks/arc092_b
制約からエスパーするとなんとなく解法が絞れるけどそれでも難しい、けど典型ではある。

Grid Components(500)
https://beta.atcoder.jp/contests/abc092/tasks/arc093_b
田植え。初めてコンテストで通した500。AGCっぽいなあ。

Worst Case(700)
https://beta.atcoder.jp/contests/abc093/tasks/arc094_b
これめちゃめちゃ難しい。この発想マジでどこから出てくるの?

Binomial Coefficients(400)
https://beta.atcoder.jp/contests/abc094/tasks/arc095_b
エスパーをします。

Static Sushi(500)
https://beta.atcoder.jp/contests/abc095/tasks/arc096_b
これは難しいけど解けないといけない問題。

Five, Five Everywhere(400)
https://beta.atcoder.jp/contests/abc096/tasks/abc096_d

Equals(400)
https://beta.atcoder.jp/contests/abc097/tasks/arc097_b


Xor Sum 2(500)
https://beta.atcoder.jp/contests/abc098/tasks/arc098_b
実装が大変に感じる。xorの単位元とか逆元の知識とか持ち合わせてないよ。



はい。長い。約100問。誰がここまで読むんだ?

点数に関して考えてみましたが設定されているもので概ね納得ですねー。
難しいのに点数低い問題は殆ど典型だからそういうのは出会えてラッキーという感じで。
知ってる典型で解けないと泣きたくなるけどね。

LCM Rush、金塊ゲーム、Small Multiple、Xor Sum、徒競走、25個の整数、サプリメント、Worst Case、道路の老朽化対策について、浮気予防。
ABCの難易度ランキングだとこんな感じですね。

D問題は解説ないと困る問題が多い、難しい。
ABCの問題だけでも割と色んなアルゴリズム学べますね。

E問題からは大変なので(既に挫けた)当分はARC-A,BとAGC-A,Bを解きます(現実逃避)
楽しくatcoder続けていきたいね。レートも少しずつ上げたいね。

はやく青になりたーい。

ABC過去問を全部解きました。[前編]

くる(ningenMe - AtCoder)です。
Atcoder Beginner Contest(001-098)の過去問を全部解きました。

f:id:ningenMe:20180605093140p:plain


問題の感想と点数(主観)を書いていきたいと思います。
ネタバレがあるので気を付けてください。



A問題
pythonの練習がてらスマホで解きました。


B問題
たまにWAしちゃう。


C問題
最近のはいいんですが昔のだと難しいの混ざってたりして困りますね。
300点以上に感じる問題がちらほら。

スフィンクスのなぞなぞ(350)
https://beta.atcoder.jp/contests/abc006/tasks/abc006_3
難しいけどCらしい問題。


コイン(500)
https://beta.atcoder.jp/contests/abc008/tasks/abc008_3
地頭。数学。


辞書式順序ふたたび(700)
https://beta.atcoder.jp/contests/abc009/tasks/abc009_3
C最難関。


節制(450)
https://beta.atcoder.jp/contests/abc013/tasks/abc013_3


菱型カウント(450)
https://beta.atcoder.jp/contests/abc018/tasks/abc018_3


壁抜け(400)
https://beta.atcoder.jp/contests/abc020/tasks/abc020_c
点数低いかもですが典型なので。良問。


正直者の高橋くん(400)
https://beta.atcoder.jp/contests/abc021/tasks/abc021_c
壁抜けと同じく。ABC唯一のDAG、トポロジカルソート。


Blue Bird(400)
C - Blue Bird
最近のD問題っぽい。


収集王(400)
https://beta.atcoder.jp/contests/abc023/tasks/abc023_c


双子と○×ゲーム(500)
https://beta.atcoder.jp/contests/abc025/tasks/abc025_c
ゲームは難しい。


高橋君の給料(350)
https://beta.atcoder.jp/contests/abc026/tasks/abc026_c
思考は無いけど300じゃない感じもする。


倍々ゲーム(400)
https://beta.atcoder.jp/contests/abc027/tasks/abc027_c
ゲームは無理。


Brute-force Attack(300)
https://beta.atcoder.jp/contests/abc029/tasks/abc029_c
アホみたいな実装しか浮かばない。


経路(300)
https://beta.atcoder.jp/contests/abc034/tasks/abc034_c
典型。


座圧(300)
https://beta.atcoder.jp/contests/abc036/tasks/abc036_c
ド典型。


柱柱柱柱柱(300)
https://beta.atcoder.jp/contests/abc040/tasks/abc040_c
ドド典型。


たくさんの数式(300)
https://beta.atcoder.jp/contests/abc045/tasks/arc061_a
これもアホみたいな実装しか浮かばない。


Snuke Festival(350)
https://beta.atcoder.jp/contests/abc077/tasks/arc084_a
難しく感じた。


2D Plane 2N Points(500)
https://beta.atcoder.jp/contests/abc091/tasks/arc092_a
貪欲解500はある。


K-th Substring(350)
https://beta.atcoder.jp/contests/abc097/tasks/arc097_a
Cっぽくない。


全体的にC問題は制約が甘いから解ける問題が多いですね。


D問題はまた復習がてら次の機会で。


余談ですが
D全部解けば青になれると聞いていましたが僕はまだ水色です(悲しい)
コンテスト中に400-700を通す率が少しずつ上がっては来たので意味があったとは思いますが……。

早く青になりたーい。