河南萌新联赛2024第(四)场:河南理工大学

news2024/9/24 23:23:41

河南萌新联赛2024第(四)场:河南理工大学

2024.8.7 13:00————17:00

过题数5/12
补题数8/12

  • 该出奇兵了
  • 小雷的神奇电脑
  • 岗位分配
  • 简单的素数
  • AND
  • 小雷的算式
  • 循环字符串
  • 聪明且狡猾的恶魔
  • 马拉松
  • 尖塔第四强的高手
  • 比赛
  • 抓字符

B - 小雷的神奇电脑

题解:
给出n个整数,保证他们的二进制位数小于m位,求数组中任意俩个数的同或最大值。
可以知道相邻俩个数同获最小,异或最大。
代码:

#include<bits/stdc++.h>

using namespace std;
#define int long long
const int N = 2e5+10;
const int INF = 0x3f3f3f3f;
int a[N];

int qpow(int base,int power) {
    int res = 1;
    while(power) {
        if(power & 1) res = res*base;
        base = base*base;
        power >>= 1;
    }
    return res;
}

signed main() {
    int n,m;
    cin >> n >> m;
    for (int i = 1; i <= n; i++) cin >> a[i];
    sort(a+1,a+1+n);
    int ans = 0;
    int res = qpow(2,m)-1;
    for (int i = 1;i <= n-1; i++) {
        ans = max(a[i] xor a[i+1] xor res,ans);
    }
    cout << ans;
    return 0;
}

C - 岗位分配

题解:
n个岗位,m位志愿者,每个岗位需要a[i]个志愿者,需要将志愿者分配到岗位上,可以有志愿者剩余。对分配情况计算总数,答案取模。岗位需求志愿者总和不超过志愿者个数,且志愿者间无差别。
分配问题,排列组合的隔板法。先把每个岗位需要的志愿者给他们,然后剩余的志愿者可以看作小球,分割到n个盒子里,可以有空盒子,剩余的志愿者也不用分配完,可以分配一个俩个多个等等。
代码:

#include<bits/stdc++.h>

using namespace std;
#define int long long
const int mod = 998244353;

int qpow(int base,int power) {
    int res = 1;
    while(power) {
        if(power & 1) res = res*base%mod;
        base = base*base%mod;
        power >>= 1;
    }
    return res;
}

int c(int x,int y) {
    int res = 1;
    for (int i = 1,j = x; i <= y; i++,j--) {
        res=res*j%mod;
        res = res*qpow(i,mod-2)%mod;
    }
    return res;
}

signed main() {
    int n,m;
    cin >> n >> m;
    int sum = 1;
    for (int i = 1; i <= n; i++) {
        int t;
        cin >> t;
        m-=t;
        sum *= i;
    }
    int ans = 0;
    for (int i = 0; i <= m; i++) {
        ans += c(i+n-1,n-1);
        ans %= mod;
    }cout << ans << endl;
    return 0;
}

D - 简单的素数

题解:
判断素数。
代码:

#include<bits/stdc++.h>

using namespace std;
#define int long long

int t;

signed main() {
    cin >> t;
    while(t--) {
        int n;
        cin >> n;
        bool st = true;
            for (int j = 2; j*j <= n; j++) {
                if(n % j == 0) {
                    st = false;
                    break;
                }
            }
        if(n == 1 || n == 2) st = true;
        if(st)cout << "Yes" << endl;
        else cout << "No" << endl;
    }
    return 0;
}

E - AND

题解:
质数是一定要判断的,可以利用欧拉筛线性判断素数,对于给出区间内,判断其中素数的个数,以及这个区间内有多少个子区间与操作后为0。
可以发现素数中只有2是偶数,最后一位二进制是0,所以只有它和别人与操作后有机会变成0,而2只要和从5开始的数字与都会是0,因此最后输出个数-2即可。
代码:

#include<bits/stdc++.h>

using namespace std;
#define int long long
bool pri[100000005];
vector<int>a;

