AtCoder Beginner Contest 353 A~E(F,G更新中...)

A.Buildings

题意

给出若干个建筑,每个建筑有一个高度,问,从第二个建筑开始,比第一个建筑高的建筑中编号最小的是多少?如果不存在,输出-1.

分析

边输入边比较即可,如果循环结束还未找到,输出-1.

代码

#include<bits/stdc++.h>

using namespace std;

int a[200005];

void solve() {
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        if (i - 1 && a[i] > a[1]) {
            cout << i << endl;
            return;
        }
    }
    cout << -1 << endl;
}

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

B.AtCoder Amusement Park(模拟)

题意

n n n个小团体需要乘坐小船,第 i i i个团体有 a i a_i ai个人,而小船只有 k k k个座位。同时,小团体需要按照给出的顺序来乘坐小船,且同一个团体中的人必须乘坐同一艘小船,问,需要多少只小船,才能满足所有的小团体。

分析

模拟即可,每次检查当前小船是否还能放下当前的团体人数,如果够,就加入当前小船中,如果不够,开一艘新的小船,用于放置当前的小团体。

代码

#include<bits/stdc++.h>

using namespace std;

int a[200005];

void solve() {
    int n, k;
    cin >> n >> k;
    int sum = 0, cnt = 1;
    for (int i = 1; i <= n; i++) {
        int a;
        cin >> a;
        sum += a;
        if (sum > k) {
            sum = a;
            cnt++;
        }
    }
    cout << cnt << endl;
}

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

C.Sigma Problem(前缀和+二分)

题意

给出一个函数 f ( x , y ) = ( x + y ) f(x, y) = (x + y) % 10^{8} f(x,y)=(x+y),求:

  • ∑ i = 1 n − 1 ∑ j = i + 1 n f ( a i , a j ) \sum\limits_{i = 1}^{n - 1}\sum\limits_{j = i + 1}^{n} f(a_i, a_j) i=1n1j=i+1nf(ai,aj)

分析

由于给出的函数 f ( x , y ) f(x, y) f(x,y)是将两个数字相加,而加法是可交换的,那么 f ( x , y ) = f ( y , x ) f(x, y) = f(y, x) f(x,y)=f(y,x)。 然后求和要求的是任意两个不同数字经过函数运算后相加的结果,那么任意交换给出的数字是不会改变答案的。

因此,为了便于处理,可以把数组排序。

排序完成后,可以先维护前缀和,因为不难发现,对于每个 a [ i ] a[i] a[i],均需要与前面每个数字进行一次函数运算,那么在不考虑取模的情况下,产生的结果为 p r e [ i − 1 ] + ( i − 1 ) × a [ i ] pre[i - 1] + (i - 1) \times a[i] pre[i1]+(i1)×a[i],其中 p r e [ i − 1 ] pre[i - 1] pre[i1]表示前 i − 1 i - 1 i1个数字的前缀和。

然后考虑取模需要减掉的部分,不难想到,对于 x + y < 1 0 8 x + y < 10^{8} x+y<108的情况,是不需要进行取模的,而 x + y ≥ 1 0 8 x + y \ge 10^{8} x+y108时,则每次运算的取模均相当于减去一个 1 0 8 10^{8} 108,由于数组已经经过排序了,那么只需要通过二分对 1 0 8 − a [ i ] 10^{8} - a[i] 108a[i]进行查找,就可以知道需要减去的数字所在的起点是多少,那么这个查找到的位置到下标 i − 1 i - 1 i1之间的所有数字与当前数字 a [ i ] a[i] a[i]进行运算,均需要减掉 1 0 8 10^{8} 108,令 c n t cnt cnt为需要减去的数量,则 a [ i ] a[i] a[i]产生的贡献为

  • p r e [ i − 1 ] + ( i − 1 ) × a [ i ] − c n t ∗ 1 0 8 pre[i - 1] + (i - 1) \times a[i] - cnt * 10^{8} pre[i1]+(i1)×a[i]cnt108

代码

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;

const int mod = 1e8;
ll a[300005], pre[300005];


void solve() {
    ll n;
    ll ans = 0;
    cin >> n;
    for (ll i = 1; i <= n; i++) {
        cin >> a[i];
    }
    sort(a + 1, a + n + 1);
    for (ll i = 1; i <= n; i++) {
        pre[i] = pre[i - 1] + a[i];
    }
    for (ll i = 2; i <= n; i++) {
        int id = lower_bound(a + 1, a + i, mod - a[i]) - a;
        ans += pre[i - 1] + (i - 1) * a[i] - (mod * (i - id));
    }
    cout << ans << endl;
}

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

