链接

题意:在1到m的数字中满足 x-3或x+3 在 牌河中出现的数字个数

题解:定义一个数组a[N],来统计数字x出现的次数。定义sum表示不重复数字的个数。

每往牌河中添加一个数字,a[x-3]++ , a[x+3]++。如果a[x-3]==0,那么sum++;a[x+3]同理。

每在牌河中删除一个数组,a[x-3]-- , a[x+3]--。如果a[x-3]==0,那么sum--;a[x+3]同理。

代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>
#include <math.h>
#include <string>
#include <set>
#define PI 3.14159
using namespace std;

typedef pair<int,int> PII;
typedef long long LL;
const int MAX_INT =  0x3f3f3f3f;
const int N = 1e5+15;
const int mod = 1e9+7;
int a[N];

void solve()
{
    int m,q;
    cin>>m>>q;
    int sum = 0;
    while(q--)
    {
        int op,num;
        cin>>op>>num;
        if(op==1)
        {
            int x = num - 3;
            int y = num + 3;
            if(x>=1)
            {
                if(a[x]==0)sum++;
                a[x]++;
            }
            if(y<=m)
            {
                if(a[y]==0)sum++;
                a[y]++;
            }
        }
        else
        {
            int x = num - 3;
            int y = num + 3;
            if(x>=1)
            {
                a[x]--;
                if(a[x]==0)sum--;
            }
            if(y<=m)
            {
                a[y]--;
                if(a[y]==0)sum--;
            }
        }
        cout<<sum<<endl;
    }
    
}

int main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    
    int T = 1;
    while(T--)
    {
        solve();
    }
}