int t;

signed main() {
    cin >> t;
    int sum = 0;
    pri[1] = 1;
    for (int i = 2; i <= 100000003; i++) {
        if(!pri[i])a.push_back(i);
        for (auto x : a) {
            if(x*i > 100000003)break;
            pri[x*i] = 1;
            if(i % x == 0)break;
        }
    }
  //  cout << pri[1] << ' ' << pri[2] << ' ' << pri[3] << ' ' << pri[4] << ' ' << pri[9];
    while(t--) {
        int x,y;
        cin >> x >> y;
        int l = lower_bound(a.begin(),a.end(),x)-a.begin();
        int r = upper_bound(a.begin(),a.end(),y)-a.begin();
        cout << r-l << ' ';
        if(x > 2) cout << 0 << endl;
        else {
            if(r-l == 1) cout << 0 << endl;
            else cout << r-l-2 << endl;
        }
    }
    return 0;
}

F - 小雷的算式

**
题解:
代码:

#include<bits/stdc++.h>

using namespace std;
#define int long long
const int N = 2e5+5;
int a[N];

signed main() {
    string s;
    getline(cin,s);
    int t = 0;
    int res = 0;
    for (int i = 0; i < s.length(); i++) {
        if(s[i] == '+') {
            a[t++] = res;
            res = 0;
        }
        else res = res*10+(s[i]-'0');
    }a[t] = res;
    sort(a,a+t+1);
    int sum = 0;
    for (int i = t; i >= 1; i--) {
        cout << a[i] << '+';
        sum += a[i];
    }
    cout << a[0] << endl;
    sum += a[0];
    cout << sum << endl;
    return 0;
}

H - 聪明且狡猾的恶魔

垃圾题目数据出错卡我一小时。
题解:
想象一下只剩下俩只恶魔的时候,所有的金币都会归为前面那只恶魔的,所以当有三只恶魔的时候,他就会给最后那只恶魔一枚金币,希望它能帮助自己,最后的恶魔当然会答应。所以每次只需要给最后不到一半的恶魔各一枚金币即可。
代码:

#include<bits/stdc++.h>

using namespace std;
#define int long long
int t;

signed main() {
    cin >> t;
    while(t--) {
        int x,n;
        cin >> x >> n;
        n = (n-1)/2;
        cout << x-n << endl;
    }
    return 0;
}

I - 马拉松

I hate 图论
题解:
有n个城市,现在在任意俩个城市之间跑最短路,如果经过x城市跑到y城市会被禁止,问有多少次会被禁止。从每个城市出发可以到达城市中的其他城镇。也就是说,给定的城镇和道路地图是一棵树。
把x作为树根,从y的子节点包括它自己跑到x及x的别的子树,都是被禁止的,遍历一下每个节点的子节点有多少个,并把y的那颗树标记一下,等会减去它就是x的别的子树。
给出俩种相同思想的不同写法。
代码:

#include<bits/stdc++.h>

using namespace std;
#define int long long
const int N = 3000005;
int n,x,y;
vector<int>l[3000005];
bool st[N];
int c[N];

void dfs(int x,int fa) {
    c[x] = 1;
    if(x == y) st[x] = true;
    for (auto rs: l[x]) {
        if(rs == fa)continue;
        dfs(rs,x);
        c[x] += c[rs];
        if(st[rs])st[x] = true;
    }
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    memset(st,0,sizeof st);
    memset(c,0,sizeof c);
    cin >> n >> x >> y;
    for (int i = 1; i < n; i++) {
        int a,b;
        cin >> a >> b;
        l[a].push_back(b);
        l[b].push_back(a);
    }
    dfs(x,0);
    int ans = 0;
    for (auto cg : l[x]) {
        if(st[cg]) ans += c[cg];
    }
    cout << c[y]*(c[x]-ans) << endl;
    return 0;
}
#include<bits/stdc++.h>

