Codeforces Round 955 (Div. 2) A~E

A.Soccer(思维)

题意:

迪马喜欢看足球比赛。在这样一场比赛中,记分牌上的比分表示为 x x x: y y y,其中 x x x是第一队的进球数, y y y是第二队的进球数。在任何时候,只有一支球队可以进球,因此比分 x x x: y y y可以变为 ( x + 1 ) (x+1) (x+1): y y y,或者 x x x: ( y + 1 ) (y+1) (y+1)

在观看足球比赛时,迪马被一些非常重要的事情分散了注意力,过了一段时间,他又重新开始观看比赛。迪马记得他走神前的比分和他回来后的比分。鉴于这两个比分,他想知道以下问题。有没有可能在迪马没有看比赛的时候,两队的比分从来没有相同过?

可以肯定的是,在迪马记得的两个时间点上,两队的比分都不相等。不过,也有可能在他不在的时候,比分并没有发生变化。

请帮助迪马回答问题!

分析:

我们将之前的比分表示为 [ x 1 , y 1 ] [x_1,y_1] [x1,y1],之后的比分表示为 [ x 2 , y 2 ] [x_2,y_2] [x2,y2]。二者不相交则不可能出现相同的分数。

代码:

#include<bits/stdc++.h>

using namespace std;

void solve() {
    int x1, y1, x2, y2;
    cin >> x1 >> y1 >> x2 >> y2;
    if (x1 < y1) {
        if (x2 >= y2) {
            cout << "NO" << endl;
        } else {
            cout << "YES" << endl;
        }
    } else if (x1 > y1) {
        if (x2 <= y2) {
            cout << "NO" << endl;
        } else {
            cout << "YES" << endl;
        }
    } else {
        cout << "YES" << endl;
    }
}

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

B.Collatz Conjecture(思维、数学)

题意:

最近,一年级学生马克西姆学习了科拉兹猜想,但他在讲课时没有太注意,所以他认为猜想中提到了以下过程:

有一个变量 x x x和一个常数 y y y。下面的操作进行了 k k k次:

  • x x x增加 1 1 1,然后
  • 当数字 x x x能被 y y y整除时,再除以 y y y

请注意,这两个操作都是在一次操作中依次进行的。

例如,如果数字 x = 16 x=16 x=16 y = 3 y=3 y=3 k = 2 k=2 k=2,那么经过一次运算后, x x x就变成了 17 17 17,而经过另一次运算后, x x x就变成了 2 2 2,因为加一后, x = 18 x=18 x=18就能被 3 3 3整除两次。

鉴于初始值为 x x x y y y k k k,马克西姆想知道 x x x的最终值是多少。

分析:

直接模拟会超时。考虑如果 x x x等于 1 1 1,可以直接跳出循环,用数学方法解决,因为这时 x x x就一直会在 [ 1 , y ] [1,y] [1,y]之间。

代码:

#include<bits/stdc++.h>

using namespace std;

void solve() {
    int x, y, k;
    cin >> x >> y >> k;
    while (k != 0 && x != 1) {
        int t = min(k, y - x % y);
        x += t;
        k -= t;
        while (x % y == 0) {
            x /= y;
        }
    }
    k %= (y - 1);
    x = x + k;
    cout << x << endl;
}

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

C.Boring Day(贪心)

题意:

又是无聊的一天,埃戈尔觉得无聊,决定做点什么。但因为没有朋友,他就想出了一个游戏。

埃戈尔有一副 n n n张扑克牌,最上面的 i i i张牌上写着数字 a i a_i ai。埃戈想玩一定轮数的游戏,直到牌用完为止。在每一轮中,他都会从牌面顶端抽取一张非零数的牌,然后结束这一轮。如果在这一轮中收集到的纸牌上的数字之和在 l l l r r r(包括首尾数字)之间,则这一轮获胜;否则,这一轮失败。

埃戈尔对纸牌的顺序了如指掌。请帮助埃戈尔确定他在这样的游戏中最多可以赢多少局。请注意,伊戈尔不需要连续赢得回合。

分析:

本题我们考虑贪心,使用双指针先一直往后加和(后面的指针往后走),当和不小于 l l l时,将前指针也往后走,假如现所在位置为 l l l。那么就将 s u m − a l sum−a_l sumal

代码:

