题意:
。。。
思路:
我们定义(i,j)表示两个人住在i,j客栈。
1<=i<j<=n
只有当(i,j)中的费用全部大于p时,(i,j)才不是解。
所以由此很容易得出一个组合算法。
LL go(int x) {
LL ret = 0, sum = 0;
rep(i, 1, n) sum += (c[i] == x);
if (sum < 2) return 0;
dp[0] = 0;
rep(i, 1, n) {
if (v[i] <= p) {
dp[i] = 0;
continue;
}
if (c[i] == x) {
ret += dp[i-1];
dp[i] = dp[i-1] + 1;
}
else {
dp[i] = dp[i-1];
}
}
//cout << "sum, ret: " << sum << ' ' << ret << endl;
ret = sum*(sum-1)/2 - ret;
//cout << "color " << x << ": " << ret << endl;
//cout << "dp: ";rep(i, 1, n) cout << dp[i] << ' ';cout << endl;
return ret;
}
LL solve() {
LL ans = 0;
rep(i, 0, k-1) ans += go(i);
return ans;
}