AtCoder Beginner Contest 356 A~E(F更新中...)

A.Subsegment Reverse

题意

给出三个正整数 N , L , R N, L, R N,L,R

对于一个序列 A = ( 1 , 2 , … , N ) A = (1, 2, \ldots, N) A=(1,2,,N),请你输出翻转了 L ∼ R L \sim R LR之间数字后得到的序列。

分析

使用循环进行翻转即可。

代码

#include <bits/stdc++.h>
using namespace std;
const int N = 3e5 + 5e2;

int a[N];

void solve() {
    int n, l, r;
    cin >> n >> l >> r;
    for (int i = 1; i <= n; i++) {
        a[i] = i;
    }
    for (int i = l, j = r; i <= j; i++, j--) {
        swap(a[i], a[j]);
    }
    for (int i = 1; i <= n; i++) {
        cout << a[i] << ' ';
    }
}

int main () {
    solve();
    return 0;
}

B.Nutrients

题意

高桥每天需要补充 M M M种营养物质,第 j j j种营养物质至少需要补充 A j A_j Aj单位。

今天,他将会吃掉 N N N种食物,其中第 i i i种食物能依次获得 X i , 1 , X i , 2 , … , X i , M X_{i, 1}, X_{i, 2}, \ldots, X_{i, M} Xi,1,Xi,2,,Xi,M营养,其中 X i , j X_{i, j} Xi,j表示第 i i i种食物提供的 j j j营养物质的数量。

问:今天能否获得足够的营养?

分析

直接在输入的 A A A数组中减去每个食物对应的营养即可。

如果输入完成后, A A A数组里只存在负数和 0 0 0,那么就表示获得了足够的营养,否则。说明没有获得足够的营养。

代码

#include <bits/stdc++.h>
using namespace std;

const int N = 3e5 + 5e2;

int a[N];

void solve() {
    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= m; i++) {
        cin >> a[i];
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            int x;
            cin >> x;
            a[j] -= x;
        }
    }
    for (int i = 1; i <= m; i++) {
        if (a[i] > 0) {
            cout << "No" << endl;
            return;
        }
    }
    cout << "Yes" << endl;
}

int main () {
    solve();
    return 0;
}

C.Keys(二进制枚举)

题意

N N N把钥匙,其中有真有假。

有一扇门,每次可以选择若干把钥匙一起开门,如果其中至少包含 k k k把真的钥匙,那么就可以把门打开。

你对这个门尝试了 M M M次以下操作:

  • 选择 C i C_i Ci把钥匙 A i , 1 , A i , 2 , … , A i , C i A_{i, 1}, A_{i, 2}, \ldots, A_{i, C_i} Ai,1,Ai,2,,Ai,Ci,并尝试打开门。

  • 获得当前尝试的结果 R i R_i Ri

    • 如果 R i = ′ o ′ R_i = 'o' Ri=o:表示门被打开了

    • 如果 R i = ′ x ′ R_i = 'x' Ri=x:表示门未被打开

已知钥匙的真假情况共有 2 N 2^{N} 2N种,请问其中有多少种情况满足 M M M次操作的结果。

分析

由于 n ≤ 15 n \le 15 n15,那么 2 n ≤ 2 15 = 32768 2^{n} \le 2^{15} = 32768 2n215=32768,因此,总的方案数是很小的,可以使用一个长度为 n n n的二进制串表示钥匙的真假情况,即二进制串第 i i i位为 0 0 0表示第 i i i把钥匙为假,第 i i i位为 1 1 1表示第 i i i把钥匙为真。

然后枚举所有可能的二进制串 ( 0 ∼ 2 n − 1 ) (0 \sim 2^{n} - 1) (02n1),并检查每个二进制串是否满足题目要求,即能打开门的方案中真钥匙的数量是否大于等于 k k k,不能打开门的方案中真钥匙的数量是否小于 k k k。如果满足题目要求,就记录答案数量加一。

最后输出记录的答案数量即可。

代码

#include <bits/stdc++.h>
using namespace std;

const int N = 3e2 + 5e2;

int n, m, k, c[N], r[N], a[N][N];

