牛客周赛 Round 59(思维、构造、数论)

news2024/12/23 14:45:17

文章目录

  • 牛客周赛 Round 59(思维、构造、数论)
    • A. TD
    • B. 你好,这里是牛客竞赛
    • C. 逆序数(思维)
    • D. 构造mex(构造)
    • E. 小红的X型矩阵
    • F. 小红的数组回文值(数论、范德蒙恒等式)

牛客周赛 Round 59(思维、构造、数论)


E题,对于对角线的处理,常用。

F题,范德蒙恒等式推论的应用。


A. TD

简单数学题。

#include<bits/stdc++.h>

using namespace std;

int main(){
	
	double n, m;
	cin >> n >> m;
	
	double res = n / m;
	printf("%.10lf", res); // 注意精度
	
	return 0;
}

B. 你好,这里是牛客竞赛

判断四个模式串是否为输入字符串的前缀即可。

#include<bits/stdc++.h>

using namespace std;

bool is_prefix(const string& A, const string& B){	// 判断B是否为A的前缀
	return A.find(B) == 0;		// str.find() 返回首次匹配的下标,没找到返回str.npos
}

int main(){
	
	map<string, string> mp;
	mp["https://www.nowcoder.com"] = "Nowcoder";
	mp["www.nowcoder.com"] = "Nowcoder";
	mp["https://ac.nowcoder.com"] = "Ac";
	mp["ac.nowcoder.com"] = "Ac";
	
	int ncase;
	cin >> ncase;
	while(ncase--){
		string s;
		cin >> s;
		int is_find = 0;
		for(auto x : mp){
			if(is_prefix(s, x.first)){
				is_find = 1;
				cout << x.second << endl;
				break; 
			}
		}
		if(!is_find) cout << "No" << endl;
	}
	
	return 0;
}

C. 逆序数(思维)

通过简单思考,一个序列A,任选两个元素,共有 |A| * (|A|-1)/ 2 种选择。(|A| 表示A序列中元素的个数)

对于任选的Ai 和 Aj,要么其在 A 中为逆序对,要么在 A’ 中为逆序对。(设A序列的逆序序列为A’)

综上,A 和 A’ 中逆序对的和为 |A| * (|A|-1)/ 2。

在已知A的逆序对个数和元素个数时,可以计算出A’ 中逆序对的个数。

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


int main(){
	
	ll n, k;
	cin >> n >> k;
	ll res = n * (n-1) / 2 - k; // 注意数据范围
	cout << res << endl;
	
	return 0;
}

D. 构造mex(构造)

一点点细节的构造题。

根据 k 与 n 的大小关系进行了分类,具体看代码吧。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
 
void print_yes(int k, int is_end){
    cout << "YES" << endl;
    for(int i = 0; i < k; i++){
        cout << (i == 0 ? "" : " ") << i;
    }
    if(is_end) cout << "\n";
}
 
int main(){
     
    int ncase;
    cin >> ncase;
     
    while(ncase--){
        ll s, n, k;
        cin >> s >> n >> k;
        if(k == 0){
            if(s >= n){
                cout << "YES" << endl; 
                int sum = s - n;
                for(int i = 1; i < n; i++) cout << "1 ";
                cout << sum + 1 << endl;
            }
            else cout << "NO" << endl;
        }
        else if(k == 1 && s == 1) cout << "NO" << endl;
        else if(k > n) cout << "NO" << endl;
        else if(k == n){
            ll sum = k * (k-1) / 2;
            if(sum == s) print_yes(k, 1);
            else cout << "NO" << endl;
        }
        else if(k+1 == n){
            ll sum = k * (k-1) / 2;
            if(sum + k != s && s >= sum){
                print_yes(k, 0);
                cout << " " << s - sum << endl;
            }
            else cout << "NO" << endl;
        }
        else {	// 这是一种普遍的构造方法,上边的分类,均为当前分支不适配的特殊情况。
            ll sum = k * (k-1) / 2;
            if(sum > s) cout << "NO" << endl;
            else if(sum + k != s){
                print_yes(k, 0);
                cout << " " << s - sum;
                for(int i = k+2; i <= n; i++) cout << " " << 0;
                cout << endl;
            }
            else{
                print_yes(k, 0);
                cout << " " << s - sum - 1 << " 1";
                for(int i = k+3; i <= n; i++) cout << " " << 0;
                cout << endl;
            }
        }
    }
     
    return 0;
}

E. 小红的X型矩阵

操作二等价于:可以在保证元素相对位置的基础上,把任意点放在矩阵中间。

X形矩阵的形状与 n 的奇偶有关。

  • 主对角线:左上到右下;副对角线:右上到左下。

  • 任意点(x, y) 所在的主对角线上的点都满足:(x-y+n) % n

  • 任意点(x, y) 所在的福对角线上的点都满足:(x+y) % n