#include<bits/stdc++.h>

typedef long long LL;
using namespace std;
const int N = 1e6 + 5;
LL a[N];

void solve() {
    int n, L, R;
    cin >> n >> L >> R;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    LL cnt = 0;
    LL sum = 0;
    int l = 0;
    for (int r = 1; r <= n; r++) {
        sum += a[r];
        while (l + 1 <= r && sum > R) {
            sum -= a[++l];
        }
        if (sum >= L && sum <= R) {
            cnt++;
            sum = 0;
            l = r;
        }
    }
    cout << cnt << endl;
}

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

D.Beauty of the mountains(数学)

题意:

尼基塔喜欢山,终于决定去贝里安德山脉看看!这座山脉如此美丽,尼基塔决定用地图记录下来。地图是一个由 n n n行和 m m m列组成的表格,每个单元格都包含一个非负整数,代表山的高度。

他还注意到,山有两种类型:

  • 有雪盖。
  • 无雪帽。

尼基塔是一个非常务实的人。他希望有雪帽的山的高度总和等于没有雪帽的山的高度总和。他已经和贝里安德的市长波利卡普-波利卡波维奇达成了协议,允许他改造地貌。

尼基塔可以对大小为 k × k k\times k k×k的子矩阵进行如下变换:他可以在该区域内的山峰高度上添加一个整数常数 c c c,但山峰的类型保持不变。尼基塔可以为每次变换独立选择常数 c c c注意 c c c可以是负数

在进行变换之前,尼基塔会要求您找出是否有可能实现总和相等,或者是否不可能。即使山变成了峡谷,高度为负数,代价也无所谓。

如果地图上只有一种类型的山,那么另一种类型的山的高度之和将被视为零。

分析:

我们考虑到,如果要让这两部分分别相等( 0 0 0部分的和为 s u m 0 sum_0 sum0 1 1 1部分的和为 s u m 1 sum_1 sum1),那么我们对于每一个 k × k k×k k×k的矩阵 m i m_i mi,假设当前矩阵被选且其中有 n u m i , 0 num_{i,0} numi,0 0 0 0,和 n u m i , 1 num_{i,1} numi,1 1 1 1,且当前答案系数为 c i c_i ci

我们令 s u m 0 sum_0 sum0加上 c k × n u m i , 0 c_k×num_{i,0} ck×numi,0 s u m 1 sum_1 sum1加上 c k × n u m i , 1 c_k×num_{i,1} ck×numi,1,那么 s u m 0 sum_0 sum0会加上 ∑ c i × n u m i , 0 ( i ∈ S ) \sum c_i×num_{i,0}(i∈S) ci×numi,0(iS) s u m 1 sum_1 sum1会加上 ∑ c i × n u m i , 1 ( i ∈ S ) \sum c_i×num_{i,1}(i∈S) ci×numi,1(iS)。这两部分加上原来的部分就是我们要求的相等的和,所以设原来两部分的差为 m n mn mn,这样则有
∑ c i × ∣ n u m i , 0 − n u m i , 1 ∣ = m n ( i ∈ S ) \sum c_i×∣num_{i,0}−num_{i,1}∣=mn(i∈S) ci×numi,0numi,1∣=mn(iS)

而绝对值内的部分可以通过二维前缀和预处理, c c c为未知数,所以这是不定方程的形式,我们利用裴蜀定理,求出所有 ∣ n u m i , 0 − n u m i , 1 ∣ ∣num_{i,0}−num_{i,1}∣ numi,0numi,1 g c d gcd gcd(如果其中存在 0 0 0则跳过),如果所有这些数都是 0 0 0 m n = 0 mn=0 mn=0,或者这个 g c d gcd gcd整除 m n mn mn则有方案,否则无方案。

代码:

#include<bits/stdc++.h>

typedef long long LL;
using namespace std;
const int N = 5e2 + 2;

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

LL n, m, k, a[N][N], c[N][N];
string s[N];


LL cal1(int x1, int y1, int x2, int y2) {
    return c[x2][y2] - c[x1 - 1][y2] - c[x2][y1 - 1] + c[x1 - 1][y1 - 1];
}

LL cal2(int x1, int y1, int x2, int y2) {
    return a[x2][y2] - a[x1 - 1][y2] - a[x2][y1 - 1] + a[x1 - 1][y1 - 1];
}

