WA 10pts 求调(悬关)
查看原帖
WA 10pts 求调(悬关)
1072502
Zskioaert1106楼主2024/12/28 22:02

帮调过必关

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;
}
  • 101101 行的 cerr 语句颗用作调试。
2024/12/28 22:02
加载中...