HDU - 5101 Select

来源:互联网 发布:c语言代码混淆工具 编辑:程序博客网 时间:2024/06/05 19:21

题目大意:给定一些集合,选择两个来自不同集合的数,加和大于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;}


0 0
原创粉丝点击