3729. 改变数组元素(差分)
https://www.acwing.com/problem/content/3732/
一维差分,要点是题目给的v数组一开始为空的,可以认为v数组一开始全为0,有n个0(因为加入了n个数),要满足题意得用循环模拟不断往v数组中加入数
在加入数的途中不断的构造差分数组,每次加入一个数都去判断是否满足有ai个数,不满足就设ai为i,这样就满足了题意,即便ai为0,也不会改变差分数组
即便ai大于i,也只是将目前所有位改为1
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 2e5+10;
int n,b[N];
int t;
int main()
{
cin >> t;
while(t--)
{
cin >> n;
memset(b,0,(n+1)*4);//只清除更改的区间,而不是全部,时间复杂度低
for(int i=1;i<=n;i++)//不断地为v数组加入数
{
int x;
cin >> x;
if(x>i)x=i;
int l=i-x+1,r=i;//计算区间
b[l]+=1;//构造差分
b[r+1]-=1;
}
for(int i=1;i<=n;i++)
{
b[i]=b[i-1]+b[i];//构造差分前缀和数组,也就是v数组
}
for(int i=1;i<=n;i++)
cout << !!b[i] << ' ';//!!在c++中只会返回0或1,若b[i]为0,则反一次为1,再反一次为0
//若b[i]>=1,比如233,那么233反一次为0,再反一次为1
cout << endl;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】