void solve() {
    cin >> n >> m >> k;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            cin >> a[i][j];
        }
    }
    for (int i = 1; i <= n; i++) {
        cin >> s[i];
        s[i] = " " + s[i];
        for (int j = 1; j <= m; j++) {
            if (s[i][j] == '0') {
                c[i][j] = -1;
                a[i][j] *= -1;
            } else {
                c[i][j] = 1;
            }
        }
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            c[i][j] += c[i - 1][j] + c[i][j - 1] - c[i - 1][j - 1];
            a[i][j] += a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1];
        }
    }
    LL g = 0;
    for (int i = 1; i + k - 1 <= n; i++) {
        for (int j = 1; j + k - 1 <= m; j++) {
            LL sum = cal1(i, j, i + k - 1, j + k - 1);
            sum = abs(sum);
            g = gcd(g, sum);
        }
    }
    LL sum = cal2(1, 1, n, m);
    if ((g == 0 && sum == 0) || (g != 0 && sum % g == 0)) {
        cout << "YES" << endl;
    } else {
        cout << "NO" << endl;
    }
}

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

E.Number of k-good subarrays(思维)

题意:

b i t ( x ) bit(x) bit(x)表示非负整数 x x x的二进制表示中的 1 1 1的个数。

如果一个数组的子数组只由二进制表示中的 1 1 1数不超过 k k k的数组成,那么这个数组被称为 k k k(好)数组,对于数组 a a a的子数组 ( l , r ) (l,r) (l,r),当满足条件 b i t ( a i ) ≤ k bit(a_i)≤k bit(ai)k对于所有 l ≤ i ≤ r l≤i≤r lir i i i时,则该子数组是 k k k好的。

给你一个长度为 n n n的数组 a a a,由从 0 0 0开始的连续的非负整数组成,即 0 ≤ i ≤ n − 1 0\le i\le n-1 0in1 a i = i a_{i}=i ai=i。你需要计算这个数组中 k k k好的子数组的数量。

由于答案可能非常大,所以请输出对 1 0 9 + 7 10^{9}+7 109+7取模的结果。

分析:

s o l ( n , k ) sol(n,k) sol(n,k)为答案。(注意,是 [ 0 , n − 1 ] [0,n-1] [0,n1]的)那么 s o l ( n , k ) sol(n,k) sol(n,k)可以通过 s o l ( m x , k ) sol(mx,k) sol(mx,k) s o l ( n − m x , k − 1 ) sol(n-mx,k-1) sol(nmx,k1)算出来,其中 m x mx mx是小于 n n n的最大 2 2 2次幂。(大于等于 m x mx mx的就会有一位固然是 1 1 1,就会是 k − 1 k-1 k1。)设 m x = 2 c mx=2^c mx=2c

除了内部的,还有一个端点在左边一个端点在右边的。官方题解是维护了三个值,较为复杂。

我们发现,如果 c > k c\gt k c>k,那么左边最后一个就会有大于 k k k 1 1 1,没有贡献,所以必须 c ≤ k c\le k ck。这个时候左边所有的都满足,只需要计算右边的。右边的到了 2 k − 1 2^k-1 2k1也不行,因为这样也超过了(当然要和长度取最小值)。所以我们算出了右边的贡献 s = m i n ( 2 c − 1 , n − 2 c ) s=min(2^c-1,n-2^c) s=min(2c1,n2c)。那么,答案就要多加上 s × 2 c s\times 2^c s×2c。直接记忆化搜索即可。

代码:

#include<bits/stdc++.h>

typedef long long LL;
using namespace std;
const LL MOD = 1e9 + 7;
map<pair<LL, LL>, LL> mp;

LL sol(LL n, LL k) {
    if (k == 0 || n == 1) {
        return 1;
    }
    if (mp.count({n, k})) {
        return mp[{n, k}];
    }
    LL c = 0;
    while ((1ll << c + 1) < n) {
        c++;
    }
    LL l = sol(1ll << c, k);
    LL r = sol(n - (1ll << c), k - 1);
    LL ans = l + r;
    if (c <= k) {
        LL s = min((1ll << k) - 1, n - (1ll << c));
        ans += s % MOD * ((1ll << c) % MOD) % MOD;
    }
    mp[{n, k}] = ans % MOD;
    return ans % MOD;
}