D.Another Sigma Problem(后缀和)

题意

给出一个函数 f ( x , y ) = x y f(x, y) = xy f(x,y)=xy

例:

  • f ( 3 , 14 ) = 314 f(3, 14) = 314 f(3,14)=314

  • f ( 100 , 1 ) = 1001 f(100, 1) = 1001 f(100,1)=1001

请你求出以下操作取模后的结果:

  • ∑ i = 1 n − 1 ∑ j = i + 1 n f ( a i , a j ) \sum\limits_{i = 1}^{n - 1}\sum\limits_{j = i + 1}^{n}f(a_i, a_j) i=1n1j=i+1nf(ai,aj)

分析

当前给出的函数 f ( x , y ) f(x, y) f(x,y)可以将数字分为两个部分,前半部分需要乘上 1 0 y的十进制位数 10^{\text{y的十进制位数}} 10y的十进制位数,后半部分直接加上。

那么对于 a i a_i ai来说,与前面的 i − 1 i - 1 i1个数字运算后,产生的贡献为 ( i − 1 ) × a i (i - 1) \times a_i (i1)×ai,与后面的 n − i n - i ni个数字运算后,产生的贡献为 ∑ j = 1 10 1 0 j × c n t j × a i \sum\limits_{j = 1}^{10} 10^{j} \times cnt_j \times a_i j=11010j×cntj×ai,其中 c n t j cnt_j cntj表示 a i + 1 ∼ a n a_{i + 1} \sim a_n ai+1an中十进制位数为 j j j的数字数量。

对于 ( i − 1 ) × a i (i - 1) \times a_i (i1)×ai,可以直接通过计算得到,而 c n t j cnt_j cntj可以通过预处理后缀和来快速计算得到,即使用 n x t [ i ] [ j ] nxt[i][j] nxt[i][j]表示 i ∼ n i \sim n in之间十进制位数为 j j j的数字个数.

代码

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;

const int mod = 998244353;
ll a[300005], nxt[300005][15];

int getlen(int x) {
    int cnt = 0;
    while (x) {
        cnt++;
        x /= 10;
    }
    return cnt;
}

void solve() {
    ll n;
    ll ans = 0;
    cin >> n;
    for (ll i = 1; i <= n; i++) {
        cin >> a[i];
    }
    for (ll i = n; i >= 1; i--) {
        for (int j = 1; j <= 10; j++) {
            nxt[i][j] = nxt[i + 1][j];
        }
        nxt[i][getlen(a[i])]++;
    }
    for (ll i = 1; i <= n; i++) {
        ans += (i - 1) * a[i] % mod;
        ans %= mod;
        ll mul = 1;
        for (int j = 1; j <= 10; j++) {
            mul *= 10;
            ans = (ans + mul * nxt[i + 1][j] % mod * a[i] % mod) % mod;
        }
    }
    cout << ans << endl;
}

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

E.Yet Another Sigma Problem(哈希)

题意

给出一个函数 f ( x , y ) f(x, y) f(x,y),表示字符串 x x x y y y的最长公共前缀长度。

请你求出:

  • ∑ i = 1 n − 1 ∑ j = i + 1 n f ( S i , S j ) \sum\limits_{i = 1}^{n - 1}\sum\limits_{j = i + 1}^{n}f(S_i, S_j) i=1n1j=i+1nf(Si,Sj)

分析

可以不用直接考虑当前字符串与前面所有字符串中的最长公共前缀长度,而是依次考虑长为 1 ∼ S i . s i z e ( ) 1 \sim S_i.size() 1Si.size()的前缀在前面的字符串中作为前缀的个数。

为什么可以这么做?

不难想到,此时将所有长度的字符串均设置为贡献1,那么长度为1的前缀会产生1点贡献,长度为2的前缀也会产生1点贡献,依次类推,最后计算出的贡献与所求的答案是一致的。

而字符串匹配是比较麻烦的,很难快速的进行检查,因此,可以使用哈希将字符串转化为数字(为了避免冲突,这里选择了双模数),而转化成的数字范围也是较大的,使用数组并不方便维护,可以使用map进行维护,即 m a p [ x ] = y map[x] = y map[x]=y表示字符串 x x x作为前缀的出现次数为 y y y