bool check(int x) {
    for (int i = 1; i <= m; i++) {
        int cnt = 0;
        for (int j = 1; j <= c[i]; j++) {
            if ((x & (1 << (a[i][j] - 1))) != 0) {
                cnt++;
            }
        }
        if (cnt >= k && r[i] == 1 || cnt < k && r[i] == 0) {} else {
            return 0;
        }
    }
    return 1;
}

void solve() {
    cin >> n >> m >> k;
    for (int i = 1; i <= m; i++) {
        cin >> c[i];
        for (int j = 1; j <= c[i]; j++) {
            cin >> a[i][j];
        }
        char op;
        cin >> op;
        if (op == 'o') r[i] = 1;
        else r[i] = 0;
    }
    int ans = 0;
    for (int i = (1 << n) - 1; i >= 0; i--) {
        if (check(i)) {
            ans++;
        }
    }
    cout << ans << endl;
}

int main () {
    solve();
    return 0;
}

D.Masked Popcount(数学)

题意

给出两个数字 N , M N, M N,M,请你计算KaTeX parse error: Expected 'EOF', got '&' at position 40: …opcount(k\text{&̲}M)取模 998244353 998244353 998244353的结果。

分析

先不考虑 M M M,先考虑 ∑ k = 0 N p o p c o u n t ( k ) \sum\limits_{k = 0}^{N}popcount(k) k=0Npopcount(k)的结果。

使用 a n s [ i ] ans[i] ans[i]表示 1 ∼ N 1 \sim N 1N之间二进制第 i i i为为一的数字个数。

那么 ∑ k = 0 N p o p c o u n t ( k ) = ∑ i = 0 59 a n s [ i ] \sum\limits_{k = 0}^{N}popcount(k) = \sum\limits_{i = 0}^{59}ans[i] k=0Npopcount(k)=i=059ans[i]

然后打表来找一下规律:

  • n = 1 n = 1 n=1时, a n s = [ 1 ] ans = [1] ans=[1]
  • n = 2 n = 2 n=2时, a n s = [ 1 , 1 ] ans = [1, 1] ans=[1,1]
  • n = 4 n = 4 n=4时, a n s = [ 2 , 2 , 1 ] ans = [2, 2, 1] ans=[2,2,1]
  • n = 8 n = 8 n=8时, a n s = [ 4 , 4 , 4 , 1 ] ans = [4, 4, 4, 1] ans=[4,4,4,1]
  • n = 16 n = 16 n=16时, a n s = [ 8 , 8 , 8 , 8 , 1 ] ans = [8, 8, 8, 8, 1] ans=[8,8,8,8,1]
  • n = 2 i n = 2^{i} n=2i时, a n s = [ 2 i − 1 , 2 i − 1 , … , 2 i − 1 , 1 ] ans = [2^{i - 1}, 2^{i - 1}, \ldots, 2^{i - 1}, 1] ans=[2i1,2i1,,2i1,1]

这样就可以找到 n n n 2 2 2的次方数,对每位二进制产生的贡献。

那如果 n = 2 i + a ( a < 2 i ) n = 2^{i} + a(a < 2^{i}) n=2i+a(a<2i)呢?

不难想到, 2 i ∼ 2 i + a 2^{i} \sim 2^{i} + a 2i2i+a最高的二进制位固定为 1 1 1,那么共有 1 + a 1 + a 1+a个这样的数字,对第 i i i个二进制位产生的贡献即为 1 + a 1 + a 1+a,然后让 n n n减去 2 i 2^{i} 2i,继续计算剩余的 n n n还能产生的贡献即可。

因此,可以依次枚举 59 ∼ 0 59 \sim 0 590,如果 n ≥ 2 i n \ge 2^{i} n2i,那么就让所有的 a n s [ j ] ( j = 0 ∼ ( i − 1 ) ) ans[j](j = 0 \sim (i - 1)) ans[j](j=0(i1))均加上 2 i − 1 2^{i - 1} 2i1,并让 a n s [ i ] ans[i] ans[i]加上 1 + n 1 + n 1+n % 2 i 2^{i} 2i,然后让 n n n减去 2 i 2^{i} 2i

