思路:遍历 先判断当前操作执不执行 若执行 则更新走之前的时间和地点 和 走之后的时间和地点 若我走到头都下一个指令都不到 即当前指令有效 当前指令若不执行 则判断上次有效指令走之前的时间当前时间能走到什么位置 和下一次指令的开始时间能走到哪 若当前的目标位置为这个范围之内 则当前指令有效
#include<bits/stdc++.h>
#define ios ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
using namespace std;using ll = long long;using PLL = pair<ll,ll>;
const ll MAX = 1e18;const ll MIN = -1e18;const ll INF=0x3f3f3f3f;
const ll Q = 2e5+9;const ll MOD = 1e9 + 7;
ll ti[Q],pos[Q];
void solve(){
ll n;cin>>n;
for (ll i = 1; i <= n; i++)
{
cin>>ti[i]>>pos[i];
}
ti[n+1]=MAX;
ll ans=0;
ll prepos=0,nowpos=0;
ll pretime=0,nowtime=0;
for (ll i = 1; i <= n; i++)
{
if(ti[i]>=nowtime){
pretime=ti[i];
prepos=nowpos;
nowtime=ti[i]+abs(prepos-pos[i]);
nowpos=pos[i];
if(ti[i+1]>=nowtime) ans++;
}else{
ll l,r;
if(nowpos>prepos)
{
l=prepos+(ti[i]-pretime);
r=min(prepos+(ti[i+1]-pretime),nowpos);
if((pos[i]>=l and pos[i]<=r)){
ans++;
}
}else{
l=prepos-(ti[i]-pretime);
r=max(prepos-(ti[i+1]-pretime),nowpos);
if((pos[i]<=l and pos[i]>=r)){
ans++;
}
}
}
}
cout<<ans<<"\n";
}
int main(){
ios;ll _=1;cin>>_;
while (_--)solve();
return 0;
}