using namespace std;
#define int long long
const int N = 300005;
int n,x,y;
vector<int>l[300005];
int sum1=0,sum2=0;
bool st[N];

int dfs(int res,int jj) {
    memset(st,0,sizeof st);
    int ans = 0;
    queue<int>q;
    q.push(res);
    //先把这个点放进去
    
    while(!q.empty()) {
        int xx = q.front();
        q.pop();
        if(xx == jj) continue;
        //如果搜到不该搜的点直接跑
        if(st[xx]) continue;
        //搜过了不用再搜一遍
        ans++;
        //又有一个节点
        st[xx] = 1;
        for (auto yy : l[xx]) {
            if(yy == jj) continue;
            if(st[yy])continue;
            q.push(yy);
        }
    }
    return ans;
}

signed main() {
    cin >> n >> x >> y;
    for (int i = 1; i <= n; i++) {
        int a,b;
        cin >> a >> b;
        l[a].push_back(b);
        l[b].push_back(a);
    }
    int sum1 = dfs(x,y);
    //计算除了y以外的所有节点
    int sum2 = dfs(y,x);
    cout << (n-sum1)*(n-sum2) << endl;
    return 0;
}

J - 尖塔第四强的高手

思路其实不难,基本就是一道LCA变形题,但我当时真的不太会LCA,当然现在也不是很会谢谢。题意太复杂了上图。
在这里插入图片描述
题解:
开始解读,可以发现k的范围非常大到1e9,但是斐波那契数列的增长其实非常快,所以只要k>25,其实就已经超过了n的范围,直接输出0即可。这个点比较关键,脑子要转一下。
LCA倍增算法的复杂度其实比较高,但是这道题给出的q组询问,每个区间的数的最近共同祖先,一个一个分别推导即可,不用n*n的复杂度,所以最大也就到24n,不会超时。
代码:

#include<bits/stdc++.h>

using namespace std;
#define int long long
const int N = 1e5+10;
vector<int>e[N];
int fa[N][20],dep[N];
int f[50];
vector<int>xq;
int n,r,q;

void dfs(int x,int father) {
    dep[x] = dep[father]+1;
    fa[x][0] = father;
    for (int i = 1; i <= 19; i++) {
        fa[x][i] = fa[fa[x][i-1]][i-1];
    }
    for (auto y : e[x]) {
        if(y == father) continue;
        dfs(y,x);
    }
}

int lca(int u,int v) {
    if(dep[u] < dep[v]) swap(u,v);
    for (int i = 19; i >= 0; i--) {
        if(dep[fa[u][i]] >= dep[v]) u = fa[u][i];
    }
    if(u == v) return u;
    for (int i = 19; i >= 0; i--) {
        if(fa[u][i] != fa[v][i]) u = fa[u][i],v = fa[v][i];
    }
    return fa[u][0];
}

signed main() {
    cin >> n >> r >> q;
    f[1] = 1,f[2] = 2;
    for (int i = 3; i <= 40; i++) f[i] = f[i-1]+f[i-2];
    for (int i = 1; i < n; i++) {
        int a,b;
        cin >> a >> b;
        e[a].push_back(b);
        e[b].push_back(a);
    }
    
    dfs(r,0);
    
    for (int i = 1; i <= q; i++) {
        int x,k;
        cin >> x >> k;
        if(k > 25) {
            cout << 0 << endl;
            continue;
        }
        int u = x + f[k];
        int v = x + f[++k];
        if(x + f[k-1] > n) cout << 0 << endl;
        else {
                while(v <= n) {
                u = lca(u,v);
                v = x + f[k++]; }
                cout << u << endl;
        }
    }
    return 0;
}

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

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

相关文章

企业如何选择靠谱的第三方软件测试机构?

第三方软件测试机构是专门提供软件测试服务的第三方检测机构&#xff0c;旨在对软件的功能、性能、安全性等方面进行系统评估&#xff0c;确保其满足设定的标准和需求。这些机构通常拥有丰富的行业经验和专业资质&#xff0c;可以为企业提供包括项目验收测试、软件确认测试、安…

