被hack,输出1 1,求调。
#include <bits/stdc++.h>
using namespace std;
long long n, m, l, v;
struct node {
long long d, v, a;
}c[100005];
long long p[100005];
long long cs[100005];
struct qj {
long long l, r;
}q[100005], fq[100005];
long long top, top2;
long long Min[100005];
long long b[1000005], qh[1000005];
long long cf[1000005];
void init() {
top = 0;
top2 = 0;
for (long long i = 0; i < 100005; i++) {
cs[i] = 0;
q[i].l = 0;
q[i].r = 0;
fq[i].l = 0;
fq[i].r = 0;
Min[i] = 0;
}
for (long long i = 0; i < 1000005; i++) {
b[i] = 0;
qh[i] = 0;
cf[i] = 0;
}
return ;
}
long long B_S1(long long l, long long r, long long qwq) {//找距qwq点正方向最近的测速仪
if (l == r) return l;
long long mid = (l + r) / 2;
if (p[mid] >= qwq) return B_S1(l, mid, qwq);
else return B_S1(mid + 1, r, qwq);
}
long long B_S2(long long l, long long r, long long qwq) {
if (l == r) return l;
long long mid = (l + r) / 2;
if (c[qwq].v * c[qwq].v + 2 * c[qwq].a * (p[mid] - c[qwq].d) > v * v) return B_S2(l, mid, qwq);
else return B_S2(mid + 1, r, qwq);
}
long long B_S3(long long l, long long r, long long qwq) {
if (l == r) return l;
long long mid = (l + r + 1) / 2;
if ((c[qwq].v * c[qwq].v + 2 * c[qwq].a * (p[mid] - c[qwq].d) <= v * v) || (c[qwq].v * c[qwq].v + 2 * c[qwq].a * (p[mid] - c[qwq].d) < 0)) return B_S3(l, mid - 1, qwq);
else return B_S3(mid, r, qwq);
}
bool cmp(qj a, qj b) {
if (a.l != b.l) return a.l < b.l;
return a.r > b.r;
}
long long B_S4(long long l, long long r, long long qwq) {
if (l == r) return l;
long long mid = (l + r + 1) / 2;
if (cf[mid] <= qwq) return B_S4(mid, r, qwq);
else return B_S4(l, mid - 1, qwq);
}
int main() {
// freopen("detect.in", "r", stdin);
// freopen("detect.out", "w", stdout);
long long T;
cin >> T;
while (T--) {
init();
scanf("%lld %lld %lld %lld", &n, &m, &l, &v);
for (long long i = 1; i <= n; i++) {
scanf("%lld %lld %lld", &c[i].d, &c[i].v, &c[i].a);
}
for (long long i = 1; i <= m; i++) scanf("%lld", &p[i]);
long long cnt = 0;
for (long long i = 1; i <= n; i++) {
if (p[m] < c[i].d) continue;
if (c[i].a > 0) {
if (c[i].v * c[i].v + 2 * c[i].a * (p[m] - c[i].d) > v * v) {
cs[++cnt] = i;
}
}
if (c[i].a == 0) {
if (c[i].v > v) cs[++cnt] = i;
}
if (c[i].a < 0) {
long long res = B_S1(1, m, c[i].d);
if (c[i].v * c[i].v + 2 * c[i].a * (p[res] - c[i].d) > v * v) {
cs[++cnt] = i;
}
}
}
cout << cnt << ' ';
long long Max = -1;
for (long long awa = 1; awa <= cnt; awa++) {
long long i = cs[awa];
if (c[i].a >= 0) {
long long qd = B_S1(1, m, c[i].d);
long long res = B_S2(qd, m, i);
Max = max(Max, res);
}
else {
long long l = B_S1(1, m, c[i].d);
long long r = B_S3(l, m, i);
q[++top].l = l;
q[top].r = r;
}
}
if (Max != -1) {
q[++top].l = Max;
q[top].r = m;
}
sort(q + 1, q + top + 1, cmp);
Min[top + 1] = 2147483647;
for (long long i = top; i >= 1; i--) Min[i] = min(Min[i + 1], q[i].r);
for (long long i = 1; i <= top; i++) {
if (q[i].r >= Min[i + 1]) continue;
fq[++top2] = q[i];
}
// if (T == 16) for (long long i = 1; i <= top2; i++) cout << "qwq " << fq[i].l << ' ' << fq[i].r << endl;
for (long long i = 1; i <= top2; i++) {
b[fq[i].r]++;
}
qh[0] = 0;
for (long long i = 1; i <= p[m]; i++) {
qh[i] = qh[i - 1] + b[i];
}
long long pl = 0;
for (long long i = 1; i <= top2; i++) {
long long res = B_S4(0, pl, fq[i].l - 1);
//////////////
if (qh[fq[i].r] - (pl - res) - qh[fq[i].l - 1] > 1) {
cf[++pl] = fq[i].r;
// cout << "1111 " << fq[i].l << ' ' << fq[i].r << " 1111" << endl;
}
}
cout << m - (qh[p[m]] - pl) << endl;
}
return 0;
}
/*
1
5 5 15 3
0 3 0
12 4 0
1 1 4
5 5 -2
6 4 -4
2 5 8 9 15
3 3
*/