前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >改变数组元素

改变数组元素

作者头像
浪漫主义狗
发布于 2023-02-21 03:52:14
发布于 2023-02-21 03:52:14
63800
代码可运行
举报
文章被收录于专栏:HAUE_LYS'BlogHAUE_LYS'Blog
运行总次数:0
代码可运行

Original link

思想

  • 前缀和与差分。
  • 对于 a[i] 的操作,构建差分数组 b[i] 记录被操作的区间。
  • 利用前缀和可知所有被操作的区间,即 b[i] != 0 的区间。

代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <bits/stdc++.h>
using namespace std;

const int N = 1e6 + 3;

int a[N], b[N];

void solve(){
    int n; cin >> n; 
    for(int i = 1; i <= n; i ++){
        b[i] = 0;  //重置
        cin >> a[i];  //记录操作
    }
    for(int i = 1; i <= n; i ++){
        if(a[i] >= i) b[1] ++, b[i + 1] --;  //a[i] 超出范围,则当前全部区间都被操作了
        else if(a[i] < i && a[i] != 0) b[i - a[i] + 1] ++, b[i + 1] --;  //否则操作后 a[i] 个数,正数为第 i - a[i] + 1 的位置开始
    }
    for(int i = 1; i <= n; i ++){
        b[i] += b[i - 1];  //前缀和计算每个区间被操作的次数
        if(b[i] != 0) cout << 1 << ' ';  //不为 0 说明该位置被操作过
        else cout << 0 << ' ';
    }
    cout << endl;
}

