zoukankan      html  css  js  c++  java
  • 题解 CF1598D Training Session

    [ ext{题目大意} ]

    (quad)(n) 组数,每组数包含一个 (a_i,b_i)((a_i,b_i leq n)),从 (n) 组数中选择 (3) 组数,满足 (a) 全不同或 (b) 全不同,问有多少种方案数?

    [ ext{思路} ]

    (quad)考虑容斥原理,首先总共的方案数为

    [C_n^3=frac{n imes (n-1) imes (n-2)}{6} ]

    (quad)题目中还有一个条件是没有两组数的 (a)(b) 完全相同,所以最多 (a) 不同或 (b) 不同。考虑不符合题目要求的情况,即满足既有 (a) 相同,又有 (b) 相同的三组数的方案数。

    (quad)对于第 (i) 组数,与 (a_i) 相同的数的个数为 (num1) ,与 (b_i) 相同的数的个数为 (num2),设 (j,k) 满足 (a_j=a_i,b_k=b_i),由题可得 (b_j eq b_k,a_j eq a_k),即不会重复计数,显然除了 (i) 本身以外所有的 (j)(k) 可以自由组合,所以可得:

    [ans=C_n^3-displaystylesum_{i=1}^{n}(num1[a_i]-1) imes(num2[b_i]-1) ]

    (quad)多组数据,记得清空数组,并且要开 long long。

    const int N=2e5+5;
    int T,n,num1[N],num2[N],a[N],b[N],ans;
    il int num(int x){return x*(x-1)*(x-2)/6;}
    signed main()
    {
    	T=read();
    	while(T--){
    		n=read();ans=0;
    		for(re i=1;i<=n;i++)
    		{
    			a[i]=read();b[i]=read();
    			num1[a[i]]++;num2[b[i]]++;
    		}
    		for(re i=1;i<=n;i++)ans+=(num1[a[i]]-1)*(num2[b[i]]-1);
    		for(re i=1;i<=n;i++)num1[a[i]]=0,num2[b[i]]=0;
    		print(num(n)-ans);putchar('
    ');
    	}
    	return 0;
    }
    
  • 相关阅读:
    swift 学习笔记
    collection view 开发笔记
    代码片段
    childViewController 小计
    iOS 二维码扫描
    statusbarhidden stuff 状态栏的各种特性
    AFNetworking 3.0 断点续传 使用记录
    scrollview 图片放大 捏合 瓦片地图 相关注意事项
    iOS 9 强制横屏
    简单的JS运动封装实例---侧栏分享到
  • 原文地址:https://www.cnblogs.com/FarkasW/p/15463195.html
Copyright © 2011-2022 走看看