精度问题求调,玄关
查看原帖
精度问题求调,玄关
654577
RainySoul楼主2024/9/24 19:25
#include<bits/stdc++.h>
#define double long double
#define inf 0x3f3f3f3f
#define int long long
using namespace std;
struct zyx{
	double x;
	int num;
};
struct csq{
	double l,r;
	int s;
};
vector<csq> ans[3010]; 
int D,n,K,q,flag[3010],w[3010];
double k[3010],b[3010];
vector<zyx> point; 
inline int read(){
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=x*10+c-'0';
		c=getchar();
	}
	return x*f;
} 
bool cmp(zyx a,zyx b){
	return a.x<b.x||(a.x==b.x&&a.num>b.num);
}
signed main(){
	D=read(),K=read(),n=read(),q=read();
	for(int i=1;i<=n;i++){
		int a=read(),tb=read();
		w[i]=read();
		k[i]=(tb-a)*1.0/D,b[i]=a;
	}
	for(int i=1;i<=n;i++){
		point.clear();
		for(int j=1;j<=n;j++){
			if(i==j||abs(k[i]-k[j])<=1e-15)continue;
			double temp=(b[j]-b[i])/(k[i]-k[j]);
		 	if(temp>1e-15&&temp-D<1e-15)point.push_back((zyx){temp*1.0,j});
		}
		point.push_back((zyx){0.0,3005}),point.push_back((zyx){D*1.0,3005});
		memset(flag,-1,sizeof flag);
		bool f=0;
		int sum=0;
		for(int j=1;j<=n;j++){
			if(i==j)continue;
			if(abs(b[j]-b[i])<=1e-15&&f==0){
				point.push_back((zyx){0.0,j});
				f=1;
				if(k[j]-k[i]>1e-15)flag[j]=0;
				else flag[j]=-1;
			}
			else if(b[j]-b[i]>1e-15)flag[j]=1,sum+=w[j];
			else flag[j]=0;
		}
		sort(point.begin(),point.end(),cmp);
		for(int j=0;j<point.size()-1;j++){
			ans[i].push_back((csq){point[j].x,point[j+1].x,sum});
			if(point[j+1].num==3005)continue;
			if(flag[point[j+1].num]==1)sum-=w[point[j+1].num];
			else if(flag[point[j+1].num]!=-1)sum+=w[point[j+1].num];
		}
	}
	int lstans=0;
	while(q--){
		int p=read(),l=read();
		int r=l+K;
		lstans=0;
		bool tf=0;
		for(int i=0;i<ans[p].size();i++){
			if(ans[p][i].l-r>=1e-15)break;
			if(ans[p][i].r-l>1e-15)tf=1,lstans=max(lstans,ans[p][i].s);
			if(ans[p][i].l-r<=1e-15&&tf==1)lstans=max(lstans,ans[p][i].s);
		}
		cout<<lstans<<'\n';
	}
	return 0;
}

60pts,WA on #1

2024/9/24 19:25
加载中...