当我看到题的时候,我的第一反应哈希来写,就是我建立一个cnt数组,记录安全数字的出现次数,我对那个数+3或-3的值进行自增或自减,每次输入之后去遍历哈希,只要非零就让结果++,不过很显然每次都遍历哈希,1e5*2*1e5会爆掉的;

所以我们换个计算个数的策略,依旧开一个哈希数组cnt来记录安全次数,(用a,b来表示)当第一个数,a为1的时候,我们对第二数,b的cnt[b-3]和cnt[b+3]自增(PS;记得判断边界),这时候问题来了,怎么计算结果呢?诶,且听我细细讲解。

首先,我们发现,当a为1时,只有当b+3和-3的cnt值都为零的时候,结果(int ans)才会增加,比如输入1 4,我们令cnt[1]和【7】从0,变成1,在输入1 10,令cnt【7】和【13】加一,但这个时候只有13是从零变成1,所以此时ans=3(1,7,13),(PS:因为这里没考虑m的值所以和样例有些不同),a=2时,同理,只有当cnt从1变0的时候我们才会令ans++。

代码如下

#include <bits/stdc++.h>

#define endl '\n'

using namespace std;

int arr[100005];

int main(){

int m,q;cin>>m>>q;

int cnt=0;

for(int i=0;i<q;i++){

int a,b;

cin>>a>>b;

if(a==1){

if(b-3>0&&arr[b-3]==0) cnt++;

if(b+3<=m&&arr[b+3]==0) cnt++;

if(b-3>0){

arr[b-3]++;

}

if(b+3<=m) arr[b+3]++;

}else{

if(b-3>0&&arr[b-3]==1) cnt--;

if(b+3<=m&&arr[b+3]==1) cnt--;

if(b-3>0){

arr[b-3]--;

}

if(b+3<=m) arr[b+3]--;

}

cout<<cnt<<endl;

}

}

PS;这种做法还是太低效了,实现居然有335ms,煮波励志给所有写过的代码写题解