备战蓝桥杯---牛客寒假基础训练营补题1

news2024/11/15 11:08:53

1.第二类斯特林数:

2^n-1就是n个1的二进制,因为每一个&为0,所以我们可以把问题等价于n个1(不同的球)的串分配给m个非空的盒子,求方案数,这就转化成了第二类斯特林数。

我们令s(n,m)表示n个不同的球分配给m个相同非空的盒子。我们考虑s(n+1,m),如果n个元素构成了m-1,那么第n+1个单独构成一个集合。如果n个元素构成了m,那么第n+1个随便放。

因此,s(n+1,m)=s(n,m-1)+m*s(n,m).

如何求通项公分式?

我们考虑带标号的盒子:

令Xi表示第i个子集为空(其他不知道)的方案数:

下面就是求第二类斯特林数的模板题,下面是AC代码(当模板):

#include<bits/stdc++.h>
#define endl '\n'
#define int signed long long
#define double long double
using namespace std;
int N=2e5+10;
int mod=1e9+7;
vector<int> nxt(N);
int qpow(int n,int x)//快速幂
{
    int num=1;
    while(x)
    {
        if(x&1)
        {
            num=num*n%mod;
        }
        n=n*n%mod;
        x>>=1;
    }
    return num;
}
void solve()
{
    int n,m;
    cin >> n >> m;
    if(m>n)
    {
        cout << 0 << endl;
        return;
    }
    int ans=0;
    nxt[0]=1;
    for(int i=1;i<=m;i++) nxt[i]=nxt[i-1]*i%mod;//求阶乘
    for(int i=0;i<=m;i++)
    {
    ans=(ans+qpow(-1,m-i)*qpow(i,n)%mod*qpow(nxt[i],mod-2)%mod*qpow(nxt[m-i],mod-2)%mod+mod)%mod;//m的阶乘抵消了
    }
    cout << ans << endl;
}
signed main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    solve();
    return 0;
}

2.枚举:

我们不妨对m的每一位二进制分析一下,假如第x位为1,那么我们选的时候在x为0,x的高位上要是它的子集,而其低位可以随便选,这样的w就是可以的并且不会产生影响,于是我们枚举x即可。

注意,我们需要对自己特判一下,下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
long long t,n,m,v[100010],w[100010];
long long ans;
void calc(long long x){
    long long res=0;
    for(int i=1;i<=n;i++){
        if((x&w[i])==w[i]) res+=v[i];
    }
    ans=max(res,ans);
}
void solve(){
    cin>>n>>m;
    ans=0;
    for(int i=1;i<=n;i++) cin>>v[i]>>w[i];
    for(int i=30;i>=0;i--){
        if((m>>i)&1){
           calc(((1<<i)-1)|(m^(1<<i)));
        }
    }
    calc(m);
    cout<<ans;
}
int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    cin>>t;
    while(t--){
        solve();
        cout<<endl;
    }
}

3.基环内向树+搜索:

对于每一个ai,可以看成从连到ai,当i确定了,那么ai自然也确定了,同时,我们发现一共n条边,每一个点的出度一定为1,于是就形成了多个有一个环+几个分支形状的联通块,对于分支我们不用考虑,因为当环确定了分支自然也定了,而我们以一点为起点从A---E枚举,看看这个环的逻辑关系是否成立,然后把每一个联通块的数量相乘即可,下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,x,cnt;
int mod = 998244353;
string s[100010];
int vis[100010];
int edge[100010];
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++) cin>>edge[i]>>s[i];
    long long ans=1;
    for(int i=1;i<=n;i++){
       int j=i;
        while(vis[j]==0){
            vis[j]=i;
            j=edge[j];
        }
        if(vis[j]==i){
            long long sum=0;
            int k=j;
            int len=0;
             do{
                len++;
                k=edge[k];
            }while(k!=j);
            for(int x=0;x<5;x++){
                int v=x;
                for(int y=0;y<len;y++){
                    v=s[k][v]-'A';
                    k=edge[k];
                }
                sum+=(v==x);
            }
            ans=ans*sum%mod;
        }
    }
    cout<<ans;
}

在实现过程中,我们遍历一个联通块时可能不包含一个分支,而当我们走到它时,因为vis[j]!=i,于是就巧妙地消除了他的影响,同时,因为都一一确定,我们可以先把数求出来,然后再遍历,这样写比较直观简单。

4.暴力枚举:

注意到m的范围,我们可以知道绝对值>=2的最多30个,我们可以直接枚举,看上去n^2,但实际上因为check有很大部分远小于n,导致也可以过。

当n>30时,一定有-1/1,我们去枚举那个是1/-1.

当n<30时,不存在两个数都>1000,我们直接枚举即可

