AcWing 3729. 改变数组元素(详细注释)
原题链接
中等
作者:
无限前进
,
2023-02-13 21:46:06
,
所有人可见
,
阅读 264
有问题我尽量解决
#include<iostream>
#include<cstring>
using namespace std;
int N,n,t;
int a[200010],idx=1,sum;//从1到n,寄!!我数组开小了
int main(){
scanf("%d",&N);
while(N--){//接收一共几个数据
scanf("%d",&n);//得到数据集的大小
//考虑到这道题考察的是对一段数组进行加减
//低情商:循环(TLE),高情商:拆分
for(int i=1;i<=n;i++){
scanf("%d",&t);//收到此轮数字
if(t!=0){
if(t>idx){//t可能大于目前数组 V所包含的元素个数,`此时`视为将数组内所有元素变为 1。
t=idx;
}//确保t的范围是正常的
a[idx-t+1]++;//数组拆分的知识
a[idx+1]--;
//例如我有原数组1 2 3 4 6
//拆分后为1 1 1 1 2
//我需要增加第2位和第4位之间的值
//那么,需要对第二位(2)和第五位(4+1)进行操作
//拆分数组变为1 2(1+1) 1 1 1(2-1)
}
idx++;//芜湖,无论怎样idx都要增加
}
for(int i=1;i<idx;i++){
sum+=a[i];
if(sum)
printf("1 ");
else
printf("0 ");
}
printf("\n");
idx=1,sum=0;
memset(a,0,sizeof(a));
}
return 0;
}
详细啊