kmjp's blog

競技プログラミング参加記です

Codeforces #310 Div1 A. Case of Matryoshkas

Cで散々手間取って散々な出来。
http://codeforces.com/contest/555/problem/A

問題

1~Nの大きさのマトリョーシカが1個ずつある。
マトリョーシカは、自分より小さなマトリョーシカを1つ中に入れることはできる。
(ネストして複数入れることは可能だが、直接2つ以上入れることはできない)
初期状態でM個のマトリョーシカが見えており、それぞれどのマトリョーシカを中に含むかが与えられている。

1回の処理で以下のいずれかを行うことができる。

1~Nを全部ネストさせて1個マトリョーシカにするには、最低何回処理をしなければならないか。

解法

1~Nを順にネストさせるには、小さい順にマトリョーシカを包んでいかなければならない。
逆にマトリョーシカの中身を取り出すのは大きな順でなければならない。

よって、一旦全部バラバラにして、順次組み立てればよい。
例外として、最初から1,2,3...と連番で包まれている部分はバラさなくてよい。

int N,K;
int M[101010];
vector<int> A[101010];


void solve() {
	int i,j,k,l,r,x,y; string s;
	cin>>N>>K;
	
	int ret=0,sp=K;
	FOR(i,K) {
		cin>>M[i];
		FOR(j,M[i]) cin>>x, A[i].push_back(x);
		if(A[i][0]==1) {
			FOR(j,M[i]-1) if(A[i][j]+1!=A[i][j+1]) {
				ret += M[i]-1-j;
				sp += M[i]-1-j;
				break;
			}
		}
		else {
			ret += M[i]-1;
			sp += M[i]-1;
		}
	}
	
	cout<<ret+(sp-1)<<endl;
}

まとめ

問題の理解に手間取ってWAしたのがもったいない。