当 n为奇数时,任意点(x,y)需要的操作一的数量为:对角线上 0 的个数 + (全部 1 的个数为 X - 对角线上 1 的个数)

当 n为偶数时,任意点(x,y)需要的操作一的数量为:对角线上 0 的个数 + (全部 1 的个数为 X - 对角线上 1 的个数)

#include<bits/stdc++.h>

using namespace std;

const int maxn = 1005;
int a[maxn][maxn];
int z[maxn], f[maxn];

int main(){
	
	int n;
	cin >> n;
	int sum_1 = 0;
	for(int i = 0; i < n; i++){
		for(int j = 0; j < n; j++){
			cin >> a[i][j];
			z[(i-j+n)%n] += a[i][j];	 // 主对角线 1的个数 
			f[(i+j)%n] += a[i][j];  	 // 副对角线 1的个数 
			sum_1 += a[i][j];
		}
	}
	
	int res = n * n;
	for(int i = 0; i < n; i++){
		for(int j = 0; j < n; j++){
			int pos_z = (i-j+n) % n, pos_f = (i+j) % n, tmp, d_0, d_1;
			if(n % 2 == 0){
				pos_f = (pos_f + 1) % n; 			// 偶数时,副对角线下移一格 
				d_1 = z[pos_z] + f[pos_f];			// 对角线上 1 的个数 
				d_0 = 2*n - d_1;	// 对角线上 0 的个数 
			}
			else{
				// 如果是奇数,(i,j) 会被重复统计
				d_1 = z[pos_z] + f[pos_f] - a[i][j];
				d_0 = 2*n-1 - d_1;
			}
			tmp = d_0 + (sum_1 - d_1);
			res = min(res, tmp); 
//			cout << i << " " << j << " " << res << " " << tmp << endl;
		}
	}
	cout << res << endl;
	
	return 0;
}


/*

	0 1 2 3 4
0	0 4 3 2 1 
1	1 0 4 3 2
2	2 1 0 4 3
3	3 2 1 0 4
4	4 3 2 1 0


*/

F. 小红的数组回文值(数论、范德蒙恒等式)

思路不是很复杂,任选两个元素 ai 与 aj ,考虑这两个元素对答案的贡献。

  • 当 ai == aj 时,不需要操作,贡献为零。

  • 当 ai != aj 时,需要操作,贡献为 ai 与 aj 在对称位置的子序列的个数

在这里插入图片描述

如上图,要保证 ai 与 aj 在对称位置,集合A和集合C贡献的元素个数必须相等。集合B对对称性没有影响 ,可自行枚举。

  • 集合B对子序列个数的贡献为 2|B|,其中 |B| 表示集合B中元素的个数。

  • 集合A和集合C对子序列个数的贡献为 ∑ i = 0 m i n ( ∣ A ∣ , ∣ C ∣ ) C ( i , ∣ A ∣ ) ∗ C ( i , ∣ C ∣ ) \sum_{i=0}^{min(|A|, |C|)} {C(i,|A|) * C(i, |C|)} i=0min(A,C)C(i,A)C(i,C)

综上,ai 与 aj 在对称位置的子序列的个数 = 2|B| * ∑ i = 0 m i n ( ∣ A ∣ , ∣ C ∣ ) C ( i , ∣ A ∣ ) ∗ C ( i , ∣ C ∣ ) \sum_{i=0}^{min(|A|, |C|)} {C(i,|A|) * C(i, |C|)} i=0min(A,C)C(i,A)C(i,C) 。枚举所有的 ai 与 aj 的组合,求和即可得出答案。

但是,在枚举时,会发现时间复杂度是O(n^3), 需要优化 ∑ i = 0 m i n ( ∣ A ∣ , ∣ C ∣ ) C ( i , ∣ A ∣ ) ∗ C ( i , ∣ C ∣ ) \sum_{i=0}^{min(|A|, |C|)} {C(i,|A|) * C(i, |C|)} i=0min(A,C)C(i,A)C(i,C),这里就需要用到范德蒙恒等式

范德蒙恒等式推论: ∑ i = 0 m i n ( ∣ A ∣ , ∣ C ∣ ) C ( i , ∣ A ∣ ) ∗ C ( i , ∣ C ∣ ) = C ( m i n ( ∣ A ∣ , ∣ C ∣ ) , ∣ A ∣ + ∣ C ∣ ) \sum_{i=0}^{min(|A|, |C|)} {C(i,|A|) * C(i, |C|)} = C(min(|A|, |C|), |A| + |C|) i=0min(A,C)C(i,A)C(i,C)=C(min(A,C),A+C)

给一个学习的博客:范德蒙德卷积 - Gensokyo Algorithm Research Institute (enonya.github.io)

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

