题目大意: 给定一些集合,选择两个来自不同集合的数,加和大于k,问有多少种选择方案。 解题思路: 答案=从所有数中选择的两个加和大于k的数的方案数-在同一个集合中选择的两个加和大于k的数的方案数 而对于同一个集合中选择的两个加和大于k的方案数是可以直接排序然后利用单调性快速统计出来的。#include <iostream> #include <cstdio> #include <cstdlib> #include <vector> #include <cstring> #include <algorithm> using namespace std; typedef long long LL; int n, k, v[1010][110], m[1100], arr[1010*110]; int main() { int T; scanf("%d", &T); while(T--) { int cnt=0; scanf("%d%d", &n, &k); for(int i=0; i<n; i++) { scanf("%d", &m[i]); for(int j=0; j<m[i]; j++) { scanf("%d", &v[i][j]); arr[cnt++]=v[i][j]; } sort(v[i], v[i]+m[i]); } sort(arr, arr+cnt); LL ans=0; for(int i=0; i<cnt; i++) ans+=arr+cnt-upper_bound(arr+i+1, arr+cnt, k-arr[i]); for(int i=0; i<n; i++) for(int j=0; j<m[i]; j++) ans-=v[i]+m[i]-upper_bound(v[i]+j+1, v[i]+m[i], k-v[i][j]); printf("%I64d\n", ans); } return 0; }
HDU - 5101 Select
最新推荐文章于 2022-04-11 19:48:47 发布