int main(){
    int _; cin >> _;
    while(_ --) solve();
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-2-14 1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
截断数组
Original Link 思想: 前缀和。 特殊情况: 当数组元素小于三个时,无解。 当该数组所有数之和不为 3 的整数倍时,无解。 设数组均分的值为 res,循环遍历前缀和数组 a。 设 i 为分割点,若 a[i] == res,说明将 i 作为分割点有可能成立,记录分割点数量为 cnt ++。 设 n - i + 1 为第二个分割点,若 a[n] - a[n - i + 1] == res,则说明该分割点可以与 i 之前的所有分割点进行分割数组,记录分割方案为 ans += cnt。 代码: #
浪漫主义狗
2023/02/21
2.2K0
火星购物
Original Link 思想: 前缀和,双指针。 快指针 i 作为某一分割区间的右端点,慢指针 j 作为该区间的左端点; 当 a[i] - a[j + 1] >= m 时,需要将 j 右移,直到满足 a[i] - a[j] <= m, 此时判断 a[i] - a[j] 的值,若满足 a[i] - a[j] == m 说明可以找到恰好等于所需价格的区间,并标记; 若 a[i] - a[j] >= m 说明不存在等于所需价格的解,此时需要维护最小接近的值 ans。 代码: #include <bits/st
浪漫主义狗
2023/02/21
8090
最大连续子序列和(最大子数组和)四种最详细的解法
解法1:穷举暴力法 枚举左端点跟右端点,然后遍历更新所有的子序列和,最终得到结果就是最大的
杨鹏伟
2020/09/10
5.9K0
圆形牛棚
Original Link 思想: 前缀和。 由于牛棚为环状,故将数组首尾相连。 利用 sum 记录牛牛们需要走的距离,前缀和记录 a[i] 扇门 i ~ n 的距离。 从连接后的数组开始,即 i = n ~ 2 * n 开始遍历,sum 减去后一个房间牛牛走过的距离,再加上该房间牛牛走到 i + n 的距离。 维护一个最小的 ans = min(ans, sum) 即可。 代码: #include <bits/stdc++.h> using namespace std; typedef long lon
浪漫主义狗
2023/02/21
1.6K0
前缀和与差分数组[通俗易懂]
例:n个数,m次操作。每一次操作都给定区间和数值[l,r]+del.最后有q个询问,问[l,r]点的值或者单点查值。 注:先进行m个修改操作,后进行查询操作。(离线的区间区间修改问题)
全栈程序员站长
2022/09/05
4660
前缀和与差分数组[通俗易懂]
前缀和算法题(区间次方和、小蓝平衡和、大石头的搬运工、最大数组和)
prefix表示前缀和,前缀和由一个用户输入的数组生成。对于一个数组a[](下标从1开始),我们定义一个前缀和数组prefix[],满足:
走在努力路上的自己
2024/03/04
2640
前缀和算法题(区间次方和、小蓝平衡和、大石头的搬运工、最大数组和)
Educational Codeforces Round 132 (Rated for Div. 2) A·B·C
---- A. Three Doors ---- 原题链接 Origional Link ---- 思想 从拿到钥匙的门开始,用其得到的钥匙遍历对应的门 直到钥匙为0,若共打开了3道门,则为YES ---- 代码 #include <bits/stdc++.h> using namespace std; const int N = 10; void solve(){ int a[N]; int n; cin >> n; int flag = 1; //记录打开的
浪漫主义狗
2022/09/16
2860
最短距离
Original Link 思想: 前缀和。 由于出口为环状,故将数组首尾相连。 构造前缀和数组,即可得到在任意出口顺时针方向或逆时针向走到对应出口的距离之和。 对于每次询问,输出顺时针和逆时针方向上,两个出口最短的距离即可。 代码: #include <bits/stdc++.h> using namespace std; const int N = 1e6 + 3; typedef long long LL; int a[N]; void solve(){ int n; cin >> n
浪漫主义狗
2023/02/24
2960
AcWing 第69场周赛
4615. 相遇问题 ---- 原题链接 题目大意: 求一维数轴上 x 和 y 分别以速度 a,b 相向而行时,相遇所需时间是否为整数。 ---- 思想: 签到题。 输出判断 a + b 是否可以整除 y - x 即可。 ---- 代码: #include <bits/stdc++.h> using namespace std; typedef long long LL; void sovle(){ LL x, y, a, b; cin >> x >> y >> a >> b; if
浪漫主义狗
2022/10/28
2490
前缀和、二维前缀和与差分的小总结
如果我给你一串长度为n的数列a1,a2,a3......an,再给出m个询问,每次询问给出L,R两个数,要求给出区间[L,R]里的数的和,你会怎么做,若是没有了解过前缀和的人看到这道题的想法可能是对于m次询问,我每次都遍历一遍它给的区间,计算出答案,这样子的方法固然没错,但是其时间复杂度达到了O(n*n),如果数据量稍微大一点就有可能超时,而我们如果使用前缀和的方法来做的话就能够将时间复杂度降到O(n+m),大大节省了运算时间。至于怎么用,请看下面一小段代码
ACM算法日常
2019/07/05
2.5K0
【算法】前缀和、模拟、位运算、差分
先把所有的数加起来,在这个过程之中把偶数放到堆中,在遍历这个全是偶数的堆k次,每次让所有数之和减去最大偶数的一半,如果最大偶数除2后还是偶数还要重新添加到堆中,在这个过程中还要关注堆是否已经空了。
_小羊_
2025/03/15
410
【算法】前缀和、模拟、位运算、差分
1. 基础算法初识
逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i<j 且 a[i]>a[j],则其为一个逆序对;否则不是。
浪漫主义狗
2022/07/11
3750
1. 基础算法初识
Codeforces Round #807 (Div 2.) A·B·C
---- A. Mark the Photographer ---- 原题链接 Original Link ---- 思想 将所有人的身高存入数组 ,用sort排序 利用双指针,以n为分界线,判断是否满足条件 前n个人的身高+ x小于等于后n个人的身高 ---- 代码 #include <bits/stdc++.h> using namespace std; const int N=1e6+3; int a[N]; int main(){ int t; scanf("%d",&t
浪漫主义狗
2022/09/09
2390
Codeforces Round #674 (Div. 3) A ~ F 详细讲解
思路+题意:就是除了第一层有两个单元的话,其余的楼层都有x个单元。自己动手推一推就知道了。然后就是取余跟做除,看看在当前这层,还是下一层。不要忘了 加上第一层。
杨鹏伟
2020/10/10
3160
KMP算法
一个文本串$S$(主串)和一个模式串$P$,求$P$在$S$中出现的位置,或者$P$在$S$中出现的次数,等等问题。
xiaohejun
2020/02/18
5270
数组操作
Origional Link 思想: 贪心,模拟。 首先对数组进行从小到大排序,再找到第一个 a[idx] != 0 的位置。 对于每次询问,以 base 记录当前数组已经减去的总值,判断时应当计算当前元素与 base 的差值。 若 a[idx] - base > 0 说明需要将后续所有元素减去值 a[idx] - base,将该值加和到 base 中。 若 a[idx] - base == 0 说明当前元素在操作后已经为 0,则需要向后寻找操作后不为 0 的元素。 由于贪心的思想,数组中的所有的元素一定满
浪漫主义狗
2023/03/01
8190
枚举(蓝桥练习)
枚举算法是一种基本的算法思想,它通过穷举所有可能的情况来解决问题。它的基本思想是将问题的解空间中的每个可能的解都枚举出来,并进行验证和比较,找到满足问题条件的最优解或者所有解。 枚举算法适用于问题规模较小、解空间可穷举的情况。它的优点是简单直观,不需要复杂的数学推导,易于实现。但是,由于需要穷举所有可能的情况,对于问题规模较大的情况,枚举算法的时间复杂度可能会非常高,效率较低。
走在努力路上的自己
2024/02/29
1810
枚举(蓝桥练习)
CodeTON Round 2 (Div. 1 + Div. 2, Rated, Prizes!)(A~D)
若使得a == b,则a[4]之前的元素中,必然存在某元素a[i] == b[0],才可通过相关操作使得a[4] == b[0]
浪漫主义狗
2022/09/19
2580
CodeTON Round 2 (Div. 1 + Div. 2, Rated, Prizes!)(A~D)
比例简化
Original Link 思想1: 暴力枚举。 枚举分子 i 和分母 j,利用 eps 作为差值的最小值来判断更新条件。 代码: #include <bits/stdc++.h> using namespace std; void solve(){ double a, b; int L; cin >> a >> b >> L; int aa, bb; double eps = 1e6; for(int i = 1; i <= L; i ++){ for
浪漫主义狗
2023/02/21
1.2K0
河南工程学院第六届程序设计竞赛-A组-题解
HF 告诉 LYS 说:“我最近学习了二分开根号!!!” LYS 说:“那我给你出一个开五次方根的题目!” HF 感觉太简单了,就来找你们解决这个问题。
浪漫主义狗
2023/12/18
2560
河南工程学院第六届程序设计竞赛-A组-题解
相关推荐
截断数组
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验