Codeforces Round 949 (Div. 2) A~D

news2024/11/26 12:49:38

A. Turtle and Piggy Are Playing a Game (思维)

题意:

给出一个整数 x x x ,使得 l ≤ x ≤ r l \le x \le r lxr ,其中 l , r l, r l,r 为给定值。同时保证 2 l ≤ r 2l \le r 2lr
执行以下操作,直到 x x x 变为 1 1 1

  • 选择一个整数 p p p ,使得 p ≥ 2 p \ge 2 p2 p ∣ x p \mid x px (即 x x x p p p 的倍数)。
  • x x x 设置为 x p \frac{x}{p} px ,得分将增加 1 1 1

得分最初为 0 0 0 。询问得分最大为多少。

分析:

2 2 2的增长速度是最慢的,并且题目有 2 × l ≤ r 2 \times l \le r 2×lr,所以答案为 l o g 2 r log_2r log2r向下取整。

代码:

#include <bits/stdc++.h>

using namespace std;

int main() {
    int t;
    cin >> t;
    while (t--) {
        int l, r;
        cin >> l >> r;
        int ans = __lg(r);
        cout << ans << endl;
    }
    return 0;
}

B.Turtle and an Infinite Sequence (位运算)

题意:

给出一个无限长的序列 a 0 , a 1 , a 2 , … a_0, a_1, a_2, \ldots a0,a1,a2, 。对于每个非负整数 i i i ,初始值为 a i = i a_i = i ai=i
每一秒之后,序列中的每个元素都会同时发生变化。对于每个正整数 i i i a i a_i ai 将变为 a i − 1 ∣ a i ∣ a i + 1 a_{i - 1} \mid a_i \mid a_{i + 1} ai1aiai+1 a 0 a_0 a0 将变为 a 0 ∣ a 1 a_0 \mid a_1 a0a1
给出 m m m,询问 m m m秒之后, a n a_n an的值。

分析:

发现 a n a_n an m m m秒之后的答案为 [ n − m , n + m ] [n-m,n+m] [nm,n+m]这个区间里面所有数的异或和。我们直接枚举答案的二进制位 i i i,判断 i i i能否变成 1 1 1。只需找到第一个 x x x,满足 x ≥ l , x ≤ r , x > > i x \ge l, x \le r, x>>i xl,xr,x>>i & 1 1 1即可。

代码:

#include <bits/stdc++.h>

using namespace std;
typedef long long LL;

int main() {
    int t;
    cin >> t;
    while (t--) {
        LL n, m;
        cin >> n >> m;
        LL l = max(0LL, n - m);
        LL r = n + m;
        LL ans = 0;
        LL cnt = 0;
        while (l != r) {
            cnt++;
            l >>= 1;
            r >>= 1;
        }
        while (cnt--)
            r = (r << 1) ^ 1;
        cout << r << endl;
    }
    return 0;
}

C.Turtle and an Incomplete Sequence (位运算)

题意:

给出一个正整数组成的序列 a 1 , a 2 , … , a n a_1, a_2, \ldots, a_n a1,a2,,an但是现在序列不完整了。可能存在任意数量的索引 i i i ,使得 a i a_i ai 变成 − 1 -1 1 。让新序列为 a ′ a' a。保证对于原始序列 a a a ,要么 a i = ⌊ a i + 1 2 ⌋ a_i = \left\lfloor\frac{a_{i + 1}}{2}\right\rfloor ai=2ai+1 成立,要么 a i + 1 = ⌊ a i 2 ⌋ a_{i + 1} = \left\lfloor\frac{a_i}{2}\right\rfloor ai+1=2ai 成立。

