牛客小白月赛117

news2025/6/4 16:09:50

前言:solveABCF相对简单,D题思路简单但是实现麻烦,F题郭老师神力b( ̄▽ ̄)。

A. 好字符串

题目大意:给定字符串s,里面的字母必须大小写同时出现。

【解题】:没什么好说的,直接模拟就行。

code:

#include <iostream>
#include <unordered_map>

using namespace std;
int n; string s; 
unordered_map<char, int> mp;

bool check()
{
    for(int i = 0; i < n; i++)
    {
        char ch1 = s[i];
        char ch2;
        if(isupper(ch1))  ch2 = tolower(ch1);
        else ch2 = toupper(ch1);
        if(!mp.count(ch2)) return 0;
    }
    return 1;
}

int main()
{
    cin >> n >> s;
    for(int i = 0; i < n; i++) mp[s[i]]++;
    if(check()) cout << "YES" << endl;
    else cout << "NO" << endl;
    return 0;
}

B. 平均数

题目大意:给定一个由0 1 -1 组成的数组,0代表该元素等于平均数,1代表大于,-1代表小于。

问给出的数组是否合法。

【解题】:合法的情况:

  • 全是0
  • 1 -1 同时出现(不用管次数)

code:

#include <iostream>
#include <unordered_map>

using namespace std;
unordered_map<int, int> mp;
int n;
int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++) 
    {
        int x; cin >> x;
        mp[x]++;
    }
    if((mp.count(-1) && mp.count(1)) || (!mp.count(-1) && !mp.count(1))) cout << "YES" << endl;
    else cout << "NO" << endl;
    return 0;
}

C. 质数

题目大意:对于l到r的数,可以分配到s1,s2两个集合内,集合至少一个元素,且gcd(s1) = 1,gcd(s2) != 1,问|len1 - len2|的最小值。

【解题】:不难发现:如果把连续的偶数给s2可以保证gcd(s2)至少是2,把奇数给s1又保证了gcd(s1) = 1,这样又均分了l,r之间的元素,可以使得|len1 - len2|最小。

code:

#include <iostream>

using namespace std;

typedef long long LL;

int main()
{
    int q; cin >> q;
    while(q--)
    {
        LL l, r; cin >> l >> r;
        LL n = r - l + 1;
        if(n <= 1) cout << -1 << endl;
        else if(n == 2)
        {
            if(l == 1) cout << 0 << endl;
            else cout << -1 << endl;
        }
        else 
        {
            cout << n % 2 << endl;
        }
    }
    return 0;
}

F. 种类数

题目大意:长度为n的数组a,每次操作将所有的ai <-max(0, ai - cnt)其中cnt是a的种类数。问经过多少次操作可以使数组种类数变为1。

【解题】:对于开始种类数是一的情况直接输出0就行,对于开始不是1的情况,由于他们的差值只有再ai变为0的情况下才会改变,所有最终结果是全变为零的操作次数,为此我们不妨每个数只存一遍,我们需要知道第k次操作的种类数,减的总数以及当前数组的最小值。

#include <iostream>
#include <unordered_map>
#include <queue>
#include <vector>
using namespace std;
typedef long long LL;
priority_queue<LL, vector<LL>, greater<LL>> heap;
unordered_map<LL, LL> mp;

int main()
{
    int n; cin >> n;
    for (int i = 1; i <= n; i++)
    {
        LL x; cin >> x;
        mp[x]++;
    }
    if (mp.size() == 1)
    {
        cout << 0 << endl;
        return 0;
    }
    LL k = mp.size();
    LL ans = 0, now = 0;
    for (auto t : mp)
    {
        heap.push(t.first);
    }

    bool flag = false;  // 用于处理0的特殊情况
    while (heap.top() == 0)
    {
        heap.pop();
        flag = true;
    }
    while (heap.size())
    {
        while (heap.size() && now >= heap.top())
        {
            heap.pop();
            if (!flag)
            {
                // 这里0是第一次出现,所以k不能--
                flag = true;
                continue;
            }
            k--;
        }
        if (heap.size())
        {
            LL x = heap.top();
            LL t = (x - now) / k;
            if(t == 0) t++;
            now += t * k;
            ans += t;
        }
    }
    cout << ans << endl;
    return 0;
}