那么对于每个字符串,枚举这个字符串所有的前缀字符串,然后加上这个前缀在前面字符串中的出现次数,并将该前缀更新到map中。

代码

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;

map<pair<int, int>, int> H;

int base = 131, mod[] = {1000000007, 998244353};


void solve() {
    int n;
    cin >> n;
    ll ans = 0;
    for (int i = 1; i <= n; i++) {
        string s;
        ll hashCode[5] = {0, 0};
        cin >> s;
        for (auto j : s) {
            hashCode[0] = (hashCode[0] * base % mod[0] + j) % mod[0];
            hashCode[1] = (hashCode[1] * base % mod[1] + j) % mod[1];
            ans += H[make_pair(hashCode[0], hashCode[1])];
            H[make_pair(hashCode[0], hashCode[1])]++;
        }
    }
    cout << ans << endl;
}

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

F,G更新中…

赛后交流

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

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

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

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

相关文章

【muzzik 分享】Cocos 物理帧同步

# 前言 之前没研究帧同步&#xff0c;这是我前端时间没上班时边玩边搞做的 Demo 研究成果&#xff0c;总共时间一周&#xff08;实际2-3天&#xff09;&#xff0c;发布的目的也很简单&#xff0c;打破技术垄断&#xff0c;才能诞生更高端的技术成果。而且就算我没发这篇帖子&…

重生奇迹mu战士攻略有哪些

1、生命之光&#xff1a;PK前起手式&#xff0c;增加血上限。 2、雷霆裂闪&#xff1a;眩晕住对手&#xff0c;战士PK战士第一技能&#xff0c;雷霆裂闪是否使用好关系到胜负。 3、霹雳回旋斩&#xff1a;雷霆裂闪后可以选择用霹雳回旋斩跑出一定范围(因为对手下一招没出意外…

Mybatis技术内幕-基础支撑层

整体架构 MyBatis 的整体架构分为三层&#xff0c; 分别是基础支持层、核心处理层和接口层。 基础支持层 基础支持层包含整个MyBatis 的基础模块&#xff0c;这些模块为核心处理层的功能提供了良好的支撑。 解析器模块 XPathParser MyBatis提供的XPathParser 类封装了XPat…

SpringCloud使用Nacos作为配置中心实现动态数据源切换

一、Nacos-Server 了解Nacos可以直接阅读官方文档 使用Nacos&#xff0c;我们需要有Nacos-Server&#xff0c;此处就不使用官方提供的release版本了&#xff0c;而是自己编译&#xff0c;因为本来就是Java开发的&#xff0c;所以对于Javaer来说也没啥难度&#xff01; git c…

记nrm管理仓库以及发布npm包

前言 记一次在公司创建私有库以及发布npm包&#xff0c;留下个脚印 一、nrm是什么&#xff1f; nrm是 npm 镜像源管理工具&#xff0c;用于快速地在不同的 npm 源之间切换。 二、使用步骤 1.全局安装nrm 代码如下&#xff08;示例&#xff09;&#xff1a; npm install -…

Git系列:git diff使用技巧

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

【智能算法】鹭鹰优化算法(SBOA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2024年&#xff0c;Y Fu受到自然界中鹭鹰生存行为启发&#xff0c;提出了鹭鹰优化算法&#xff08;Secretary Bird Optimization Algorithm, SBOA&#xff09;。 2.算法原理 2.1算法思想…

Elasticsearch查看集群信息,设置ES密码,Kibana部署

Elasticsearch查看集群信息&#xff0c;设置ES密码&#xff0c;Kibana部署 查看集群信息查看节点信息查看集群健康状态查看分片信息查看其他集群信息 Kibana部署安装设置ES密码 查看集群信息 查看节点信息 curl http://127.0.0.1:9200/_cat/nodes?v 参数说明&#xff1a; ip…

OpenGL导入的纹理图片错位

在OpenGL中导入图片的纹理照片的函数为 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, p_w, p_h, 0, GL_BGR, GL_UNSIGNED_BYTE, pic_data);其中p_w, p_h为图片的宽和高&#xff0c;pic_data为指向图片存储空间的的地址(unsigned char *类型) 在OpenGL中图片默认是4字节对齐的&…

Web开发小知识点(二)

