[Gym 102423]-Elven Efficiency | 思维

2023-10-21 20:20

本文主要是介绍[Gym 102423]-Elven Efficiency | 思维,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接
在这里插入图片描述

题意:
给定n个数a[i],然后有m个数 k i 1 ≤ i ≤ m k_i \ 1 \leq i \leq m ki 1im,对于每一个k,将这n个数中未k的倍数的数字加1,一次轮询m个数,问最操作次数

以样例为例:
3 5
10
11
12
2
11
4
13
2

10 11 12
->2 倍数有10、12则变为:操作2次
11 11 13
->11 倍数有11、11则变为:操作2次
12 12 13
->4 倍数有12、12则变为:操作2次
13 13 13
->13 倍数有 13、13、13则变为:操作3次
14 14 14
->2 倍数有 14、14、14则变为:操作3次
15 15 15
总共需要操作12次

思路:
原始大小最大为3e5,如果对于m个数中的每一个,都是3e5乃至+1之后的数的因子,都要使得其增加,最大可以到6e5
所以可以筛选1-6e5每个数因子,并且保存,vector facter[x]存储x的因子有哪些
而对于m个数,如果他们的倍数是a[i],那么就需要给a[i]进行一次操作,对答案产生一次贡献
所以第一次,我们可以统计a[i]中每个数出现的次数,并记录对应的a[i]是谁的倍数(已经得到了a[i]的因子,存放在facter[a[i]]中,a[i]的因子为x,那么x的倍数就是a[i],所以说可以利用已经预处理出来的facter[a[i]]得到),facter[a[i]][j] 记录为每个因子,则倍数set bei[facter[a[i]][j]] = a[i]是一定可以确定的,所以说可以直接在处理过程中找到bei[k[i]],对于每一个k的倍数x,贡献加上他们的个数cnt[x],这里的cnt[]需要预处理,并且还要根据+1变化进行再次的统计:+1变化后应该为cnt[x+1] += cnt[x],cnt[x]=0
然后将所有未+1倍数的因子从set中删除,然后统计bei[facter[x+1]],切记不要忘记清空bei[k](因为当前已经处理,如果不清空会导致tle)

Code:

/*** keep hungry and calm PushyTao!***/#pragma GCC optimize (2)
#pragma G++ optimize (2)
/**
#pragma GCC optimize("Ofast,unroll-loops,no-stack-protector,fast-math")
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#pragma comment(linker, "/stack:200000000")#define inline inline __attribute__(                                   \(always_inline, __gnu_inline__, __artificial__))                   \__attribute__((optimize("Ofast"))) __attribute__((target("sse"))) __attribute__((target("sse2"))) __attribute__((target("mmx")))
**/
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <string>
#include <vector>
#include <math.h>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <unordered_map>
using namespace std;typedef long long ll;
ll read() {ll c = getchar(), Nig = 1, x = 0;while (!isdigit(c) && c != '-')c = getchar();if (c == '-')Nig = -1, c = getchar();while (isdigit(c))x = ((x << 1) + (x << 3)) + (c ^ '0'), c = getchar();return Nig * x;
}
#define read read()
const int maxn = 6e5 + 3;
int a[maxn], b[maxn];
vector<int> facter[maxn];
int mp[maxn];
set<int> bei[maxn];
//const int limit = 4e5 + 3;
int main() {int n = read, m = read;for (int i = 1; i <= n; i++) a[i] = read;for (int i = 1; i <= m; i++) b[i] = read;// nlogfor (int i = 2; i < maxn; i++) {for (int j = i; j < maxn; j += i) {facter[j].push_back(i);// j has a facter i}}for (int i = 1; i <= n; i++) {mp[a[i]] ++;if (mp[a[i]] == 1) {for (int yin : facter[a[i]]) {bei[yin].insert(a[i]);//every yin has a bei a[i]}}}ll ans = 0;for (register int i = 1; i <= m; i++) {int k = b[i];//cur kfor (int beishu : bei[k]) {// the beishu of kans += mp[beishu];mp[beishu + 1] += mp[beishu];mp[beishu] = 0;// all + 1for (int yinzi : facter[beishu]) {if (yinzi != k) {bei[yinzi].erase(beishu);// delete beishu}}// beishu+1的因子是yinzi, yinzi的倍数是beishu+1for (int yinzi : facter[beishu + 1]) {bei[yinzi].insert(beishu + 1);}}// clearbei[k].clear();}cout << ans << endl;return 0;
}
/**/

在这里插入图片描述

这篇关于[Gym 102423]-Elven Efficiency | 思维的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/256743

相关文章