#include<bits/stdc++.h>
using namespace std;
int q,n,m,a[100010];
bool cmp(int a,int b){
    return a<b;
}
set<int> s={0};
bool check(int x){
     long long res = 1;
    for(int i = 1; i<=n; ++i){
        res *= a[i] + x;
        if(abs(res) >1000000000) return 0;
    }
    s.insert(res);
    return 1;
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n>>q;
    for(int i=1;i<=n;i++) cin>>a[i];
    sort(a+1,a+n+1,cmp);
    if(n>30){
        for(int i=1;i<=n;i++){
        if(a[i]==a[i-1]) continue;
        check(-a[i]-1);
        check(-a[i]+1);
    }
    }
    else{
        for(int i=1;i<=n;i++){
        if(a[i]==a[i-1]) continue;
        for(int l = - a[i] - 1; check(l);l-- );
        for(int r = - a[i] + 1; check(r);r++ );
    }
    }

    for(int i=1;i<=q;i++){
        cin>>m;
        cout << (s.count(m)?"Yes":"No") <<'\n';
    }
}

5.二分+贪心

我们先二分一个值然后check.

那么我们如何check呢?

假如一个点在an,我们从后往前找第一个j使j+1--n的点到他的距离<=d,我们在从它向前找即可。如果可以到1就可以,到0的话就不行。

下面是贪心的正确性证明(参考某大佬):

我们令mx记录j+1--i的位置max的点,mi为j+1--imin的点,如果当一个人确定后,另一个人的最后一个在j+1后,那么一定有个位置不符合,而如果我们从后往前找第一个j并选时,此时的范围从[mx-d,mi+d]变成了[aj-d,aj+d],范围扩大了,此时前面可以选的范围就更大了,因此,我们可以保证正确的步骤一定可以被选到(若不选的话前面原本要选的可能因为范围限制而不能选)

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,x,y;
int a[100010];
bool check(int d){
    int tn=n;
    while(tn>1){
        int mx=a[tn],mi=a[tn];
        for(int i=tn-1;i>=0;i--){
            if(i==0) return 0;
            if(abs(a[i]-mx)<=d&&abs(a[i]-mi)<=d){
                tn=i;
                break;
            }
            mx=max(mx,a[i]);
            mi=min(mi,a[i]);
        }
    }
    return 1;
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n>>x>>y;
    a[1]=x;
    a[2]=y;
    n+=2;
    for(int i=3;i<=n;i++) cin>>a[i];
    int l=abs(x-y),r=1e9;
    while(l<r){
        int mid=(l+r)/2;
        if(check(mid)) r=mid;
        else l=mid+1;
    }
    cout<<l;
}

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

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

相关文章

安装Docker的过程?

Docker Desktop概述 Docker Desktop是适用于Mac、Linux或Windows环境的一键安装应用程序&#xff0c;允许您构建、共享和运行容器化应用程序和微服务。 它提供了一个简单的GUI&#xff08;图形用户界面&#xff09;&#xff0c;允许您直接从机器管理容器、应用程序和图像。您可…

png和jpg哪个清晰?它们之间怎么互相转换?

在数字图像处理领域&#xff0c;PNG和JPG是两种备受欢迎的图像格式。这两种格式各自拥有独特的特点&#xff0c;而对于许多用户而言&#xff0c;其中一个关键的关注点就是图像的清晰度。png和jpg哪个清晰&#xff1f;此外&#xff0c;如果需要在它们之间进行转换&#xff0c;我…

“金航标,连接世界”

金航标kinghelm宋仕强先生说&#xff0c;“金航标&#xff0c;连接世界”。连接器的作用是为两个电路子系统提供一个可分离的界面&#xff0c;一方面使得零部件或子系统的维护或升级不必修改整个系统&#xff1b;另一方面提高了零部件的便携性、外围设备的拓展能力&#xff0c;…

使用虚拟机安装CentOS7操作系统并部署数据库

1 安装操作系统 最初下载的系统镜像为&#xff1a;CentOS-7-x86_64-Everything-2207-02.iso&#xff0c;安装时总是提示&#xff1a;“客户机操作系统已禁用cpu请关闭或重置虚拟机”&#xff0c;查找了很多资料都无法解决&#xff0c;最终更换系统镜像为&#xff1a;CentOS-7-…

2024/3/14打卡(14届蓝桥杯)——差分

标准差分模板 差分——前缀和的逆运算&#xff08;一维二维&#xff09;-CSDN博客 题目 小蓝拥有 nn 大小的棋盘&#xff0c;一开始棋盘上全都是白子。 小蓝进行了 m 次操作&#xff0c;每次操作会将棋盘上某个范围内的所有棋子的颜色取反(也就是白色棋子变为黑色&#xff0…

jar运行报错Unable to read meta-data for class

目录 一、场景描述 二、解决办法 1&#xff09;情况一 2&#xff09;情况二 贴一下部署报错堆栈信息&#xff1a; java.lang.IllegalStateException: Unable to read meta-data for class com.zhh.zhhd.biz.config.Test1Configat org.springframework.boot.autoconfigure.…

goland设置保存文件时不将4个空格转为TAB

goland设置保存文件时不将4个空格转为TAB 版本&#xff1a;GoLand 2022.3 设置路径&#xff1a; Settings -> Editor -> Code Style -> Go -> Run gofmt图示&#xff1a;