换句话说,你需要找到另一个由正整数组成的序列 b 1 , b 2 , … , b n b_1, b_2, \ldots, b_n b1,b2,,bn ,并且:

  • 对于从 1 1 1 n n n 的每个整数 i i i ,如果 a i ′ ≠ − 1 a'_i \ne -1 ai=1 ,则 b i = a i ′ b_i = a'_i bi=ai
  • 对于从 1 1 1 n − 1 n - 1 n1 的每个整数 i i i b i = ⌊ b i + 1 2 ⌋ b_i = \left\lfloor\frac{b_{i + 1}}{2}\right\rfloor bi=2bi+1 b i + 1 = ⌊ b i 2 ⌋ b_{i + 1} = \left\lfloor\frac{b_i}{2}\right\rfloor bi+1=2bi 成立。
  • 对于从 1 1 1 n n n 的每个整数 i i i 1 ≤ b i ≤ 1 0 9 1 \le b_i \le 10^9 1bi109

如果没有满足上述所有条件的序列 b 1 , b 2 , … , b n b_1, b_2, \ldots, b_n b1,b2,,bn ,则需要输出 − 1 -1 1

分析:

我们考虑将操作统一,即满足 b i = b i − 1 / 2 b_i=b_{i-1}/2 bi=bi1/2 或者满足 b i = b i − 1 × 2 b_i=b_{i-1} \times 2 bi=bi1×2 或者 b i = b i − 1 × 2 + 1 b_i=b_{i-1} \times 2+1 bi=bi1×2+1,并将操作转换成在二进制上考虑是将前一个数右移一位还是在末尾填上 0 0 0或者 1 1 1
我们接下来考虑从 x x x变成 y y y至少需要多少个操作,首先求出 x x x, y y y 的二进制最长公共前缀,然后将 x x x通过右移操作变成其最长公共前缀,然后再通过填 1 1 1或者填 0 0 0来变成 y y y。最后剩余的数通过反复乘 2 2 2或者除 2 2 2操作即可。

代码:

#include <bits/stdc++.h>

using namespace std;
typedef long long LL;
const LL N = 5e5 + 10;
const LL mod = 1e9 + 7;

LL gcd(LL a, LL b) {
    return b > 0 ? gcd(b, a % b) : a;
}

int a[N];

void solve() {
    int n;
    cin >> n;
    int bit[n + 5][32];
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    vector<int> pos;
    int st = 0, en = 0;
    for (int i = 1; i <= n; i++) {
        if (a[i] != -1) {
            if (!st)
                st = i;
            pos.push_back(i);
            for (int j = 0; j < 32; j++) {
                bit[i][j] = ((a[i] >> j) & 1);
            }
            en = i;
        }
    }
    int f = 0;
    for (int i = st - 1; i >= 1; i--) {
        if (f == 0) {
            a[i] = a[i + 1] * 2;
        } else {
            a[i] = a[i + 1] / 2;
        }
        f ^= 1;
    }
    f = 0;
    for (int i = en + 1; i <= n; i++) {
        if (i == 1) {
            a[i] = 2;
            continue;
        }
        if (f == 0) {
            a[i] = a[i - 1] * 2;
        } else {
            a[i] = a[i - 1] / 2;
        }
        f ^= 1;
    }
    int len = pos.size();
    for (int i = 0; i < len - 1; i++) {
        int l = a[pos[i]], r = a[pos[i + 1]];
        int tmp = l;
        int len1 = 0, len2 = 0;
        while (tmp) {
            tmp /= 2;
            len1++;
        }
        tmp = r;
        while (tmp) {
            tmp /= 2;
            len2++;
        }
        int tot = 0;
        for (int j = 0; j < min(len1, len2); j++) {
            if (bit[pos[i]][len1 - j - 1] == bit[pos[i + 1]][len2 - j - 1])
                tot++;
            else
                break;
        }
        int num = len1 + len2 - 2 * tot;
        if (pos[i + 1] - pos[i] < num || (pos[i + 1] - pos[i] - num) % 2 != 0) {
            cout << -1 << endl;
            return;
        }
        int num1 = len1 - tot;
        int num2 = len2 - tot;
        int po = pos[i] + 1;
        for (int j = 0; j < num1; j++) {
            a[po] = a[po - 1] / 2;
            po++;
        }
        for (int j = 0; j < num2; j++) {
            if (bit[pos[i + 1]][len2 - tot - j - 1] == 0) {
                a[po] = a[po - 1] * 2;
            } else {
                a[po] = a[po - 1] * 2 + 1;
            }
            po++;
        }
        int f = 1;
        for (po; po < pos[i + 1]; po++) {
            if (f == 1) {
                a[po] = a[po - 1] * 2;
            } else {
                a[po] = a[po - 1] / 2;
            }
            f ^= 1;
        }
    }
    for (int i = 1; i <= n; i++) {
        cout << a[i] << " ";
    }
    cout << endl;
}