const int maxn = 2000 + 10;
const ll mod = 1e9 + 7;

ll C[maxn][maxn], P[maxn][maxn];
ll p[maxn];
int a[maxn];

void init(){
	// 预处理组合数
	C[0][0] = 1;
	for(int i = 1; i < maxn; i++){
		for(int j = 0; j <= i; j++){
			C[i][j] = C[i-1][j];
			if(j-1 >= 0) C[i][j] += C[i-1][j-1];
			C[i][j] %= mod;
		}
	}
	// 预处理2的整次幂
	p[0] = 1;
	for(int i = 1; i <= 2000; i++) p[i] = p[i-1] * 2 % mod;
}

ll f(int a, int b){ // 当时一个愚蠢的写法,忽略掉这个函数名
	if(a > b) swap(a, b);
	return C[a+b][a];
}

int main(){
	
	init();
	
	int n;
	cin >> n;
	for(int i = 1; i <= n; i++) cin >> a[i];
	
	ll res = 0;
	for(int i = 1; i <= n; i++){
		for(int j = i+1; j <= n; j++){
			if(a[i] != a[j]){
				res += f(i-1, n-j) * p[j-i-1] % mod;
				res %= mod;				
			}
		}
	}
	
	cout << res << endl;
	
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2145138.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++之仿函数和虚函数

仿函数&#xff08;Functor&#xff09;和虚函数&#xff08;Virtual Function&#xff09;是 C 中两个不同的概念&#xff0c;它们在功能和使用场景上有显著的区别。 1. 仿函数&#xff08;Functor&#xff09; 定义&#xff1a; 仿函数&#xff08;也称为函数对象&#xf…

【原理图PCB专题】案例:原理图设计检查为什么要检查全局网络?

本案例发生在新人的PCB设计文件中,当然就算硬件老人们,其实只要不注意也很容易出现这种全局网络乱用的问题。 如下所示是给新人的接口参考图纸,要求使用嘉立创绘制16个相同的接口做一个工装板。同时还要增加单片机实现切换控制功能。可以看到座子的24个管脚中使用到了3.3V、…

五种MP3转换器推荐,音频转换不发愁!

每当遇到心仪的歌曲或珍贵的音频资料&#xff0c;却因为格式不兼容而无法在所有设备上顺畅播放时&#xff0c;是否感到一丝遗憾&#xff1f;现在&#xff0c;是时候告别这种烦恼了&#xff01;分享五种功能强大、操作简便的MP3转换器&#xff0c;从此音频转换不发愁&#xff01…

MySQL字符集的转换

背景介绍 在使用MySQL过程中&#xff0c;如果字符集配置不当&#xff0c;可能会出现插入失败、数据乱码、 索引失效、数据丢失、查询不到期望结果等一系列使用异常的情况。因此&#xff0c;熟练掌握MySQL字符集和比较规则的配置方法&#xff0c;并在此基础上了解MySQL字符集与…

AI编程的特点及SCSAI平台在AI编程方面的一些思路

团长团 AI智造AI编程 2024年09月18日 18:25 北京 说先来看看AI编程的优缺点&#xff0c;然后我们再看看SCSAI在AI编程方面的一些可能选择 使用AI编程的优点 ‌AI编程的优点包括提升编程效率、降低编程门槛、优化程序结构、加强软件可靠性、促进跨领域融合&#xff0c;而缺点则…

龙海家园的免费停车点探寻

​第一次去龙海家园就把我羡慕到了&#xff0c;楼下就是鲤鱼门地铁&#xff0c;龙海家园底商的餐饮好吃又实惠&#xff0c;还有特别多的超市&#xff0c;空中花园也很大&#xff0c;还可以共享前海基金小镇的花园环境。虽然我看到很多车排队等进龙海家园&#xff0c;但是我还是…

红帽 Quay- 配置镜像代理缓存

《OpenShift / RHEL / DevSecOps 汇总目录》 说明&#xff1a;本文已经在 Quay 3.12 环境中验证 说明&#xff1a;可先根据《红帽 Quay - 安装篇》完成 Quay 安装。 镜像代理缓存功能 Quay 的镜像代理缓存功能可以将用户拉取的远程镜像保存到本地 Quay 的 proxy cache 中&am…

阿里巴巴搜索API返回值:电商市场竞争的新武器含

阿里巴巴搜索API返回值在电商市场竞争中扮演着至关重要的角色&#xff0c;它为企业提供了深入了解市场、分析竞争对手的宝贵资源。以下是对阿里巴巴搜索API返回值及其在电商市场竞争中应用的详细解析&#xff0c;并附上示例代码。 一、阿里巴巴搜索API返回值概述 阿里巴巴搜索…

微波无源器件 功分器3 一种用于多端口辐射单元的紧凑四路双极化正交模功分器的设计

摘要&#xff1a; 一种有着双极化能力并且能作为一个Fabry-Perot谐振腔天线的馈源包含四个输入端口的新型紧凑功分器的概念和设计被提出了。在四个圆波导中的双同相极化通过使用四个5端口十字转门结合两个8by1&#xff08;八合一&#xff09; 功分网络。功分器末端接了两个端口…

排序----数据结构

Comparable Integer Double 默认情况下都是按照升序排列的 string 按照字母再ASCII码表中对应的数字升序进行排列 冒泡排序 时间复杂度O(x^2) 选择排序 时间复杂度O(x^2) 插入排序 时间复杂度O(x^2) 希尔排序 时间复杂度O(x) 归并排序 时间复杂度O(nlogn) 快速排序

一文搞定WeakHashMap

写在前面 在缓存场景下&#xff0c;由于内存是有限的&#xff0c;不能缓存所有对象&#xff0c;因此就需要一定的删除机制&#xff0c;淘汰掉一些对象。这个时候可能很快就想到了各种Cache数据过期策略&#xff0c;目前也有一些优秀的包提供了功能丰富的Cache&#xff0c;比如…

Pandas的入门操作-Series对象

Pandas的数据结构 Series对象 class pandas.Series(dataNone, indexNone) data参数 含义&#xff1a;data是Series构造函数中最主要的参数&#xff0c;它用来指定要存储在Series中的数据。 数据类型&#xff1a;data可以是多种数据类型&#xff0c;例如&#xff1a; Python 列…

JAVA基础,利用for循环找水仙花个数

public class learn2 {public static void main(String[] args) {int count 0;//定义水仙花的个数for (int i 100; i<999; i){int g i%10;int s i/10%10;int b i/100%10;if (i b*b*b s*s*s g*g*g){count1;System.out.println(i);}}System.out.println("一共有"…

LeetCode-137. 只出现一次的数字 II【位运算 数组】

LeetCode-137. 只出现一次的数字 II【位运算 数组】 题目描述&#xff1a;解题思路一&#xff1a;解题思路二&#xff1a;符号位一起判断。背诵版解题思路三&#xff1a;0 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;除某个元素仅出现 一次 外&#xff0c;其余每…

渗透测试综合靶场 DC-2 通关详解

一、准备阶段 准备工具如Kali Linux&#xff0c;下载并设置DC-2靶场机。确保攻击机和靶机在同一网络段&#xff0c;通常设置为桥接模式或NAT模式。 1.1 靶机描述 Much like DC-1, DC-2 is another purposely built vulnerable lab for the purpose of gaining experience in …

GIS OGC之WMTS地图服务,通过Capabilities XML描述文档,获取matrixIds,origin,计算resolutions

GIS OGC之WMTS地图服务&#xff0c;通过Capabilities XML描述文档&#xff0c;获取matrixIds&#xff0c;origin&#xff0c;计算resolutions 需求&#xff1a;如何根据WMTS服务的Capabilities描述文档得到&#xff0c;openlayers调用wmts服务时的matrixIds&#xff0c;origin…

spring security 手机号 短信验证码认证、验证码认证 替换默认的用户名密码认证132

spring security内置的有用户名密码认证规则&#xff0c;还可以调用第三方微信、qq登录接口实现登录认证&#xff0c;这里使用自定义的手机号和短信验证码实现登录认证。 要实现自定义的手机号和短信验证码认证需要了解用户名密码认证的逻辑&#xff0c;仿照该逻辑就可以写出…

心觉:成功学就像一把刀,有什么作用关键在于使用者(一)

Hi&#xff0c;我是心觉&#xff0c;与你一起玩转潜意识、脑波音乐和吸引力法则&#xff0c;轻松掌控自己的人生&#xff01; 挑战每日一省写作173/1000天 很多人觉得成功学是鸡汤&#xff0c;是没用的&#xff0c;甚至是骗人的 我先保持中立&#xff0c;不知道对不对 我们先…

实习项目|苍穹外卖|day11

Apache ECharts 前端技术。 营业额统计 还是比较简单的。 用户统计 订单统计 以上所有需求。难点在于对时间类的处理&#xff1a; // 接收格式 GetMapping("/turnoverStatistics")ApiOperation("营业额统计")public Result<TurnoverReportVO>…

游戏开发引擎__游戏场景(灯光,摄像机)

1.灯光 重要参数介绍 类型: 控制灯光的类型&#xff0c;有“定向”“点”“区域”和“聚光”4种模式。颜色: 控制灯光的颜色。模式: 控制灯光的光照模式&#xff0c;有“实时”“混合”和“烘焙”3种模式。强度: 控制灯光的明亮程度。间接乘数: 改变间接光的强度。阴影类型: …