链接
code
果然这个数据范围会爆int
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cctype>
#include <vector>
#define int long long
using namespace std;
inline int read(){
int x = 0, op = 1; char ch = getchar();
while (!isdigit(ch)){
if (ch == '-') op = -1; ch = getchar();}
while (isdigit(ch)){
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar();
}
return x * op;
}
inline void write(int x){
if (x < 0) putchar('-'), x = - x;
if (x > 9) write(x / 10);
putchar('0' + x % 10);
}
const int N = 1e5 + 10;
int inRange(int l, int r, int x){
return x >= min(l, r) && x <= max(l, r);
}
int sng(int pos, int x){
return x >= pos? 1: -1;
}
void solve(){
int n = read();
vector<pair<int, int>> move;
for (int i = 0, t, x; i < n; ++i) {
t = read(), x = read();
move.push_back(make_pair(t, x));
}
move.push_back(make_pair(1e12, 0));
int pos = 0, cnt = 0, t = 0, op = 0;
for (int i = 0; i < n; ++i) {
if (t == 0){
t = abs(move[i].second - pos);
op = sng(pos, move[i].second);
}
int temp = min(t, move[i + 1].first - move[i].first);
cnt += inRange(pos, pos + temp * op, move[i].second);
pos += op * temp;
t -= temp;
}
printf("%lld\n", cnt);
}
signed main(){
int cases = read();
while (cases--){
solve();
}
return 0;
}