牛客国庆集训派对Day2(A F H)

2023-05-16

链接: https://www.nowcoder.com/acm/contest/202#question

牛客国庆集训派对Day2

  • A. 矩阵乘法(分块)
  • F. 平衡二叉树(数据结构)
  • H. 卡牌游戏(数论-期望)

A. 矩阵乘法(分块)

题意: 给两个矩阵 A , B A, B A,B A A A 是十进制矩阵, B B B 是二进制矩阵,问两个矩阵相乘之后得到的结果矩阵的每个元素的异或和。
思路: 因为 B B B 是二进制矩阵, B B B 矩阵最多只有 64 行,分块后,它的组合情况其实很少。 若对 A A A 分块, 每行每 8 个分一块,那 B B B 中就只有 256 种情况。 对矩阵 A A A 每行最多 8 个块的 256 种情况预处理,预处理时采用类似状压dp的方式,每个预处理的数只需要在之前的基础上加上二进制最后一位 1 对应的没被处理过的数就行了。(注意二进制全是0的时候一定是0不需要考虑)相乘的结果就是每行中的每块值对应查表,在加起来就是了。复杂度O(8 * n *m)。
(比赛时不会,看了题解,又看了别人代码才写出来。后来听说暴力也能过,我只能给牛客的评测机点个赞了。)

#include <bits/stdc++.h>
#define lowbit(x) x&(-x)
using namespace std;
const int MAXN = 5000;
const int MAXP = 100;

int f[MAXN][10][300];
int n, p, m; 
int A[MAXN][MAXP]; 
int C[MAXN][MAXN];
unsigned long long B[MAXN];
int num[300];

int main(int argc, char const *argv[])
{
	scanf("%d%d%d", &n, &p, &m);
	for (int i = 0; i < n; ++i) {
		for (int j = 0; j < p; ++j) {
			scanf("%x", &A[i][j]);
		}
	}
	char c[100];
	for (int i = 0; i < m; ++i) {
		scanf("%s", c);
		for (int j = p-1; j >= 0; --j) {
			B[i] <<= 1;//|(c[j]^'0');
			B[i] += (c[j]^'0');
		}// cout<<B[i]<<endl;
	}

	for (int i = 1; i < 8; ++i) {
		num[1<<i] = i;//cout<<"num : "<<num[1<<i]<<endl;
	}
	for (int i = 0; i < n; ++i) {
		for (int j = 0; j < 8; ++j) {
			for (int k = 1; k < 256; ++k) {// k == 0 的时候就是0, 从1开始
				f[i][j][k] = f[i][j][k^lowbit(k)] + A[i][j*8+num[lowbit(k)]];
				// cout<<f[i][j][k]<<" ";
			}// cout<<endl;
		}// cout<<endl<<endl;
	}
	// cout<<"sajdjas"<<endl;
	for (int i = 0; i < n; ++i) {
		for (int j = 0; j < m; ++j) {
			for (int k = 0; k < 8; ++k) {
				C[i][j] += f[i][k][B[j]>>(k*8)&255];				
			}
		}
	}
	int ans = 0;
	for (int i = 0; i < n; ++i) {
		for (int j = 0; j < m; ++j) {
			ans ^= C[i][j];
			// cout<<C[i][j]<<" ";
		}//cout<<endl;
	}
	cout<<ans<<endl;
	return 0;
}

F. 平衡二叉树(数据结构)

