SP13707 SHAHBG - SHAHBAG

题意

一个数列,每次操作把一个位置改成 1,

每次操作后,求数列中有多少段连续的 1。

思路

分类讨论,考虑每次操作的位置的左右两边的数(只是两个数):

  1. 左右两边的数都是 0:...0 1 0...

这个位置单独构成一段,答案加一。

  1. 左右两边的数都是 1:...01...1 1 1...10...

这个位置把原来左右两段连成一段,答案减一。

  1. 一边是 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;
}
posted @ 2021-10-18 20:44  Jijidawang  阅读(2)  评论(0编辑  收藏  举报  来源