这样,就可以得到了 ∑ k = 0 N p o p c o u n t ( k ) = ∑ i = 0 59 a n s [ i ] \sum\limits_{k = 0}^{N}popcount(k) = \sum\limits_{i = 0}^{59}ans[i] k=0Npopcount(k)=i=059ans[i],然后计算 p o p c o u n t popcount popcount时需要让KaTeX parse error: Expected 'EOF', got '&' at position 9: k \text{&̲} m,那么不难想到,答案即为所有 m m m的二进制位上为 1 1 1对应的 a n s [ i ] ans[i] ans[i]之和。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int mod = 998244353;

ll ans[105];

void solve() {
    ll n, m;
    cin >> n >> m;
    for (int i = 60; i >= 0; i--) {
        if (n >= (1ll << i)) {
            ans[i] = ((ans[i] + 1) % mod + n % (1ll << i)) % mod;
            for (int j = i - 1; j >= 0; j--) {
                ans[j] = (ans[j] + (1ll << (i - 1)) % mod) % mod;
            }
            n -=(1ll << i);
        }
    }
    ll res = 0;
    for (int i = 60; i >= 0; i--) {
        if (m & (1ll << i))
            res = (res + ans[i]) % mod;
    }
    cout << res << endl;
}

int main () {
    solve();
    return 0;
}

E.Max/Min(前缀和)

题意

给出一个序列 A = ( A 1 , … , A n ) A = (A_1, \ldots, A_n) A=(A1,,An),请你求出:

  • ∑ i = 1 n − 1 ∑ j = i + 1 n ⌊ m a x ( A i , A j ) m i n ( A i , A j ) ⌋ \sum\limits_{i = 1}^{n - 1}\sum\limits_{j = i + 1}^{n}\lfloor \frac{max(A_i, A_j)}{min(A_i, A_j)} \rfloor i=1n1j=i+1nmin(Ai,Aj)max(Ai,Aj)

分析

不难想到,如果 A i < A j A_i < A_j Ai<Aj,那么 ⌊ m a x ( A i , A j ) m i n ( A i , A j ) ⌋ = ⌊ A j A i ⌋ \lfloor \frac{max(A_i, A_j)}{min(A_i, A_j)} \rfloor = \lfloor \frac{A_j}{A_i} \rfloor min(Ai,Aj)max(Ai,Aj)=AiAj

因此,可以考虑对所有的 A i A_i Ai,统计 ∑ j = i + 1 n ⌊ A j A i ⌋ \sum\limits_{j = i + 1}^{n}\lfloor \frac{A_j}{A_i} \rfloor j=i+1nAiAj

然后考虑怎么快速计算出 ∑ j = i + 1 n ⌊ A j A i ⌋ \sum\limits_{j = i + 1}^{n}\lfloor \frac{A_j}{A_i} \rfloor j=i+1nAiAj,由于选择的是向下取整,那么对于数字 x x x而言, y = x × j ∼ ( x × ( j + 1 ) ) − 1 y = x \times j \sim (x \times (j + 1)) - 1 y=x×j(x×(j+1))1得到的 ⌊ y x ⌋ \lfloor \frac{y}{x} \rfloor xy均是相同的,因此,可以预处理前缀和,以便于快速知道 x × j ∼ ( x × ( j + 1 ) ) − 1 x \times j \sim (x \times (j + 1)) - 1 x×j(x×(j+1))1之间的数字个数,此时产生的贡献即为 j × ( p r e [ ( x × ( j + 1 ) ) − 1 ] − p r e [ x × j − 1 ] ) × c n t j \times (pre[(x \times (j + 1)) - 1] - pre[x \times j - 1]) \times cnt j×(pre[(x×(j+1))1]pre[x×j1])×cnt,其中 c n t cnt cnt为数字 x x x的出现次数。

因此,可以使用 s u m sum sum数组记录每个数字的出现次数,然后对记录的数字出现次数预处理前缀和。

然后,就可以枚举数字 i i i了,对于数字 i i i,再枚举 j j j 1 1 1 i × j ≤ 1 0 6 i \times j \le 10^{6} i×j106的范围内。统计所有数字产生的贡献即可。

此时计算过程中会多计算了一部分,需要在计算后减去。

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 5e2;
ll sum[N], pre[N];

