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