rt,考场上没过性质 A,但是事实证明第 9 和 10 点都过了。
所以说啊!CCF 的数据就没让我失望过!
顺手放出 80 代码求条 qwq。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+4;
const int L=1e6+4;
const int inf=1e9;
ll t,n,m,l,V;
ll a1,a2,p[N];
ll ner1[L],ner2[L];
struct node{
ll d,v,a;
ll t1,t2;
}c[N];
bool cmp(node x,node y){
return x.t2<y.t2;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>t;
while(t--){
cin>>n>>m>>l>>V;
for(int i=1;i<=n;i++){
cin>>c[i].d>>c[i].v>>c[i].a;
c[i].t1=c[i].t2=0;
}
for(int i=1;i<=m;i++){
cin>>p[i];
}
a1=a2=0;
ll lst=inf,id=m;
for(int i=l;i>=1;i--){
if(p[id]==i){
id--;
lst=i;
}
ner1[i]=lst;
}
lst=-inf;
id=1;
for(int i=1;i<=l;i++){
if(p[id]==i){
id++;
lst=i;
}
ner2[i]=lst;
}
for(int i=1;i<=n;i++){
if(c[i].a==0){
if(c[i].v>V&&c[i].d<=p[m]){
a1++;
c[i].t1=c[i].d;
c[i].t2=l;
}
}
if(c[i].a>0){
ll dis=V*V-c[i].v*c[i].v;
if(dis<0&&c[i].d<=p[m]){
a1++;
c[i].t1=c[i].d;
c[i].t2=l;
continue;
}
if(dis==0&&c[i].d<p[m]){
a1++;
c[i].t1=c[i].d+1;
c[i].t2=l;
continue;
}
if(c[i].d*2*c[i].a+dis<p[m]*2*c[i].a){
a1++;
c[i].t1=c[i].d+(dis/(2*c[i].a))+1;
c[i].t2=l;
}
}
if(c[i].a<0){
if(c[i].v>V){
ll dis=V*V-c[i].v*c[i].v;
if(c[i].d*2*c[i].a+dis<=ner1[c[i].d]*2*c[i].a){
a1++;
c[i].t1=c[i].d;
if((-dis)%(-2*c[i].a)!=0){
c[i].t2=c[i].d+(dis/(2*c[i].a));
}else{
c[i].t2=c[i].d+(dis/(2*c[i].a))-1;
}
c[i].t2=min(c[i].t2,l);
}
}
}
}
sort(c+1,c+n+1,cmp);
lst=0;
for(int i=1;i<=n;i++){
if(!c[i].t1&&!c[i].t2){
continue;
}
if(lst<c[i].t1){
lst=ner2[c[i].t2];
a2++;
}
}
cout<<a1<<' '<<m-a2<<'\n';
}
return 0;
}