贪吃蛇之地图的绘制

首先我们要知道地图位置大体是怎么样的 绘出一个大概的地图 设置了2020的方格 源码在这里 #include<curses.h>void initNcurse() {initscr();keypad(stdscr,1); }void gamePic() {int hang;int lie;for(hang0;hang<20;hang){if(hang0){for(lie0;lie<20;lie){pr…

开通期权分仓账户需要多少资金?

在金融衍生品市场&#xff0c;期权分仓账户犹如一艘精巧的帆船&#xff0c;承载着投资者的智慧与梦想&#xff0c;驶向财富的彼岸。然而&#xff0c;每一艘帆船的启航&#xff0c;都需备足风帆与给养&#xff0c;即那开启航程所必需的资金之舟&#xff0c;下文为大家介绍开通期…

【C语言基础习题】C语言练习题——bite 寒假班作业(6)【未完成】

编程小白如何成为大神?大学新生的最佳入门攻略 编程已成为当代大学生的必备技能,但面对众多编程语言和学习资源,新生们常常感到迷茫。如何选择适合自己的编程语言?如何制定有效的学习计划?如何避免常见的学习陷阱?让我们一起探讨大学新生入门编程的最佳路径,为你的大学…

【进阶篇-Day14:JAVA中IO流之转换流、序列化流、打印流、Properties集合的介绍】

目录 1、转换流1.1 转换流分类&#xff1a;1.2 转换流的作用&#xff08;1&#xff09;按照指定的字符编码读写操作&#xff1a;&#xff08;2&#xff09;将字节流转换为字符流进行操作&#xff1a; 2、序列化流2.1 序列化的基本使用&#xff1a;2.2 序列化的操作流程&#xf…

《Token-Label Alignment for Vision Transformers》ICCV2023

摘要 这篇论文探讨了数据混合策略&#xff08;例如CutMix&#xff09;在提高卷积神经网络&#xff08;CNNs&#xff09;性能方面的有效性&#xff0c;并指出这些策略在视觉Transformer&#xff08;ViTs&#xff09;上同样有效。然而&#xff0c;发现了一个“token fluctuation…

mp3音频怎么压缩小一点?音频压缩的6个简单方法

在日常的数字生活中&#xff0c;MP3音频文件凭借其广泛的兼容性和相对较高的音质&#xff0c;已然成为了连接音乐创作者与听众之间不可或缺的桥梁。从个人音乐收藏到社交媒体分享&#xff0c;再到专业音频项目的交付&#xff0c;MP3格式以其便捷性占据了重要地位。然而&#xf…

MLP:全连接神经网络的并行执行

目录 MLP:全连接神经网络的并行执行 假设 代码解释 注意事项 MLP:全连接神经网络的并行执行 为了继续解释这段代码,我们需要做一些假设和补充,因为原始代码片段中DummyModel、Shard和mx.array的具体实现没有给出。不过,基于常见的编程模式和深度学习框架的惯例,我们…

【Linux网络】Linux网络初探:开启网络世界的大门

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; 前言&#xff1a;我们已经系统的学习了Linux的基本操作、进程、线程、文件、通信等待&#xff0c;但是在如今社会没有网络通信方式是万万不行的&#xff0c;今天我们就走进网络中&#xff0c;系统的学习一下有关Linux网…

电脑外接设备管理软件有哪些(三款USB外设管理软件推荐)

“小张&#xff0c;你上次用U盘拷贝资料时&#xff0c;有没有担心过数据安全问题&#xff1f;” “是啊&#xff0c;李姐&#xff0c;我总感觉用U盘传文件不太放心&#xff0c;万一数据被误删或者泄露就麻烦了。” 正是这样的担忧&#xff0c;促使了电脑外接设备管理软件的出现…

让模型从Pytorch到NCNN——Pytorch模型向NCNN框架部署的小白向详细流程(PNNX模型转换、Linux模型使用)

