SP13707 SHAHBG - SHAHBAG
题意
一个数列,每次操作把一个位置改成 1,
每次操作后,求数列中有多少段连续的 1。
思路
分类讨论,考虑每次操作的位置的左右两边的数(只是两个数):
- 左右两边的数都是 0:...0 1 0...
这个位置单独构成一段,答案加一。
- 左右两边的数都是 1:...01...1 1 1...10...
这个位置把原来左右两段连成一段,答案减一。
- 一边是 0,一边是 1:
...01...1 1 0...0...或者 ...0...0 1 1...10...
这个位置会接到左边或者右边的段,答案不变。
代码
#include <iostream>
using namespace std;
bool a[20050];int n, ans;
int main()
{
cin >> n;
for(int i = 0, t;i < n;++i)
{
cin >> t;a[t] = 1;
if(!a[t - 1] && !a[t + 1]) ++ans;
else if(a[t - 1] && a[t + 1]) --ans;
cout << ans << endl;
}
cout << "Justice" << endl;
return 0;
}