void solve() {
    LL n, k;
    cin >> n >> k;
    cout << sol(n, k) << endl;
}

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

赛后交流

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

超声波清洗机怎么选?极力推荐四款口碑大牌超声波清洗机

相信大家都知道超声波清洗机&#xff0c;每次眼镜脏的时候&#xff0c;去眼镜店里让老板帮忙清洗&#xff0c;她们用的就是超声波清洗机&#xff0c;通过超声波的原理深入物品深处清洁&#xff0c;清洁效果非常好。相对手洗的方式&#xff0c;超声波清洗机能够保护镜片在清洗过…

jq实现拖动滑块实现人机校验——基础积累

最近在写后台管理系统&#xff0c;同事遇到一个需求关于滑动验证的。之前的样式是&#xff1a; 现在只要底部的滑动验证&#xff0c;图片不要了&#xff0c;而且要滑动到右边才算是验证通过。 就是如下所示的最简单的验证方式&#xff1a; 由于同事现有的项目是mvc的&#…

昇思25天学习打卡营第1天|yulang

今天主要了解了深度学习框架之昇思MindSpore的初学入门&#xff0c;没想到 ai学习入门如此简单&#xff0c;不愧是华为大手笔&#xff0c;提供的学习环境配置如此之高。这个平台有点类似百度飞桨&#xff0c;大大降低了AI开发门槛&#xff0c;使用户能够快速实现想要的模型&…

Dinky 让Flink作业纵享丝滑

1.Dinky是什么&#xff1f; Dinky 是一个开箱即用的一站式实时计算平台&#xff0c;以 Apache Flink 为基础&#xff0c;连接 OLAP 和数据湖等众多框架,致力于流批一体和湖仓一体的建设与实践。Dinky 让Flink作业纵享丝滑&#xff0c;为 Apache Flink 深度定制的新一代实时计算…

【Python机器学习】模型评估与改进——留一法交叉验证

留一法也是一种常见的交叉验证方法。 我们可以将留一法交叉验证看作是每折只包含单个样本的k折交叉验证。对于每次划分&#xff0c;选择单个数据点作为测试集。这种方法可能非常耗时&#xff0c;特征是对于大型数据&#xff0c;但是小型数据集上有时可以给出更好的估计结果&am…

生产环境部署Nginx服务器双机热备部署-keepalived(多种模式教程)

前言&#xff1a;今天演示下生产环境keepalived的部署方式&#xff0c;安装模式有很多&#xff0c;比如说主备模型和双主模型&#xff0c;主备分&#xff1a;抢占模式 和 非抢占模式。这里我会一一展开说具体怎么配置一、双节点均部署Nginx&#xff1a; 第一步&#xff1a;上传…

MSYS2教程(windows环境下使用linux工具)

MSYS2教程(windows环境下使用linux工具) 1.msys2简介 MSYS2&#xff08;Minimal SYStem 2&#xff09;是一个集成了大量的GNU工具链、工具和库的开源软件包集合。它提供了一个类似于Linux的shell环境&#xff0c;可以在Windows系统中编译和运行许多Linux应用程序和工具。 MS…

Hive SQL:实现炸列(列转行)以及逆操作(行转列)

目录 列转行行转列 列转行 函数&#xff1a; EXPLODE(ARRAY)&#xff1a;将ARRAY中的每一元素转换为每一行 EXPLODE(MAP)&#xff1a;将MAP中的每个键值对转换为两行&#xff0c;其中一行数据包含键&#xff0c;另一行数据包含值 数据样例&#xff1a; 1、将每天的课程&#…

我的世界服务器-高版本服务器-MC服务器-生存服务器-RPG服务器-幻世星辰

生存为主&#xff0c;RPG乐趣为辅&#xff0c;重视每位玩家的建议&#xff0c;一起打造心目中的服务器&#xff0c;与小伙伴一起探险我的世界&#xff01; 服务器版本: 1.18.2 ~ 1.20.4 Q群&#xff1a; 338238381 服务器官网: 星辰毛毛雨-Minecraft高版本生存服务器我的世界…

C语言入门-指针和数组5

