立命館合宿2012 day1 問題B Spellcasters (AOJ 1085)

問題

日本語なので本文参照(http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1085

制約条件

入力は全て整数
n≦20000
r[i]≦100
S≦100

方針

r[i]の上限が小さいので、特定の値をとるr[i]がいくつあるかを数え、
そこから場合の数を求めてやればよい。

ソースコード

int main(){
	int n, s;
	while(cin>>n>>s,n){
		int cnt[200]={};
		rep(i,n){
			int r; cin>>r;
			cnt[r]++;
		}
		ll ans=0;
		rep(i,101){
			rep(j,i+1)if(i+j>s){
				if(cnt[i]&&cnt[j])
				if(i==j)ans+=(ll)cnt[i]*(cnt[j]-1)/2;
				else ans+=(ll)cnt[i]*cnt[j];
			}
		}
		cout<<ans<<endl;
	}
	return 0;
}