无缝集成 MongoDB Relational Migrator,Tapdata 提供关系型到 MongoDB 实时迁移优化方案

在去年的 MongoDB 用户大会纽约站上&#xff0c;MongoDB 正式宣布全面推出新工具 MongoDB Relational Migrator&#xff08;MongoDB RM&#xff09;&#xff0c;用以简化应用程序迁移和转换——即从传统关系型数据模型到现代的文档数据模型&#xff0c;助力组织快速提升运营效率…

opencv dnn模块 示例(25) 目标检测 object_detection 之 yolov9

文章目录 1、YOLOv9 介绍2、测试2.1、官方Python测试2.1.1、正确的脚本2.2、Opencv dnn测试2.2.1、导出onnx模型2.2.2、c测试代码 2.3、测试统计 3、自定义数据及训练3.1、准备工作3.2、训练3.3、模型重参数化 1、YOLOv9 介绍 YOLOv9 是 YOLOv7 研究团队推出的最新目标检测网络…

手撕快速排序

定义 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法. 其基本思想为:任取待排序的某个元素作为基准值,按照该排序码将待排序集合分割成两个子序列, 左子序列中所有元素均小于基准值,右子序列均大于基准值,然后左右子序列重复该过程,知道所有元素都有序为止. (核心…

投后管理系统的功能模块

投后管理系统的技术难点可能包括以下几个方面&#xff0c;这些技术难点需要综合考虑&#xff0c;并结合具体的业务需求和技术实现&#xff0c;才能构建出高效、安全、稳定的投后管理系统。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作…

【Python】成功解决NameError: name ‘sns‘ is not defined

【Python】成功解决NameError: name ‘sns’ is not defined &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到您…

基于Java (spring-boot)的毕业作品管理系统

一、项目介绍 管理员管理设计题目&#xff0c;投票记录&#xff0c;选题信息以及公告。 教师对设计题目进行投票&#xff0c;审核并管理用户选题信息。 用户选择设计题目&#xff0c;查看选题审核状态&#xff0c;管理选题信息。 二、作品包含 三、项目技术 后端语言&#xff1…

一体式以电折水智能终端:化繁为简,智能八合一

一体式以电折水智能终端通过高度集成化设计&#xff0c;巧妙融合了空气开关、开关电源、隔离变压器、接触器、智能电表、RTU、4G通信模块、定位模块等八大核心功能&#xff0c;不仅展现了经济高效和智能运维的双重优势&#xff0c;更以其超强的安全防护能力确保了使用的高度安全…

maven打包把所有依赖的jar copy到一个文件夹

在maven项目中&#xff0c;是使用依赖坐标来引入jar包&#xff0c;在引入jar包的时候&#xff0c;maven也会默默的帮助我们导入这个jar包所依赖的jar包。 但是当我们打包项目使用jar包运行的时候&#xff0c;往往会出现缺少jar的情况&#xff1a; 如果我们一个一个添加缺少的…

对比学习(Contrastive Learning)和孪生网络(Siamese Network)的区别!

对比学习&#xff08;Contrastive Learning&#xff09;和孪生网络&#xff08;Siamese Network&#xff09;是两种常见的无监督学习方法&#xff0c;它们有着不同的原理和应用场景。 原理与目标&#xff1a; 对比学习旨在通过最小化相似样本对之间的距离&#xff0c;最大化不相…

西井科技参与IATA全球货运大会 以AI绿动能引领智慧空港新未来

3月12日至14日&#xff0c;由国际航空运输协会IATA主办的全球货运大会&#xff08;World Cargo Symposium&#xff09;在中国香港成功举办&#xff0c;这是全球航空货运领域最大规模与影响力的年度盛会。作为大物流领域全球领先的“智能化与新能源化”综合解决方案提供商&#…

从零开始写 Docker(六)---实现 mydocker run -v 支持数据卷挂载

本文为从零开始写 Docker 系列第六篇&#xff0c;实现类似 docker -v 的功能&#xff0c;通过挂载数据卷将容器中部分数据持久化到宿主机。 完整代码见&#xff1a;https://github.com/lixd/mydocker 欢迎 Star 推荐阅读以下文章对 docker 基本实现有一个大致认识&#xff1a; …

[C++]20.实现红黑树。

实现红黑树 一.基本概念&#xff1a;1.红黑树的概念&#xff1a;2.红黑树的性质&#xff1a; 二.实现红黑树&#xff1a;1.基本结构&#xff1a;2.插入节点的多种情况&#xff1a;1.叔叔存在且为红&#xff1a;2.叔叔不存在/存在且为黑(单旋变色)3.叔叔不存在/存在且为黑(多旋&…

【计算机网络篇】计算机网络的定义和分类

文章目录 &#x1f354;什么是计算机网络&#x1f5c3;️计算机网络的分类⭐按交换方式分类⭐按使用者分类⭐按传输介质分类⭐按覆盖范围分类⭐按拓扑结构分类 &#x1f6f8;小结 &#x1f354;什么是计算机网络 计算机网络是指将多台计算机或其他网络设备通过通信链路连接起来…