指针和地址 地址 地址是内存中一个特定位置的标识符。每个内存位置都有一个唯一的地址&#xff0c;用于存储数据。这些地址通常表示为十六进制数。 物理地址&#xff1a;硬件层次上的实际内存地址。逻辑地址&#xff1a;程序运行时使用的地址&#xff0c;由操作系统管理。 …

“蓝潮卫士“水位雨量监测一体机,重塑城市防洪新防线!

​ 6月24日&#xff0c;湖南长沙遭遇了一场突如其来的特大暴雨侵袭。天空像破了个口子&#xff0c;雨水倾盆而下&#xff0c;仅仅1小时&#xff0c;就下了54个西湖&#xff0c;降水量突破了历史同期极值。这场暴雨直接导致了严重的城市内涝问题&#xff0c;部分地区瞬间变成一…

强化学习的数学原理:贝尔曼公式

大纲 这一节课程的大纲&#xff1a; 重点 对于这次课&#xff0c;重点是两个东西&#xff1a; Motivating examples(为什么需要贝尔曼公式) 首先要明白&#xff0c;为什么 return 是重要的&#xff1f; 之前其实就说过&#xff0c;return 能够帮助我们评价一个策略是好还是坏…

阿里云:云通信号码认证服务,node.js+uniapp(vue),完整代码

api文档&#xff1a;云通信号码认证服务_云产品主页-阿里云OpenAPI开发者门户 (aliyun.com) reg.vue <template> <div> <input class"sl-input" v-model"phone" type"number" maxlength"11" placeholder"手机号…

几度互联网站群管理系统全媒体解决方案

随着高考的结束&#xff0c;各高校开启了紧张的招生宣传工作&#xff0c;几度互联网站群系统助力各高校招生宣传。 学校官方网站是互联网时代学校对外交流的重要途径和信息公开的主要载体&#xff0c;是展示学校形象、密切联系师生的重要窗口&#xff0c;是加强校园宣传思想工…

2024 年的 13 个 AI 趋势

2024 年的 13 个 AI 趋势 人工智能对环境的影响和平人工智能人工智能支持的问题解决和决策针对人工智能公司的诉讼2024 年美国总统大选与人工智能威胁人工智能、网络犯罪和社会工程威胁人工智能治疗孤独与对人工智能的情感依赖人工智能影响者中国争夺人工智能霸主地位人工智能…

LVGL实现字库的下载和使用

1 字库 字库的概念&#xff1a;相应文字或字符的合集。 点阵字库&#xff1a;按字库顺序排列的字符/汉字字模的合集。 LVGL中字库使用Unicode编码&#xff0c;Unicode 是全球文字统一编码。它把世界上的各种文字的每一个字符指定唯一编码&#xff0c;实现跨语种、跨平台的应…

分体式天线的应用介绍

分体式天线的主要应用广泛且多样化&#xff0c;以下是对其主要应用的归纳&#xff1a; 1、仓储管理 在RFID仓储项目中&#xff0c;使用性能好的RFID分体式天线可以确保系统的稳定性&#xff0c;更能够降低整个项目的成本。 分体式天线通过其多个天线接口与分体式读写器连接&…

K-Planes代码记录

随记 原文 K-Planes: Explicit Radiance Fields in Space, Time, and Appearance&#xff0c;又要换baseline&#xff0c;可是效果不好能怎么办呢&#xff0c;我可不可以发疯。k-planes的代码又是非常工程琐碎的&#xff0c;大佬的代码果然不顾小白死活。随便记录下整个过程。…

哪个牌子的超声波清洗器好?精选四大超强超声波清洗机力荐

生活中戴眼镜的人群不在少数&#xff0c;然而要维持眼镜的干净却不得不每次都需要清洗&#xff0c;只是通过手洗的方式实在太慢并且容易操作不当让镜片磨损更加严重&#xff01;所以超声波清洗机就诞生了&#xff01;超声波清洗机能够轻松清洗机眼镜上面的油脂污渍&#xff0c;…

Spire.PDF for .NET【文档操作】演示:在 PDF 中创建目录 (TOC)

目录在增强文档的可读性和可导航性方面起着至关重要的作用。它为读者提供了文档结构的清晰概述&#xff0c;使他们能够快速找到并访问他们感兴趣的特定部分或信息。这对于较长的文档&#xff08;例如报告、书籍或学术论文&#xff09;尤其有价值&#xff0c;因为读者可能需要多…
最新文章