颠覆你的开发模式:敏捷思维带来的无限可能

敏捷软件开发作为现代软件工程的重要方法论,强调快速响应变化和持续交付价值。通过灵活的开发模式和高效的团队协作,敏捷方法在应对动态变化和不确定性方面表现出色。本文将结合学习和分析,探讨系统变化对敏捷开发的影响、业务与技术的对齐以及敏捷方法如何在产品开发过程中处理持续变化和迭代。 系统变化对敏捷软件开发的影响 在敏捷软件开发中,系统变化的管理至关重要。系统变化可以是需求的改变、技术的升级、

Creating OpenAI Gym Environment from Map Data

题意:从地图数据创建 OpenAI Gym 环境 问题背景: I am just starting out with reinforcement learning and trying to create a custom environment with OpenAI gym. However, I am stumped with trying to create an enviro

0906作业+思维导图梳理

一、作业: 1、创捷一个类似于qq登录的界面 1)源代码 #include "widget.h"#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget){ui->setupUi(this);//QPushbutton:登录、退出this->join = new QP

[机缘参悟-222] - 系统的重构源于被动的痛苦、源于主动的精进、源于进化与演进(软件系统、思维方式、亲密关系、企业系统、商业价值链、中国社会、全球)

目录 前言:系统的重构源于被动的痛苦、源于主动的精进、源于进化与演进 一、软件系统的重构 1、重构的定义与目的 2、重构的时机与方法 3、重构的注意事项 4、重构的案例分析 二、大脑思维的重构 1、大脑思维重构的定义 2、大脑思维重构的方法 3、大脑思维重构的挑战与前景 三、认知的重构 1、定义 2、目的 3、方法 四、实例 五、总结 四、婚姻家庭的重构 1、婚

每日一题~cf 970 div3 (A思维,B小模拟,C二分,D排列数建图成环,E 26个字母暴力+前缀和,F 逆元,G 数论gcd )

A 题意: 有 a 个1 ,b 个2.问是否能将这些数划分为两个数值相等的集合。 输出 YES 或者 NO —————— 问题等价于 将数组 分成两个数值相同的数组。所以sum 应该是偶数。也就是说 1 的个数是偶数。在i1的个数是偶数的情况下,将 2 分成两份,如果2 的个数是偶数,OK。如果是奇数那么需要1来补齐,如果1 的个数大于等于2那么可以补齐。(1 的个数是偶数,需要2个1来补齐,剩下

散户炒股票为什么进步慢,学习程序化交易思维

炒股自动化:申请官方API接口,散户也可以 python炒股自动化(0),申请券商API接口 python炒股自动化(1),量化交易接口区别 Python炒股自动化(2):获取股票实时数据和历史数据 Python炒股自动化(3):分析取回的实时数据和历史数据 Python炒股自动化(4):通过接口向交易所发送订单 Python炒股自动化(5):通过接口查询订单,查询账户资产 散户炒股的常见难题

数业智能心大陆告诉你如何培养孩子的批判性思维?

现今的教育体系自小学起便强调培养孩子的批判性思维,这种能力被视为在复杂世界中生存和发展的关键。在当今信息爆炸的时代,它能让我们在海量信息中辨别真伪、深入思考并做出明智决策。如今,如数业智能心大陆产出的AI 心理咨询平台的出现为培养孩子批判性思维提供了新可能,其通过互动引导孩子思考,助力孩子提升批判性思维能力。 什么是批判性思维呢? 批判性思维是一种思考方式,它能够使我们在接收信

华为OD机试 - 最优结果的a数组数量 - 贪心思维(Java 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。 一、题目描述

互联网思维总结

目录 互联网八大思维 一 互联网思维 一 用户思维 二 产品思维 三 免费思维 四 社群思维 五 大数据思维 六 自媒体思维 七 跨界思维 八 平台思维 总结 互联网八大思维 简要列举以下思维,用户思维,社会化思维,大数据思维,简约思维,极致思维,跨界思维,流量思维,迭代思维,平台思维。 任何企业都可以找到一个竞争对手打,但是有一个对手是打不赢的,就是趋势,趋势一

【codeforces】gym 101137 K - Knights of the Old Republic【用最小生成树对图做集合dp】

题目链接:【codeforces】gym 101137 K - Knights of the Old Republic 考虑对图集合dp,一个连通块的dp值为两个连通块的值的和或者强制加一条新边后的最小值,取个最小值(边从小到大枚举,则强制加一条最大的边会导致连通块内较小的边一定都选,则会构成一个生成树)。用kruskal实现这个dp过程即可。 #include <bits/stdc++.h>