md服了玄关球为什么
查看原帖
md服了玄关球为什么
780107
joker_opof_qaq楼主2024/11/5 16:59

写的就是O(n^2)洛谷官方数据告诉我20,CCF逆天到0


#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iomanip>
using namespace std;
inline int read(){
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-48;ch=getchar();}
	return x*f;
}
const int N=1e4;
int cnt1[N],cnt2[N][N],pre[N];
struct node{
	double a,d,v;
}a[N];
struct node2{
	int p,knt,cnt2[N];
}b[N];
bool cmp(node2 x,node2 y){
	return x.knt<y.knt;
}
int main(){
	//rp++
	//freopen("detect.in","r",stdin);
	//freopen("detect.out","w",stdout);
	int t=read();
	while(t--){
		int n=read(),m=read(),l=read(),ans=0;
		double v;
		cin>>v;
		bool fg0=1,fgf=1;
		for(int i=1;i<=n;i++){
			a[i].d=read(),a[i].v=read(),a[i].a=read();
			if(a[i].a!=0)fg0=0;
		}
		for(int i=1;i<=m;i++)b[i].p=read();
		if(fg0&&n>=3001){
			//只需要找第m个就可以
			int cnt=0;
			for(int i=1;i<=n;i++){
				if(a[i].d>b[m].p)continue;
				if(a[i].v>v)cnt++;
			} 
			cout<<cnt<<' '<<n-1<<'\n';
			continue;
		}
		for(int i=1;i<=m;i++){
			for(int j=1;j<=n;j++){
				if(a[j].d>b[i].p)continue;
				long double sd=1.0*sqrt(1.0*a[j].v*a[j].v+2.0*a[j].a*(b[i].p-a[j].d));
				if(sd>v){
					cnt1[j]++;
					b[i].cnt2[j]=1;
					b[i].knt++;
//					cout<<sd<<' '<<j<<' '<<p[i]<<endl;
				}
			}
		}
		for(int i=1;i<=n;i++){
			if(cnt1[i]>=1)ans++;
			//cout<<cnt1[i]<<' '; 
		}
		sort(b+1,b+1+m,cmp);
		cout<<ans<<' ';
		int c=0;
		for(int i=1;i<=m;i++){
			int flag=1;
			for(int j=1;j<=n;j++)pre[j]=cnt1[j];
			for(int j=1;j<=n;j++){
				if(b[i].cnt2[j]==0)continue;
				if(b[i].cnt2[j]==1&&cnt1[j]>=2){
					cnt1[j]--;
				}
				else if(b[i].cnt2[j]==1&&cnt1[j]<2){
					flag=0;
//					cout<<j<<endl;
				}
			}
//			for(int j=1;j<=n;j++)cout<<cnt1[j];
//			cout<<endl;
//			for(int j=1;j<=n;j++)cout<<b[i].cnt2[j];
//			cout<<endl;
			if(flag==1){
				c++;
			}
			else{
				for(int j=1;j<=n;j++)cnt1[j]=pre[j];
			} 			
		}
		cout<<c<<'\n';
		for(int i=1;i<=n;i++){
			cnt1[i]=0;
		}
		for(int i=1;i<=m;i++)b[i].knt=0; 
		for(int i=1;i<=m;i++){
			for(int j=1;j<=n;j++)b[i].cnt2[j]=0;
		}
	}
	return 0;
}
/*
1
5 5 15 3
0 3 0
12 4 0
1 1 0
5 5 0
6 4 0
2 5 8 9 15
*/

2024/11/5 16:59
加载中...