我这样建,只能拿 60 分:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 9,M = 1e6 + 9,INF = 0x3f3f3f3f;
int T;
int n,m,L,V;
int ans1,ans2;
int s[N];
struct interval{
int l,r;
} t[N];
int cnt;
struct edge{
int to,cost,nex;
} e[M << 3];
int head[N],ecnt;
void addedge(int u,int v,int w){
ecnt++;
e[ecnt] = (edge){v,w,head[u]};
head[u] = ecnt;
}
int dis[N];
bool in_queue[N];
queue<int> q;
void SPFA(int s){
q.push(s);
dis[s] = 0;
in_queue[s] = true;
while(!q.empty()){
int u = q.front();
q.pop();
in_queue[u] = false;
for(int i = head[u];i;i = e[i].nex){
int v = e[i].to;
if(dis[v] < e[i].cost + dis[u]){
dis[v] = e[i].cost + dis[u];
if(in_queue[v])
continue;
in_queue[v] = true;
q.push(v);
}
}
}
}
void clear(){
cnt = ecnt = 0;
ans1 = ans2 = 0;
for(int i = 0;i <= L;i++){
s[i] = 0;
head[i] = 0;
in_queue[i] = false;
dis[i] = -INF;
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin >> T;
while(T--){
cin >> n >> m >> L >> V;
L++;
clear();
for(int i = 1;i <= n;i++){
int d,v,a;
cin >> d >> v >> a;
d++;
if(a > 0){
if(v > V){
t[++cnt] = (interval){d,L};
continue;
}
int q = (V * V - v * v) / (a << 1),r = (V * V - v * v) % (a << 1);
if(d + q + 1 <= L)
t[++cnt] = (interval){d + q + 1,L};
}
else if(a < 0){
if(v <= V)
continue;
int q = (V * V - v * v) / (a << 1),r = (V * V - v * v) % (a << 1);
int ed = min(r ? d + q : d + q - 1,L);
if(d <= ed)
t[++cnt] = (interval){d,ed};
}
else if(v > V)
t[++cnt] = (interval){d,L};
}
for(int i = 1;i <= m;i++){
int p;
cin >> p;
p++;
s[p]++;
}
for(int i = 1;i <= L;i++){
if(s[i]){
addedge(i,i - 1,-1);
addedge(i - 1,i,0);
}
else{
addedge(i,i - 1,0);
addedge(i - 1,i,0);
}
}
for(int i = 1;i <= L;i++)
s[i] += s[i - 1];
for(int i = 1;i <= cnt;i++)
if(s[t[i].r] - s[t[i].l - 1]){
ans1++;
addedge(t[i].l - 1,t[i].r,1);
}
SPFA(0);
ans2 = m - dis[L];
cout << ans1 << ' ' << ans2 << '\n';
}
return 0;
}