int main() {
    int t = 1;
    cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}

D.Turtle and Multiplication (图论)

题意:

给一个整数 n n n ,并要求构造一个由满足以下条件的整数组成的序列 a 1 , a 2 , … , a n a_1, a_2, \ldots, a_n a1,a2,,an

  • 对于所有 1 ≤ i ≤ n 1 \le i \le n 1in 1 ≤ a i ≤ 3 ⋅ 1 0 5 1 \le a_i \le 3 \cdot 10^5 1ai3105
  • 对于所有 1 ≤ i ≤ j ≤ n − 1 1 \le i \le j \le n - 1 1ijn1 a i ⋅ a i + 1 ≠ a j ⋅ a j + 1 a_i \cdot a_{i + 1} \ne a_j \cdot a_{j + 1} aiai+1=ajaj+1

在所有这些序列中,找出具有最少个不同元素的序列。

分析:

如果我们都选质数,那么两对之间乘积不相同也就等价于两对质数不完全相同。那么将问题转化为在一个完全图上找欧拉路。如果我们只用奇数个质数,那么每个点度是偶数,有欧拉回路。如果用偶数个质数,就要删掉质数数量的一半减一条边,这样才会产生只有两个奇数度的点。

代码:

#include <bits/stdc++.h>

using namespace std;
typedef long long LL;
const LL N = 3e5 + 10;
const LL mod = 1e9 + 7;
int n, m, st[N], g[1510][1510];
vector<int> pri;
stack<int> stk;

void dfs(int u) {
    if (g[u][u])
        g[u][u] = 0, dfs(u);
    for (int i = 1; i <= m; i++)
        if (g[u][i])
            g[u][i] = g[i][u] = 0, dfs(i);
    stk.push(pri[u]);
}

int main() {
    for (int i = 2; i <= 300000; i++) {
        if (!st[i])
            pri.push_back(i);
        for (int j = i * 2; j <= 300000; j += i)
            st[j] = 1;
    }
    int T;
    cin >> T;
    while (T--) {
        cin >> n;
        if (n == 1) {
            cout << 1 << endl;
            continue;
        }
        m = 1;
        while (m * (m + 1) / 2 - (m % 2 ? 0 : m / 2 - 1) < n - 1)
            m++;
        for (int i = 1; i <= m; i++)
            for (int j = 1; j <= m; j++)
                g[i][j] = 1;
        if (m % 2 == 0)
            for (int i = 3; i <= m; i += 2)
                g[i][i + 1] = g[i + 1][i] = 0;
        dfs(1);
        while (stk.size() && n) {
            cout << stk.top() << " ";
            stk.pop();
            n--;
        }
        while (stk.size())
            stk.pop();
        cout << endl;
    }
    return 0;
}

赛后交流

在比赛结束后,会在交流群中给出比赛题解,同学们可以在赛后查看题解进行补题。

群号: 704572101,赛后大家可以一起交流做题思路,分享做题技巧,欢迎大家的加入。

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

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

相关文章

python如何输入回车