参考文章和项目地址&#xff1a; [1] Tencent/ncnn: ncnn is a high-performance neural network inference framework optimized for the mobile platform (github.com) [2] pnnx/pnnx: PyTorch Neural Network eXchange (github.com) [3] 使用pnnx把pytorch模型转ncnn模型-CS…

重塑购车体验,实时云渲染赋能东风日产探路云看车新体验

在科技日新月异的今天&#xff0c;汽车行业正经历着前所未有的深刻变革。随着互联网、大数据、人工智能等新兴技术的深度融合&#xff0c;汽车营销策略也迎来了从传统展示到数字化体验的跨越。 消费者的购车习惯逐渐倾向于线上互动与深度体验&#xff0c;希望在线上获得线下同…

【docker】docker数据卷与网络部署服务

Docker 网络模式 选择网络模式 Host Mode (主机模式) 特点: 容器与宿主机共享网络命名空间操作: docker run --nethost ... Container Mode (容器模式) 特点: 容器与指定容器共享网络命名空间操作: docker run --netcontainer:<container-id-or-name> ... None Mode (无…

XP服务器-远程桌面连接不上

今天遇到个很奇怪的事&#xff0c;xp服务器突然远程桌面连接不上了&#xff0c;根据上网百度的结果&#xff0c;防火墙关了&#xff0c;也允许远程连接了。我之前修改过服务器的默认端口号3389&#xff0c;改为了新端口号A&#xff0c;但是当时修改完是可以正常登陆的。而且新端…

004集——静态常量和动态常量——C#学习笔记

首先普及一个小白使用的小技巧&#xff1a;tab键可以自动输出系统显示的引导字符。 常量是使用 const 关键字来定义的 。定义一个常量的语法如下&#xff1a; const <data_type> <constant_name> value; 下面的代码演示了如何在程序中定义和使用常量&#xff1…

win服务器cmd执行exe文件失败

问题场景 场景&#xff1a;用python打包的exe文件&#xff0c;在cmd下执行是没问题的&#xff0c;放到定时任务就不执行。。。动di脚本调试没问题&#xff0c;打包成exe可执行程序也能正常运行。就是放到定时任务有问题。 解决&#xff1a; 解决方案 1.打开计划任务创建计划任…

OpenGL3.3_C++_Windows(34)

demo 1 Fresnel-Schlick PBR直接光源 顾名思义&#xff1a;直接光源指有光源直接照射到点p 的辐射强度&#xff0c;由于一个光源只会有一个光线wi影响点p&#xff0c;所以和之前的计算没什么差异对于影响p的光源&#xff0c;并不需要积分计算半球形辐照度&#xff0c;遍历每个…

71 为对象定义类

① 类定义对象的特征和行为。 ② 一个 Python 类使用变量存储数据域&#xff0c;定义方法来完成动作。类就是一份契约&#xff08;有时也称之为模板或蓝本&#xff09;&#xff0c;它定义对象的数据域和方法。 ③ 对象是类的一个实例&#xff0c;可以创建一个类的多个对象。创建…

【Linux】yum软件包管理器(使用、生态、yum源切换)

目录 1.yum-软件包管理器&#x1f638;1.1yum使用方法1.2什么是yum&#xff1f;&#x1f638;1.3yum的周边生态1.4yum源切换1.4.1 查看系统本身yum源1.4.2 软件源1.4.3yum源配置 1.yum-软件包管理器 以下操作需要联网的情况下进行 &#x1f638;1.1yum使用方法 安装软件时由于需…

蜜罐——HFish使用

蜜罐——HFish的使用 一、蜜罐简介 1.1 蜜罐技术 蜜罐技术本质上是一种对攻击方进行欺骗的技术&#xff0c;通过布置一些作为诱饵的主机、网络服务或者信息&#xff0c;诱使攻击方对它们实施攻击&#xff0c;从而可以对攻击行为进行捕获和分析&#xff0c;了解攻击方所使用的…