D. 众数

题目大意:给定长度为n的数组a,必须执行下面操作一次:

选择两个不同位置i,j使得ai=ai + 1, aj=aj - 1,问众数出现的所有可能。

【解题】:本题的题眼其实是数据范围,它只有1e3所有我们是可以设计一个n^2或者n^2logn的算法的,n^2其实停留在枚举所有的ij上,所有我们只能用O(1) or O(logn)的时间找出每次ij的众数,这样就需要维护一个内部有序的数据结构,我们借助set维护。

code:

#include <iostream>
#include <set>
#include <map>
#include <algorithm>
using namespace std;

const int M = 1e6 + 1, N = 2e3 + 10;

int a[N];
struct node
{
    int num, cnt;
    bool operator< (const node& b) const
    {
        if (cnt != b.cnt) return cnt < b.cnt;
        return num < b.num;
    }
};
map<int, int> mp;
set<node> tmp;
set<int> ans;
int cnt[M];

void add(int val)
{
    auto it = tmp.lower_bound({ val, cnt[val] });
    cnt[val]++;
    if (it->num == val)
    {
        tmp.erase(it); // 需要重新插入,不能直接--
        tmp.insert({ val, cnt[val] });
    }
    else // 第一次出现
    {
        tmp.insert({ val, 1 });
    }
}

void del(int val)
{
    
    auto it = tmp.lower_bound({ val, cnt[val] });
    cnt[val]--;
    tmp.erase(it);
    if (cnt[val] >= 1) // 还存在
    {
        tmp.insert({ val, cnt[val] });
    }
}

int main()
{
    int n; cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        add(a[i]);
    }
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            if (i == j) continue;
            del(a[i]);
            add(a[i] + 1);
            del(a[j]);
            add(a[j] - 1);
            ans.insert(tmp.rbegin()->num);
            add(a[i]);
            del(a[i] + 1);
            add(a[j]);
            del(a[j] - 1);
        }
    }
    for (auto it = ans.begin(); it != ans.end(); it++) cout << *it << " ";
    return 0;
}

G. 中位数

题目大意:对于长度为n的排列,求下面式子对于所有n的排列的累乘对1610612741取模后的结果。

【解题】:组合数学 + 贡献法转化枚举对象

code:

#include <iostream>
#include <vector>
using namespace std;
typedef long long LL;
#define endl '\n'
const int N = 6e3 + 10;
const int MOD = 1610612741;
const int PM = MOD - 1;
typedef pair<LL, LL> PII;
LL fac_len[N];
LL gac_glen[N];
LL f[N];
int n; 
LL C[N][N];

LL qpow(LL a, LL b, LL MOD)
{
	LL ret = 1;
	while(b)
	{
		if(b & 1) ret = ret * a % MOD;
		b >>= 1;
		a = a * a % MOD;
	}
	return ret;
}

void init()
{
	fac_len[0] = 1;
	for(int i = 1; i <= n; i++) fac_len[i] = fac_len[i - 1] * i % PM;
	// vector<LL, vector<LL>> C(n + 1, vector<LL>(n + 1));
	for(int i = 0; i <= n; i++)
	{
		C[i][0] = 1;
		for(int j = 1; j <= i; j++)
		{
			C[i][j] =(C[i - 1][j] + C[i - 1][j - 1]) % PM;
		}
	}
	for(int mid = 1; mid <= n; mid++)
	{
		for(int len = 1; len <= n; len++)
		{
			// if(len % 2 == 1) f[mid] = (f[mid] + (C[mid - 1][len / 2] * C[n - mid][len / 2] % PM * fac_len[len] % PM * fac_len[n - len] % PM * (n - len + 1) % PM)) % PM;
			f[mid] = (f[mid] + (C[mid - 1][len / 2] * C[n - mid][len - (len / 2) - 1] % PM * fac_len[len] % PM * fac_len[n - len] % PM * (n - len + 1) % PM)) % PM;
		}
	}	
}

void solve() 
{
    cin >> n;
	init();
	LL ans = 1;
	// for(int i = 0;i <= n; i++) cout << gac_glen[i] << " ";
	for(int mid = 1; mid <= n; mid++)
	{
		ans = (ans * qpow(mid, f[mid], MOD)) % MOD;
	}
	cout << ans << endl;
}