int main() {
    int n;
    cin >> n;
    for (int i = 1, num; i <= n; i++) {
        cin >> num;
        sum[num]++;
    }
    for (int i = 1; i <= 1e6; i++) {
        pre[i] = pre[i - 1] + sum[i];
    }
    ll ans = 0;
    for (int i = 1; i <= 1e6; i++) {
        for (int j = 1; j * i <= 1e6; j++) {
            ans += j * (pre[min((j + 1) * i - 1, 1000000)] - pre[j * i - 1]) * sum[i];
        }
        ans -= sum[i] * (1 + sum[i]) / 2;
    }
    cout << ans << endl;
    return 0;
}

F.Distance Component Size Query

更新中…

赛后交流

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

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

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

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

相关文章

学工管理系统有什么作用

学生信息办理系统是针对学校学生处的很多作业处理作业而开发的办理软件&#xff0c;首要用于学校学生信息办理&#xff0c;整体使命是完成学生信息联系的体系化、科学化、标准化和自动化&#xff0c;其首要使命是用手机和计算机对学生各种信息进行日常办理&#xff0c;如查询、…

Ubuntu 20.04 LTS配置JDK、Git

一、配置JDK 1.1 更新系统 执行以下命令 sudo apt update 出现以下界面即为安装成功 1.2 安装openjdk-11-jdk Ubuntu20.04中没有默认JDK&#xff0c;执行以下指令安装&#xff0c;默认会自动配置一些必要环境变量 sudo apt install openjdk-11-jdk 1.3 配置环境变量&…

CMake编译安装、生成可执行程序、生成静态动态库以及静态动态库的链接

1 CMake介绍 CMake是一个开源的、跨平台的构建系统&#xff0c;用于管理软件从源代码到可执行文件的整个构建过程。它最初由Kitware公司为ITK&#xff08;Insight Segmentation and Registration Toolkit&#xff09;和VTK&#xff08;Visualization Toolkit&#xff09;等开源…

TimeDao-一篇文章了解清楚Subspace项目

1 项目简介 什么是Subspace网络&#xff1f; Subspace是为下一波加密创建者构建的第四代区块链。旨在实现web3规模扩容。 Subspace允许开发者以互联网规模运行 Web3 应用。它提供了一个简单的接口&#xff0c;用于快速部署按需求自动扩展的多链去中心化应用。Subspace由一个…

Python06 条件判断语句

Python 条件判断语句 Python 条件判断语句格式1if 条件 :else:格式2if 条件 :elif条件 :else:三目: second_max num1 if 条件语句 else num2# 快捷键: tab 整体向右移动一个水平制表符&#xff0c;shift tab 整体向左移动一个水平制表符 num1 10 num2 20 if num2 > num…

每日5题Day15 - LeetCode 71 - 75

每一步向前都是向自己的梦想更近一步&#xff0c;坚持不懈&#xff0c;勇往直前&#xff01; 第一题&#xff1a;71. 简化路径 - 力扣&#xff08;LeetCode&#xff09; class Solution {public String simplifyPath(String path) {Deque<String> stack new LinkedList…

Java17 --- SpringCloud之seate

