帮调过必关
rt,思路是双重循环枚举,样例过了未 TLE,代码:
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,w,now,I;
long long s1,s2,d0,k;
long long end_time,s;
struct wp{
long long t,x,l,r,v;
int bj;
bool miss;
}a[2003];
struct cz{
int i;
bool b;
long long p,t;
}c[4003];
bool cmp(cz c1,cz c2){
if(c1.t!=c2.t)return c1.t<c2.t;
if(a[now].l-(c1.t-a[now].t)*a[now].v!=a[now].l-(c2.t-a[now].t)*a[now].v)return abs(a[now].l-(c1.t-a[now].t)*a[now].v)<abs(a[now].r-(c2.t-a[now].t)*a[now].v);
return c1.p<c2.p;
}
struct endtime{
short zt;
long long t;
int i;
}endd[4003];
bool cmpend(endtime a1,endtime a2){
if(a1.t!=a2.t)return a1.t<a2.t;
if(a1.zt==0||a2.zt==0)return (a1.zt==0);
return (a1.zt==1||a1.zt==3);
}
string bugo(short x){
if(x==0)return "miss-0";
if(x==1)return "score-out";
if(x==2)return "miss-out";
if(x==3)return "score-in";
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i].x>>a[i].l>>a[i].r>>a[i].t>>a[i].v;
for(int i=1;i<=m*2;i+=2){
int cp,ca,cb;
cin>>cp>>ca>>cb;
c[i].b=1,c[i].p=cp,c[i].t=ca,c[i].i=i;
c[i+1].p=cp,c[i+1].t=cb,c[i+1].i=i;
}
cin>>d0>>s1>>s2>>w;
d0*=d0;
for(int i=1;i<=n;i++){
now=i;
sort(c+1,c+m*2+1,cmp);
for(int j=1;j<=m*2;j++){
if(c[j].t<a[i].t)continue;
if(a[i].miss)break;
long long dl=a[i].l-(c[j].t-a[i].t)*a[i].v,dr=a[i].r-(c[j].t-a[i].t)*a[i].v;
// if(i==1)cerr<<c[j].t<<' '<<a[i].l<<' '<<(c[j].t-a[i].t)*a[i].v<<' '<<dl<<':'<<2<<endl;
if(!a[i].bj&&c[j].b){
long long d2;
d2=(a[i].x-c[j].p)*(a[i].x-c[j].p)+(dl*dl);
if(d2<=d0){
a[i].bj=c[j].i;
long long d=d2;
s+=(d0-d)*s1;
endd[I].i=i;
endd[I].t=c[j].t,endd[I].zt=3;I++;
}
}
else if(!c[j].b&&a[i].bj==c[j].i){
long long d2;
d2=(a[i].x-c[j].p)*(a[i].x-c[j].p)+(dr*dr);
if(d2<=d0){
long long d=d2;
s+=(d0-d)*s1;
a[i].miss=1;
endd[I].i=i;
endd[I].t=c[j].t,endd[I].zt=1;I++;
break;
}
else{
a[i].miss=1;
endd[I].i=i;
endd[I].t=c[j].t,endd[I].zt=2;I++;
break;
}
a[i].bj=0;
}
}
if(!a[i].miss){
if(!a[i].bj){
long long miss_time=a[i].t+(a[i].l)/a[i].v+1;
endd[I].i=i;
endd[I].t=miss_time,endd[I].zt=0;I++;
a[i].miss=1;
}
}
}
sort(endd,endd+I,cmpend);
for(int i=0;i<I;i++){
cerr<<endd[i].t<<':'<<endd[i].i<<' '<<bugo(endd[i].zt)<<endl;
if(endd[i].zt==2||endd[i].zt==0){
if(!w){
cout<<s<<'\n'<<endd[i].t;
return 0;
}
else w--;
}
if(endd[i].zt==1||endd[i].zt==3){
k++;
s+=k*s2;
}
else k=0;
}
end_time=endd[I-1].t;
cout<<s<<'\n'<<end_time;
return 0;
}
cerr 语句颗用作调试。