题目链接:
E-释怀的RT_2023河南萌新联赛第(二)场:河南工业大学 (nowcoder.com)
题目大意:
给n个格子,每个格子上的数代表可以照亮左右两边的长度,格子本身不能被照亮,问一共有多少个格子能被照亮。
题目思路:
将每个灯能照亮的格子+1,那么不能照亮的地方的值就为0,累计有多少个不为0的格子,即为最终答案。由于要多次修改区间值,所以考虑使用差分来优化,再注意一下边界就好了。
如何差分优化:
s+=b[i]; //s为当前格子的前缀和
代码实现:
#include<iostream>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<stdio.h>
#define int long long
using namespace std;
const int N=1e6+10;
int n;
int a[N];
signed main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
a[max((int)1,i-x)]++;
a[i]--;
a[i+1]++;
a[min((int)n+1,i+x+1)]--;
}
int s=0,cnt=0;
for(int i=1;i<=n;i++)
{
s+=a[i];//前缀和,判断当前的格子有没有被照亮
if(s>0)cnt++;
}
cout<<cnt<<endl;
return 0;
}