Python默认遇到回车的时候&#xff0c;输入结束。所以我们需要更改这个提示符&#xff0c;在遇到空行的时候&#xff0c;输入才结束。 raw_input就是从标注输入读取输入&#xff0c;输入的是什么就是什么。 文档解释&#xff1a; The function then reads a line from input,…

quick4 - hackmyvm

简介 靶机名称&#xff1a;quick4 难度&#xff1a;简单 靶场地址&#xff1a;https://hackmyvm.eu/machines/machine.php?vmQuick4 本地环境 虚拟机&#xff1a;vitual box 靶场IP&#xff08;quick4&#xff09;&#xff1a;192.168.56.104 跳板机IP(windows 11)&…

leetcode:不同的二叉树

class Solution { public:int numTrees(int n) {vector<int> dp(n1);dp[0] 1;dp[1] 1;for(int i 2;i < n;i){for(int j 1;j < i;j) // 当根节点为j时{dp[i] dp[j-1] * dp[i-j];}}return dp[n];} }; /* dp[i] i个不同的数组成的二叉搜索数的个数假设 i 5当根…

零基础非科班也能掌握的C语言知识19 动态内存管理

动态内存管理 1.为什么要有动态内存分配2.malloc和free2.1 malloc2.2 free 3.calloc和realloc3.1 calloc3.2realloc 4.常见的动态内存的错误4.1对NULL指针的解引用操作4.2对动态开辟空间的越界访问4.3对非动态内存开辟的空间free4.4使用free释放⼀块动态开辟内存的⼀部分4.5对同…

kNN算法-概述

所谓kNN算法就是K-nearest neigbor algorithm。这是似乎是最简单的监督机器学习算法。在训练阶段&#xff0c;kNN算法存储了标签训练样本数据。简单地说&#xff0c;就是调用训练方法时传递给它的标签训练样本会被它存储起来。 kNN算法也叫lazy learning algorithm懒惰学习算法…

分享不用会员免费听歌的软件,可听付费,支持随听随下!

今天来点特别的&#xff0c;给你们带来几款全网免费听歌的神器&#xff0c;让你们的音乐之旅不再有障碍&#xff01; 现在&#xff0c;找好听的歌越来越像寻宝一样&#xff0c;动不动就得掏腰包。不过别担心&#xff0c;阿星今天就来分享几款好用的免费听歌app&#xff0c;电脑…

Linux——PXE整体流程

1.自己安装一个CentOS 8的服务器 1&#xff09;手动安装 虚拟硬件配置&#xff1a;2核CPU&#xff0c;4G内存&#xff0c;100G硬盘 2个网卡&#xff08;一个通外网&#xff0c;一个内部使用&#xff09; 软件安装&#xff1a;Server GUI 磁盘分区&#xff1a;使用逻辑卷&#…

实践分享:如何用小程序里的小组件做应用开发?

随着移动互联网的快速发展&#xff0c;小程序等轻量级应用平台日益成为用户获取信息和服务的重要渠道。而小组件也在其中扮演了至关重要的角色&#xff0c;不仅能够提升用户的交互体验&#xff0c;还能帮助开发者高效地构建功能丰富、界面美观的小程序。 本文中&#xff0c;我们…

【Uniapp】uniapp微信小程序定义图片地址全局变量

错误写法&#xff1a; main.js Vue.prototype.$imgUrl 图片地址这么写之后 就发现压根不起作用&#xff1b;获取到的是undefined 正确写法&#xff1a; 返回函数&#xff0c;后面可以拼上OSS图片完整路径 Vue.prototype.$imgUrl (url) > {return ("https://地址…

jmeter性能优化之mysql配置

一、连接数据库和grafana 准备:连接好数据库和启动grafana并导入mysql模板 大批量注册、登录、下单等,还有过节像618,双11和数据库交互非常庞大,都会存在数据库的某一张表里面,当用户在登录或者查询某一个界面时,量少的话体现不出来,量很大的时候一定会有卡的现象, 性…

SpringBoot整合RabbitMQ实现消息延迟队列

环境依赖 SpringBoot 3.1.0 JDK 17 前期准备 安装MQ: liunxdockerrabbitmq安装延迟队列插件 实例 实现延迟队列的一种方式是在 RabbitMQ 中使用消息延迟插件&#xff0c;这个插件可以让你在消息发送时设置一个延迟时间&#xff0c;超过这个时间后消息才会被消费者接收到…

期刊影响因子、分区如何查询

查询期刊影响因子、分区等信息就不得不说到的数据库JCI(Journal Citation Indicator)。 JCR 是一个综合性、多学科的期刊分析与评价报告&#xff0c;它客观地统计Web of Science收录期刊所刊载论文的数量、论文参考文献的数量、论文的被引用次数等原始数据&#xff0c;再应用文…

数据库(29)——子查询

概念 SQL语句中嵌套SELECT语句&#xff0c;称为嵌套查询&#xff0c;又称子查询。 SELECT * FROM t1 WHERE column1 (SELECT column1 FROM t2); 子查询外部语句可以是INSERT/UPDATE/DELETE/SELECT的任何一个。 标量子查询 子查询返回的结果是单个值&#xff08;数字&#xff…

基于xml的Spring应用(理解spring注入)

目录 问题&#xff1a; 传统Javaweb开发的困惑? 问题&#xff1a; IOC、DI和AOP的思想提出 问题&#xff1a; Spring框架的诞生 1. BeanFactory快速入门 2. ApplicationContext快速入门 3. BeanFactory和ApplicationContext的关系 基于xml的Spring应用 1. SpringBean的…

c# 开发的wpf程序闪退,无法用try catch捕获异常

之前开发的一个程序是c#wpf开发&#xff0c;基于.net framework 4.6.1的&#xff0c;一切都是正常的&#xff0c;但是在我重新装了win11后在程序logo出现后直接闪退&#xff0c;报错 返回值为 -1073740791 (0xc0000409)&#xff0c;而且定位到代码时发现是&#xff0c; publi…

AI助教时代:通义千问,让学习效率翻倍?

全文预计1100字左右&#xff0c;预计阅读需要5分钟。 关注AI的朋友知道&#xff0c;在今年5月份以及6月份的开端&#xff0c;AI行业可谓是风生水起&#xff0c;给了我们太多的惊喜和震撼&#xff01;国内外各家公司纷纷拿出自己憋了一年的产品一决雌雄。 国内有文心一言、通义千…

LeetCode 算法:最大子数组和c++

原题链接&#x1f517;&#xff1a;最大子数组和 难度&#xff1a;中等⭐️⭐️ 题目 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组是数组中的一个连续部分。 …

28-LINUX--I/O复用-epoll

一.epoll概述 epoll 是 Linux 特有的 I/O 复用函数。它在实现和使用上与 select、poll 有很大差异。首 先&#xff0c;epoll 使用一组函数来完成任务&#xff0c;而不是单个函数。其次&#xff0c;epoll 把用户关心的文件描述 符上的事件放在内核里的一个事件表中。从而无需像…

计算机组成原理之指令格式

1、指令的定义 零地址指令&#xff1a; 1、不需要操作数&#xff0c;如空操作、停机、关中断等指令。 2、堆栈计算机&#xff0c;两个操作数隐藏在栈顶和此栈顶&#xff0c;取两个操作数&#xff0c;并运算的结果后重新压回栈顶。 一地址指令&#xff1a; 二、三地址指令 四…

C# WPF入门学习主线篇(十六)—— Grid布局容器

C# WPF入门学习主线篇&#xff08;十六&#xff09;—— Grid布局容器 欢迎来到C# WPF入门学习系列的第十六篇。在前几篇文章中&#xff0c;我们已经探讨了 Canvas、StackPanel、WrapPanel 和 DockPanel 布局容器及其使用方法。本篇博客将介绍另一种功能强大且灵活的布局容器—…