题意: 满足左右子树高度差不超过 d d d 的二叉树称为平衡二叉树。不平衡度是树中所有节点的左右子树的节点数之差的最大值。给定 d , n d, n d,n ,求不平衡度的最大值。
思路:
1.当 d &gt; = n − 1 d &gt;= n-1 d>=n1 时,可以假定根节点的左子树是满二叉树,右子树是空树,直接输出 高度 n − 1 n-1 n1 的满二叉树的节点个数 2 n − 1 − 1 2^{n-1} -1 2n11
2.当 d &lt; n − 1 d &lt; n-1 d<n1 时, 仿照之前的思路,假定根节点的左子树是满二叉树,右子树是符合平衡要求的节点最少的平衡二叉树。还记得最小平衡二叉树节点数公式吗
f ( h ) = { h   h ≤ d   f ( h − 1 ) + f ( h − 1 − d ) + 1   h &gt; d   f(h)= \begin{cases} h &amp; \text { $h \leq d$ } \\ f(h-1) + f(h-1-d) + 1 &amp; \text{ $h &gt; d$ } \end{cases} f(h)={hf(h1)+f(h1d)+1 hd  h>d 
左子树的高度是 n − 1 n-1 n1 , 所以右子树的高度只需要 n − 1 − d n-1-d n1d 就可以了,所以答案即 2 n − 1 − 1 − f ( n − 1 − d ) 2^{n-1} - 1 - f(n-1-d) 2n11f(n1d)

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL n, d;

LL power(LL x, LL n) {
	LL res = 1;
	while(n) {
		if(n & 1) {
			res = (res*x);
		}
		x = x*x;
		n >>= 1;
	} 
	return res;
}

int main(int argc, char const *argv[])
{
	cin>>n>>d;
	LL f[100];
	if(n == 0) {
		cout<<0<<endl;
		return 0;
	}
	if(d >= n-1) {
		cout<<power(2, n-1)-1<<endl;
		return 0;
	}
	for (LL i = 0; i <= d; ++i) {
		f[i] = i;
	}
	for (LL i = d+1; i <= n-1-d; ++i) {
		f[i] = f[i-1] + f[i-1-d] + 1;
	}
	LL ans = power(2, n-1)-1 - f[n-1-d];
	cout<<ans<<endl;
	return 0;
}

H. 卡牌游戏(数论-期望)

题意 : N N N 种牌, M M M 种稀有,每抽一次,会随机从 N N N 种牌选择一个,但 M M M 种牌不会重复抽到, 现在想得到 K K K 种稀有卡牌,问抽牌的次数的期望是多少。
思路:

  1. 先考虑 K = = 1 K == 1 K==1 的情况,
    第一次抽到的概率是 M N \frac M N NM
    第二次抽到的概率是 N − M N ∗ M N \frac {N-M} N * \frac M N NNMNM

    n n n 次抽到的概率是 ( N − M N ) n − 1 ∗ M N (\frac {N-M} N )^{n-1}* \frac M N (NNM)n1NM
    期望 E = 1 ∗ M N + 2 ∗ N − M N ∗ M N + . . . + n ∗ ( N − M N ) n − 1 ∗ M N E = 1 * \frac M N + 2 * \frac {N-M} N * \frac M N + ... + n * (\frac {N- M} N )^{n-1}* \frac M N E=1NM+2NNMNM+...+n(NNM)n1NM
    E = 1 − ( N − M N ) n 1 − N − M N − n ∗ ( N − M N ) n E = \frac {1 - (\frac {N-M} N)^n} {1 - \frac {N-M} N} - n * (\frac {N-M} N)^n E=1NNM1(NNM)nn(NNM)n
    n n n 趋于无穷时 E = N M E = \frac N M E=MN
  2. K = = 2 K == 2 K==2 时, 因为 M M M 种稀有牌不会重复得到, 所以可以分解为两个子问题, 即可以理解为先从 N N N 种牌, M M M 种稀有中得到 1 1 1 种, 再从 N − 1 N-1 N1种牌, M − 1 M-1 M1 种稀有中得到 1 1 1 种。所以 E = N M + N − 1 M − 1 E = \frac N M + \frac {N-1} {M-1} E=MN+M1N1
  3. 以此类推, 当 K = = K K == K K==K 时, E = ∑ i = 0 K − 1 N − i M − i E = \sum ^{K-1} _{i=0}\frac {N-i} {M-i} E=i=0K1MiNi
#include <bits/stdc++.h>
using namespace std;

int main()
{
    int t, cas = 0;
    double n, m, k;
    cin>>t;
    while(t--) {
        cin>>n>>m>>k;
        double ans = 0;
        for(int i = 0; i < k; ++i) {
            ans += (n-i)/(m-i);
        }
        cout<<"Case #"<<++cas<<": "<<fixed<<setprecision(12)<<ans<<endl;
    }

    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

牛客国庆集训派对Day2(A F H) 的相关文章

随机推荐

  • 蓝桥杯_PREV-34_矩阵翻硬币

    题目 xff1a 矩阵翻硬币 链接 问题描述 小明先把硬币摆成了一个 n 行 m 列的矩阵 随后 xff0c 小明对每一个硬币分别进行一次 Q 操作 对第x行第y列的硬币进行 Q 操作的定义 xff1a 将所有第 i x 行 xff0c 第
  • ONL(open network linux) from OCP

    https opennetlinux org github xff1a https github com OpenComputeProject OpenNetworkLinux Open Network Linux is a Linux d
  • C++ string数组注意事项

    string xff1a 经实践string数组 xff0c 如string s 10100 xff0c 不能使用s j k 61 这种方法赋值 具体原因未知 求教为什么 xff1f
  • CodeForces - 954C - Matrix Walk

    坑题 题目 xff1a CodeForces 954C 题意 矩阵的每一元素可以用 Ai j 61 y i 1 43 j 来表示 xff0c xff08 就是二维数组用一维指针表示的方法 xff09 xff0c 给你一个路径序列 xff0c
  • Mathjex练习

    u k i 61 a k i k 1 j 61 1 l k j u j i u k i 61
  • 转载:全排列与next_permutation

    转载声明 xff1a 来自https blog csdn net yingyujianmo article details 52046398 感谢作者的讲解 全排列是面试笔试过程中经常遇到的一个问题 对于练习过的同学来说 xff0c 这个问
  • 转载:如何快速转载CSDN中的博客

    转载声明 xff1a 来自https blog csdn net bolu1234 article details 51867099 感谢作者的分享 前言 对于喜欢逛CSDN的人来说 xff0c 看别人的博客确实能够对自己有不小的提高 xf
  • Matlab日记

    Matlab中对clear函数赋值后如何清除变量 xff1f 方法很多 xff0c 一般用 builtin clear b u i l t i n 执 行 内 建 的 函 数 b u i l
  • QT_Windows_命令行下编译,发布

    本文所使用到的资源链接 xff1a 1 所有QT版本镜像下载 2 单文件制作封装工具Engima Virtual Box 环境配置 xff1a 报如下错 xff0c 参考这个 在我这里是因为 xff1a 系统的环境变量的目录中有几个版本不同
  • 容斥原理详解

    翻译 xff1a vici 64 cust 对容斥原理的描述 容斥原理是一种重要的组合数学方法 xff0c 可以让你求解任意大小的集合 xff0c 或者计算复合事件的概率 描述 容斥原理可以描述如下 xff1a 要计算几个集合并集的大小 x
  • 2018ACM/ICPC全国邀请赛(江苏) 总结

    抱憾打铁 整理了一下今天的思路 xff0c 记录如下 开始时我先开的A题 xff0c 我感觉是模拟 xff0c 和lqs讨论了一下 xff0c 感觉会T xff0c 就想其他方法了 开始wjj开的B xff0c 他说感觉是推个公式 xff0
  • HDU 1002 Java大数

    题意很简单输出 a 43 b a 43 b 只不过 a a 和 b b 都很大 xff0c 需要处理大数问题 Java大数解决方法 xff0c 详见代码 xff1a import java io import java util impor
  • broadcom OF-DPA

    https www broadcom com products ethernet connectivity software of dpa http broadcom switch github io of dpa doc html OFD
  • 【论文笔记】Spatial Temporal Graph Convolutional Networks for Skeleton-Based Action Recognition...

    Spatial Temporal Graph Convolutional Networks for Skeleton Based Action Recognition 2018 01 28 15 45 13 研究背景和动机 xff1a 行人
  • Windows下GCC编译环境中文乱码解决方案

    转载声明 xff1a 来自https blog csdn net MyLibs article details 27913281 在编译参数中增加以下两条指令 xff1a fexec charset 61 gbk finput charse
  • C++ 读入优化与输出优化 模板

    来自 xff1a https blog csdn net liyizhixl article details 54412459 简介 C 43 43 是一种神奇的编程语言 自然 xff0c 读入和输出也有着许多种形式 xff1a 如 xff
  • RMQ(range minimum/maximum query)即查询区间最大最小值。

    转载来自 https www cnblogs com yyxayz p 4109390 html 对于求区间最大最小值 xff0c 我们自然而然就想到了一个O xff08 n xff09 时间复杂度的算法 xff0c 但是如果询问有很多呢
  • 数论小知识点总结

    m i 61 1 g c d m i 61 d m d m d i 61 1 m g
  • 牛客国庆集训派对Day1(A C E L)

    链接 xff1a https www nowcoder com acm contest 201 question 牛客国庆集训派对Day1 A Tobaku Mokushiroku Kaiji xff08 水题 xff09 C Utawar
  • 牛客国庆集训派对Day2(A F H)

    链接 xff1a https www nowcoder com acm contest 202 question 牛客国庆集训派对Day2 A 矩阵乘法 xff08 分块 xff09 F 平衡二叉树 xff08 数据结构 xff09 H 卡