int main()
{
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int T = 1;
	// cin >> T;
	while(T--)
	{
        solve();
	}
	return 0;
}

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

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

相关文章

美化显示GDB调试的数据结构

笔者在前面的博文记一次pdf转Word的技术经历中有使用到mupdf库&#xff0c;该库是使用C语言写的一个操作PDF文件的库&#xff0c;同时提供了Python接口&#xff0c;Java接口和JavaScript接口。 在使用该库时&#xff0c;如果想要更高的性能&#xff0c;使用C语言接口是不二的选…

一篇学习CSS的笔记

一、简介 Cascading Style Sheets简称CSS&#xff0c;中文翻译为层叠样式表。当HTML被发明出来初期&#xff0c;不同的浏览器提供了各种各样的样式语言给用户控制网页的效果&#xff0c;HTML包含的显示属性并不是很多。但是随着各种使用者对HTML的需求&#xff0c;HTML添加了大…

StarRocks x Iceberg:云原生湖仓分析技术揭秘与最佳实践

导读&#xff1a; 本文将深入探讨基于 StarRocks 和 Iceberg 构建的云原生湖仓分析技术&#xff0c;详细解析两者结合如何实现高效的查询性能优化。内容涵盖 StarRocks Lakehouse 架构、与 Iceberg 的性能协同、最佳实践应用以及未来的发展规划&#xff0c;为您提供全面的技术解…

笔试笔记(运维)

&#xff08;数据库&#xff0c;SQL&#xff09; limit1 随机返回其中一个聚合函数不可以嵌套使用 【^】这个里面的数据任何形式组合都没有 sql常用语句顺序&#xff1a;from-->where-->group by-->having-->select-->order by-->limit 只要其中一个表存在匹…

使用langchain实现五种分块策略:语义分块、父文档分块、递归分块、特殊格式、固定长度分块

文章目录 分块策略详解1. 固定长度拆分&#xff08;简单粗暴&#xff09;2. 递归字符拆分&#xff08;智能切割&#xff09;3. 特殊格式拆分&#xff08;定向打击&#xff09;Markdown分块 4. 语义分割&#xff08;更智能切割&#xff09;基于Embedding的语义分块基于模型的端到…

【项目记录】登录认证(下)

1 过滤器 Filter 刚才通过浏览器的开发者工具&#xff0c;可以看到在后续的请求当中&#xff0c;都会在请求头中携带JWT令牌到服务端&#xff0c;而服务端需要统一拦截所有的请求&#xff0c;从而判断是否携带的有合法的JWT令牌。 那怎么样来统一拦截到所有的请求校验令牌的有…

linux文件管理(补充)

1、查看文件命令 1.1 cat 用于连接文件并打印到标准输出设备上&#xff0c;它的主要作用是用于查看和连接文件。 用法&#xff1a; cat 参数 文件名 参数&#xff1a; -n&#xff1a;显示行号&#xff0c;会在输出的每一行前加上行号。 -b&#xff1a;显示行号&#xff0c;…

Python训练营---Day42

DAY 42 Grad-CAM与Hook函数 知识点回顾 回调函数lambda函数hook函数的模块钩子和张量钩子Grad-CAM的示例 作业&#xff1a;理解下今天的代码即可 1、回调函数 回调函数&#xff08;Callback Function&#xff09;是一种特殊的函数&#xff0c;它作为参数传递给另一个函数&#…

基于空天地一体化网络的通信系统matlab性能分析

目录 1.引言 2.算法仿真效果演示 3.数据集格式或算法参数简介 4.MATLAB核心程序 5.算法涉及理论知识概要 5.1 QPSK调制原理 5.2 空天地一体化网络信道模型 5.3 空天地一体化网络信道特性 6.参考文献 7.完整算法代码文件获得 1.引言 空天地一体化网络是一种将卫星通信…

c++ opencv 形态学操作腐蚀和膨胀

https://www.jb51.net/article/247894.htm(上图图片来自这个博客) https://codec.wang/docs/opencv/basic/erode-and-dilate&#xff08;上图图片参考博客&#xff09; cv::Mat kernel cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3)); cv::erode(src, dst, kern…

