Robô Ocupado
Título
O robô inicialmente aceita comandos na origem em um eixo digital em um determinado momento e avança na direção do comando. Ele avança 1 distância por segundo. Ignora outros comandos no momento atual quando não atinge o final do comando atual . Se o robô estiver em [ti, ti + 1] [t_i, t_ {i + 1}][ tEu,ti + 1] Mova-se paraxi x_identro do tempoxEu A posição é considerada a conclusão de um comando (comandos ignorados podem ser executados com sucesso)
Dê uma série de instruções e pergunte quantas vezes o robô pode completar
Ideias
Grave o ponto de cada instrução começando st sts t e ponto finaled ede d a próximarede detempo de paradan e t A última vez que um comando executável foi recebidoultimamentel para s
Percorra cada instrução se o tempo de instrução atual for maior ou igual à reden e t indica que o comando atual pode ser executado para atualizarnet, st, ed, las net, st, ed, lasn e t 、s t 、e d 、l a s
Caso contrário, julgue se o robô pode estar em [ti, ti + 1] [t_i, t_ {i + 1}][ tEu,ti + 1] Mova-se paraxi x_identro do tempoxEuA localização é baseada em tit _itEuTempo para ti + 1 t_ {i + 1}ti + 1O robô passa xi x_i no momentoxEu
Código
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define mod 1000000007
using namespace std;
inline int gcd(int a, int b) {
return b ? gcd(b, a % b) : a; }
typedef long long LL;
typedef pair<int, int>PII;
const int N = 100100;
int n;
LL tim[N];
LL pos[N];
void solve() {
cin >> n;
for (int i = 0; i < n; ++i) {
cin >> tim[i] >> pos[i];
}
tim[n] = 1e10;
LL net = 0; //下一次停止的时间
LL st = 0, ed = 0; //一次指令的起点和终点
LL las = 0; //上一次接收到命令的时间
LL res = 0;
for (int i = 0; i < n; ++i) {
if (tim[i] >= net) {
net = tim[i] + abs(pos[i] - ed);
st = ed, ed = pos[i];
las = i;
if (net <= tim[i + 1])
res++;
}
else {
if (st >= ed) {
int y = st - (tim[i] - tim[las]);
int x = max(ed, st - (tim[i + 1] - tim[las]));
if (pos[i] >= x && pos[i] <= y)res++;
}
else {
int x = st + (tim[i] - tim[las]);
int y = min(ed, st + tim[i + 1] - tim[las]);
if (pos[i] >= x && pos[i] <= y)res++;
}
}
}
cout << res << endl;
}
int main() {
int t; cin >> t;
while (t--)
solve();
return 0;
}