ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

分组求数对和

2022-07-18 16:36:32  阅读:126  来源: 互联网

标签:vall int rep vector 分组 求数 小朋友 define


image

解题思路

 	n个小朋友 每人有任意个数字,从两个不同小朋友任意去一个数使得和大于k,问有多少种取法?
 可以通过vector容器来方便的解决不同小朋友不同手牌的问题
 通过对每个小朋友手牌以及所有手牌排序后二分作差,可以查到与该小朋友的另一取值共有多少种不同取法,然后相加得到
 最后还要记得对答案进行减半操作,因为我们队一组数对算了两次 比如(1,2) (2,1)

解题代码

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

#define rep(i,a,n) for(int i = a; i <= n; i++)
#define per(i,a,n) for(int i = n; i >= a; i--)
#define pb push_back
typedef long long ll;
typedef double  db;
#define fr first
#define sc second
const int Mod = 998244353;
const int N = 1e6 + 10;
//模板一定要写对
//了解容斥原理
//巧用stl
vector<int> vall;
vector<int> v[N];

int get(vector<int> & v, int x){
    return v.end() - lower_bound(v.begin(), v.end(), x);
}

int main(){
    int n,k;
    int s;
    cin >> n >> k;
    int x;
    rep(i,1,n){
        cin >> s;
      
        rep(j,1,s){
            cin >> x;
            vall.pb(x);
            v[i].pb(x);
        }
        sort(v[i].begin(),v[i].end());
    }
    sort(vall.begin(),vall.end());
    ll ans = 0;
    rep(i,1,n){
        int sz = v[i].size();
        rep(j,0,sz - 1){
            int now = v[i][j];
            ans +=(get(vall,k - now) - get(v[i],k - now));
        }
    }
   cout << ans/2ll % Mod << endl;
    return 0;
}

标签:vall,int,rep,vector,分组,求数,小朋友,define
来源: https://www.cnblogs.com/laowang-blog/p/16490924.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有