Codeforces1598 D. Training Session(思维,组合)

Posted live4m

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces1598 D. Training Session(思维,组合)相关的知识,希望对你有一定的参考价值。

题意:

解法:

考虑总方案数减去不满足的.

不满足的:
A存在相同 and B存在相同
题目不存在两对相同的(a,b)
那么不满足的情况一定是:
a|a|y
x|b|b
(上面表示三个数对(a,x),(a,b),(x,b))
枚举中间的(a,b),求两边的配对数
方案数为(ca[a[i]]-1)*(cb[b[i]]-1).其中ca[x]表示a[i]=x的i出现的次数.

code:

#include<bits/stdc++.h>
#define MULTI_CASE
#define SYNC_OFF
#define PI pair<int,int>
#define ll long long
#define int long long
using namespace std;
// const int mod=998244353;
const int mod=1e9+7;
const int maxm=2e6+5;
int ca[maxm];
int cb[maxm];
int a[maxm];
int b[maxm];
int n;
void solve(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i]>>b[i];
    }
    for(int i=1;i<=n;i++){
        ca[i]=cb[i]=0;
    }
    //总方案数减去不满足的
    for(int i=1;i<=n;i++){
        ca[a[i]]++;
        cb[b[i]]++;
    }
    int ans=n*(n-1)*(n-2)/6;//C(n,3)
    //不满足的:
    //A存在相同 and B存在相同
    //题目不存在两对相同的(a,b)
    //那么不满足的一定是:
    //a a x
    //x b b
    //枚举中间的(a,b),求两边的配对数
    //方案数为(ca[a[i]]-1)*(cb[b[i]]-1)
    for(int i=1;i<=n;i++){
        ans-=(ca[a[i]]-1)*(cb[b[i]]-1);
    }
    //
    cout<<ans<<endl;
}
void Main(){
    #ifdef MULTI_CASE
    int T;cin>>T;while(T--)
    #endif
    solve();
}
void Init(){
    #ifdef SYNC_OFF
    ios::sync_with_stdio(0);cin.tie(0);
    #endif
    #ifndef ONLINE_JUDGE
    freopen("../in.txt","r",stdin);
    freopen("../out.txt","w",stdout);
    #endif
}
signed main(){
    Init();
    Main();
    return 0;
}

以上是关于Codeforces1598 D. Training Session(思维,组合)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces1598 F. RBS(状压dp,预处理)

Codeforces Codeforces Round #484 (Div. 2) D. Shark

[codeforces 55]D. Beautiful numbers

CodeForces D. Concatenated Multiples

codeforces 987 D. Fair

codeforces 985 D. Sand Fortress