1.关于取余 我在Dart语言里&#xff08;flutter项目&#xff09; int checkNum (10 - 29) % 10; 那么checkNum等于1 但是在Vue项目里 const checkNum (10 - 29) % 10;却等于-9 语言的特性不同&#xff0c;导致结果也不同&#xff0c;如果要想和Dart保持一致&#xff0c;…

vue3.0(六) toRef,toValue,toRefs和toRow,markRaw

文章目录 toReftoValuetoRefstoRowmarkRawtoRef和toRefs的区别toRaw 和markRaw的用处 toRef toRef 函数可以将一个响应式对象的属性转换为一个独立的 ref 对象。返回的是一个指向源对象属性的 ref 引用&#xff0c;任何对该引用的修改都会同步到源对象属性上。使用 toRef 时需…

[蓝桥杯 2021 国 ABC] 123(java)——前缀和,思维

目录 题目 解析 代码 这么久了&#xff0c;我终于能不看别人代码完整写出来了&#xff0c;呜呜呜。虽然过程也是很曲折。 题目 解析 这个题&#xff0c;找其中数列的规律&#xff0c;1,1,2,1,2,3,1,2,3,4&#xff0c;...&#xff0c;因此我们把拆分成行列&#xff0c;如下…

Java并发处理

Java并发处理 问题描述:项目中业务编号出现重复编号 生成编号规则&#xff1a;获取数据库表最大值&#xff0c;然后再做1处理&#xff0c;即为新编号&#xff08;因为起始值是不固定的&#xff0c;还存在‘字符数据’格式&#xff0c;做了字典项可配置&#xff0c;所以不能直…

Ai 一键美术绘画文章,蓝海项目,流量巨大,盈利成效显著

今天我要向大家介绍一个全新的蓝海项目&#xff0c;那就是AI一键美术绘画文章。这个项目打破了传统的思维模式&#xff0c;更加吸引人的眼球&#xff0c;已经在各大网站上引发了大量的关注&#xff0c;轻松在抖音上热门也变得简单易行且稳定。 下载 地 址 &#xff1a; laoa…

PopClip for Mac 激活版:让文本处理更高效

还在为繁琐的文本处理而烦恼吗&#xff1f;PopClip for Mac来帮您解决&#xff01;这款神器般的文本处理工具&#xff0c;能让您轻松应对各种文本处理任务。无论是写作、编程还是日常办公&#xff0c;PopClip for Mac都能助您一臂之力&#xff0c;让您的文本处理更高效、更便捷…

【基础绘图】 09.小提琴图

效果图&#xff1a; 主要步骤&#xff1a; 1. 数据准备&#xff1a;生成随机数组 2. 数据处理&#xff1a;计算四分位数、中位数、均值、最大最小值 3. 图像绘制&#xff1a;绘制小提琴图 详细代码&#xff1a;着急的直接拖到最后有完整代码 步骤一&#xff1a;导入库包及…

动态规划----股票买卖问题(详解)

目录 一.买卖股票的最佳时机&#xff1a; 二.买卖股票的最佳时机含冷冻期&#xff1a; 三.买卖股票的最佳时期含⼿续费&#xff1a; 四.买卖股票的最佳时机III: 五.买卖股票的最佳时机IV: 买卖股票的最佳时机问题介绍&#xff1a;动态规划买卖股票的最佳时机是一个经典的…

排序2——冒泡排序,快速排序(3种递归方式+3种非递归方式)

目录 1.交换排序 2.冒泡排序 2.1基本思路 1.1.2复杂度分析 3.快速排序 3.1基本思想 3.2Hoare版本&#xff08;最初的&#xff09; 3.2.1缺点 3.2.2优化 第一种——随机选key 第二种——三数取中 第三种——小区间优化 3.3挖坑版本&#xff08;更好理解&#xff09…

【谷粒商城】01-环境准备

1.下载和安装VirtualBox 地址&#xff1a;https://www.virtualbox.org/wiki/Downloads 傻瓜式安装VirtualBox 2.下载和安装Vagrant官方镜像 地址&#xff1a;https://app.vagrantup.com/boxes/search 傻瓜式安装 验证是否安装成功 打开CMD,输入vagrant命令&#xff0c;是否…

pyqt5将ui文件转为python文件

在pyqt5中使用 pyuic将ui文件转为py文件&#xff1a; 例如&#xff1a;将home.ui文件转为vio_detect.py文件&#xff0c;所需命令如下&#xff1a; pyuic5 -x home.ui -o vio_detect.py