卡壳点:n m弄反了,结构体没有正确排序导致卡壳。之前一直强调解题不要跳步,要按照必要流程走一遍,结果还是一直出错,突然意识到这就像在错题本错误原因上写粗心大意一样,解决不了问题,还得要再系统总结一次并放在一起记忆,做题时按照记忆的步骤走一遍。
// 9:50~10:08
// 15:04~15:21
// 没有固定范围,所以不属于滑动窗口
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef pair<int,int> PII;
const int N = 1e5 + 10;
int last[N],v[N];
bool st[N];
PII f[N];
int main(){
int n,m,t;
cin >> n >> m >> t;
for(int i = 0; i< m;i++){
int a,b;
scanf("%d%d",&a,&b);
f[i] = {a,b};
}
sort(f,f+m);
for(int i = 0;i < m;){
int j = i;
while(f[i] == f[j] && j < m) j++;// 必定动一次,所以后面的cnt=j-i而不是j-i+1
int cnt = j - i,id = f[i].second,time = f[i].first;
i = j;
v[id] -= (time - last[id] - 1);
// cout << v[id] << " " << id << endl;
// cout << cnt << endl;
if(v[id] < 0) v[id] = 0;
if(v[id] <= 3) st[id] = false;
v[id] += cnt * 2;
if(v[id] > 5) st[id] = true;
last[id] = time;
// cout << v[id] << " " << id << endl;
}
for(int i = 1;i <= n;i++){
v[i] -= t - last[i];
if(v[i] <= 3) st[i] = false;
}
int ans = 0;
for(int i = 1;i <= n;i++){
if(st[i]) ans++;
// cout << i << endl;
}
cout << ans << endl;
return 0;
}