Official

B - Discord Editorial by m_99


すべての \((x,y)\) の組に対して、\(M\) 回の撮影の中に \(x\)\(y\) が連続しているものがあるかどうかを調べればよいです。

\(x, y\) の順番を入れ替えたものは区別しないため、たとえば \(x \lt y\) というルールの下で数えたり、\(x \neq y\) というルールの下で数えた上で求められた答えを \(2\) で割ることで \(x\lt y\) の場合と \(y\lt x\) の場合でのダブルカウントを考慮する必要があります。実装例では外側から \(2\) 番目のループの添え字の初期値を工夫することで \(x \lt y\) というルールの下で数えています。

実装例(C++)

#include <bits/stdc++.h>
using namespace std;

int main() {
    
	int N,M;
	cin>>N>>M;
	
	vector a(M,vector<int>(N));
	
	for(int i=0;i<M;i++){
		for(int j=0;j<N;j++){
			cin>>a[i][j];
		}
	}
	
	int ans = 0;
	
	for(int i=1;i<=N;i++){
		for(int j=i+1;j<=N;j++){
			bool flag = false;
			for(int k=0;k<M;k++){
				for(int l=0;l<N-1;l++){
					if(a[k][l]==i&&a[k][l+1]==j)flag = true;
					if(a[k][l]==j&&a[k][l+1]==i)flag = true;
				}
			}
			if(!flag)ans++;
		}
	}
	
	cout<<ans<<endl;
	
	return 0;
}

posted:
last update: