当我看到题的时候,我的第一反应哈希来写,就是我建立一个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,煮波励志给所有写过的代码写题解

京公网安备 11010502036488号