【c++】【数据结构】红黑树

目录 红黑树的定义红黑树的部分模拟实现颜色的向上更新旋转算法单旋算法双旋算法 红黑树与AVL树的对比 红黑树的定义 红黑树是一种自平衡的二叉搜索树&#xff0c;通过特定的规则维持树的平衡。红黑树在每个结点上都增加一个存储位表示结点的颜色&#xff0c;结点的颜色可以是…

基于SpringBoot+Redis实现RabbitMQ幂等性设计,解决MQ重复消费问题

解决MQ重复消费问题 一、实现方案 本方案参考 「RabbitMQ消息可靠性深度解析&#xff5c;从零构建高可靠消息系统的实战指南」&#xff0c;向开源致敬&#xff01; 1、业务层幂等处理&#xff1a; 每个消息携带一个全局唯一ID&#xff0c;在业务处理过程中&#xff0c;首先检查…

使用lighttpd和开发板进行交互

文章目录 &#x1f9e0; 一、Lighttpd 与开发板的交互原理1. 什么是 Lighttpd&#xff1f;2. 与开发板交互的方式&#xff1f; &#x1f9fe; 二、lighttpd.conf 配置文件讲解⚠️ 注意事项&#xff1a; &#x1f4c1; 三、目录结构说明&#x1f4a1; 四、使用 C 编写 CGI 脚本…

DRF的使用

1. DRF概述 DRF即django rest framework&#xff0c;是一个基于Django的Web API框架&#xff0c;专门用于构建RESTful API接口。DRF的核心特点包括&#xff1a; 序列化&#xff1a;通过序列化工具&#xff0c;DRF能够轻松地将Django模型转换为JSON格式&#xff0c;也可以将JS…

2024年09月 C/C++(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C++编程(1~8级)全部真题・点这里 第1题:有几个PAT 字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位,第 4 位(A),第 6 位(T);第二个 PAT 是第 3 位,第 4 位(A),第 6 位(T)。 现给定字符串,问一共可以形成多少个 PAT? 时间限制:1000 内存限制:26214…

免费且好用的PDF水印添加工具

软件介绍 琥珀扫描.zip下载链接&#xff1a;https://pan.quark.cn/s/3a8f432b29aa 今天要给大家推荐一款超实用的PDF添加水印工具&#xff0c;它能够满足用户给PDF文件添加水印的需求&#xff0c;而且完全免费。 这款PDF添加水印的软件有着简洁的界面&#xff0c;操作简便&a…

mqtt协议连接阿里云平台

首先现在的阿里云物联网平台已经不在新购了&#xff0c;如下图所示&#xff1a; 解决办法&#xff1a;在咸鱼上租用一个账号&#xff0c;先用起来。 搭建阿里云平台&#xff0c;参考博客&#xff1a; &#xff08;一&#xff09;MQTT连接阿里云物联网平台&#xff08;小白向&…

一文详谈Linux中的时间管理和定时器编程

&#xff08;目录&#xff09; 先说一些在计算机中需要用到时间的地方&#xff1a;系统日志log、OS调度(时间片、定时器)等等~~ 时间的计量 计时的方式发展&#xff1a;日晷、沙漏 -> 机械钟 -> 石英振荡器、晶振 -> 铯原子钟 -> 氢原子钟 计算机中的计时方式&…

性能优化 - 理论篇:常见指标及切入点

文章目录 引言一、 Java 性能优化的核心思路二、为什么要度量&#xff1f;三、常用性能衡量指标详解3.1 吞吐量与响应速度3.2 响应时间的具体度量&#xff1a;平均响应时间与百分位数3.3 并发量3.4 秒开率&#xff08;页面秒开&#xff09;3.5 正确性&#xff08;功能可用性&am…

【论文阅读 | PR 2024 |ICAFusion:迭代交叉注意力引导的多光谱目标检测特征融合】

论文阅读 | PR 2024 |ICAFusion&#xff1a;迭代交叉注意力引导的多光谱目标检测特征融合 1.摘要&&引言2.方法2.1 架构2.2 双模态特征融合&#xff08;DMFF&#xff09;2.2.1 跨模态特征增强&#xff08;CFE&#xff09;2.2.2 空间特征压缩&#xff08;SFS&#xff09;…