目录 一、创建seata需要的mysql数据库表 二、修改seata的配置文件 三、启动nacos及seata 四、创建需要的数据库及表 一、创建seata需要的mysql数据库表 CREATE DATABASE seata;CREATE TABLE IF NOT EXISTS global_table(xid VARCHAR(128) NOT NULL,…

电影APP需求规格说明书示范

电影APP需求规格说明书示范 目录结构参考1 引言1.1编写目的1.2背景1.3项目目标1.4 概述 2 整体说明2.1 用例模型2.2 产品功能2.3 用户特点2.4 需求分配 3 具体需求3.1用例描述3.2用例细化 4 支持信息 目录结构参考 计算机软件需求规格说明规范 标准号&#xff1a;GB/T 9385-20…

Jmeter参数化

Jmeter参数化 本质&#xff1a;使用参数的方式来替代脚本中的固定的测试数据 实现方式&#xff1a; 定义变量&#xff08;最基础&#xff09; 文件定义的方式&#xff08;所有测试数据都是固定的情况下&#xff09; 数据库的方式&#xff08;灵活&#xff09; 函数方式&am…

详解 Spark核心编程之广播变量

广播变量是分布式共享只读变量 一、广播变量功能 ​ 广播变量用来将一个较大的数据对象发送到 Executor 并保存在内存中&#xff0c;同一个 Executor 中的所有 Task 都可以读取且只能读取广播变量中的数据&#xff0c;从而达到共享的目的&#xff0c;避免 Executor 中存在大量…

java—MyBatis框架

简介 什么是 MyBatis&#xff1f; MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&…

SparkSql近期使用经验分享

背景 近期在公司使用了SparkSql重构一个由Java开发的ETL程序&#xff0c;因为Java模块不易于修改和部署&#xff0c;而由于SparkSql脚本是由Python开发&#xff0c;便于根据业务需求来开发维护&#xff0c;特别是不需要编译、打包部署。 技术理念 SparkSql是以Sql的形式去开…

三十三篇: 解锁决策之门:专家系统深度探索与未来展望

解锁决策之门&#xff1a;专家系统深度探索与未来展望 在今天这个日益复杂的世界中&#xff0c;我们对决策的速度和质量提出了更高的要求。在众多解决方案中&#xff0c;专家系统作为人工智能的一大分支&#xff0c;扮演着不可或缺的角色。它不仅是技术创新的产物&#xff0c;…

html+CSS+js部分基础运用11

一、改变新闻网页中的字号 1、设计如图1-1所示的界面&#xff0c;要求当网络访问者选择字号中的【大、中、小】时能实现页面字号大小变化&#xff0c;选择“中”时&#xff0c;页面效果如图1所示。 图1 单击前初始状态页面 图2 单击“中”链接后页面 2、div中内容如下&#x…

操作系统|进程和线程的上下文以及他们的上下文切换具体流程?

进程和线程已经是老生常谈的问题了&#xff0c;现在那么他们是如何进行切换的呢&#xff1f;他们之间的切换有什么区别呢&#xff1f;如果你不懂的话&#xff0c;就让我们一起来探讨一下吧&#xff01; 进程上下文切换(context switch) 进程到底由哪些部分组成&#xff1f; …

thingsboard物联网平台快速入门教程

第一步&#xff0c;搭建服务器 使用我已经建好的服务器&#xff0c;thingsboard测试账号,租户管理员账号&#xff0c;物联网测试平台-CSDN博客 第二步&#xff0c;创建一个设备&#xff0c;获取设备Token 用租户管理员账户登录&#xff0c;左侧找到实体->设备&#xff0c…

无法拒绝!GPT-4o 完美适配安卓手机,畅享丝滑体验

无法拒绝&#xff01;GPT-4o 完美适配安卓手机&#xff0c;畅享丝滑体验 前言 人工智能的飞速发展&#xff0c;给我们的生活带来了前所未有的便利。作为AI技术的代表之一&#xff0c;GPT凭借其强大的自然语言处理能力&#xff0c;已经成为许多用户日常生活和工作中的得力助手…

模拟集成电路(6)----单级放大器(共源共栅级 Cascode Stage)

模拟集成电路(6)----单级放大器&#xff08;共源共栅级 Cascode Stage&#xff09; 大信号分析 对M1 V x ≥ V i n − V T H 1 V x V B − V G S 2 V B ≥ V i n − V T H 1 V G S 2 V_{x}\geq V_{in}-V_{TH1}\quad V_{x}V_{B}-V_{GS2}\\V_{B}\geq V_{in}-V_{TH1}V_{GS2} Vx…

Mybatis项目创建 + 规范

文章目录 一、相关概念Mybatis1.1 什么是Mybatis1.1 如何实现简化JDBC 二、如何创建 Mybatis 项目2.1 创建SpringBoot项目 加载依赖2.2 准备数据库 以及 对象的映射2.3 配置数据库连接池2.4 使用Mybatis操作数据库2.5 单元测试 三、其他3.1 数据库与Java对象的映射规则 ---- 结…

【MySQL】Linux安装MySQL

一、center OS环境准备 为了在Linux系统中查看MySQL5.8与8.0版本的区别 我们要准备两个虚拟机&#xff0c;需要的软件&#xff1a;VMware和CentOS7 因为博主之前在学习redis的时候已经安装过一个虚拟机了&#xff0c;所以我就直接克隆了一个CentOS2.0 修改mac地址&#xff0…