社区讨论

论如何让帖子标题更吸引人

P11290【MX-S6-T2】「KDOI-11」飞船参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mhizmmot
此快照首次捕获于
2025/11/03 18:19
4 个月前
此快照最后确认于
2025/11/03 18:19
4 个月前
查看原帖
这一道题目的 Subtask 是不是没有给全呀?
就是这一份代码放上去,x{1,2}x\in\{1,2\}x{1,2,4}x\in\{1,2,4\} 的点还是 TLE 了。
CPP
#include<bits/stdc++.h>
#define MAXN 100001
using namespace std;
int n,q,eof,p[MAXN],t[MAXN],x[MAXN];
double ans;
namespace Sub0{
	void dfs(int dep,double rate,double res){
		if(p[dep]>=eof){
			res-=double(p[dep]-eof)/rate;
			ans=min(ans,res);
			return;
		}
		dfs(dep+1,rate,res+double(p[dep+1]-p[dep])/rate);
		if(x[dep]!=1){
			rate*=x[dep];
			dfs(dep+1,rate,res+double(p[dep+1]-p[dep])/rate+t[dep]);	
		}
	}
	inline void Main(){
		p[++n]=1e9;
		x[n]=1;
		while(q--){
			scanf("%d",&eof);
			ans=1e18;
			dfs(0,1,0);
			printf("%.6lf\n",ans);
		}
	}
}
namespace Sub1{
	inline void Main(){
		while(q--){
			scanf("%d",&eof);
			printf("%d\n",eof);
		}
	}
}
namespace Sub2{
	double dp[110][110][310];
	inline double rate(int i,int j){
		if(pow(2,min(i,31))*pow(3,min(j,24))>=1e9){
			return 1e12;
		}
		return pow(2,i)*pow(3,j);
	}
	inline void Main(){
		dp[0][0][0]=0;
		int max2=0,max3=0;
		p[++n]=1e9;
		x[n]=1;
		for(int i=1;i<=n;++i){
			for(int _2=0;_2<=40;++_2){
				for(int _3=0;_3<=40;++_3){
					dp[i][_2][_3]=0x3f3f3f3f;
				}
			}
			for(int _2=0;_2<=max2;++_2){
				for(int _3=0;_3<=max3;++_3){
					dp[i][_2][_3]=dp[i-1][_2][_3]+1.0*(p[i]-p[i-1])/rate(_2,_3);
				}
			}
			int now2=0,now3=0;
			if(x[i-1]%2==0){
				++now2;
			}
			if(x[i-1]%3==0){
				++now3;
			}
			if(x[i-1]%4==0){
				++now2;
			}
			for(int _2=now2;_2<=max2;++_2){
				for(int _3=now3;_3<=max3;++_3){
					dp[i][_2][_3]=min(dp[i][_2][_3],dp[i-1][_2-now2][_3-now3]+1.0*(p[i]-p[i-1])/rate(_2,_3)+t[i-1]);
				}
			}
			max2+=now2;
			max3+=now3;
		}
		
		while(q--){
			int y;
			scanf("%d",&y);
			int l=1,r=n,pos=1;
			while(l<=r){
				int mid=(l+r)>>1;
				if(p[mid]<=y){
					pos=mid;
					l=mid+1;
				}else{
					r=mid-1;
				}
			}
//			cout<<endl<<p[pos]<<endl;
			double ans=1e12;
			int now2=0,now3=0;
			if(x[pos]%2==0){
				++now2;
			}
			if(x[pos]%3==0){
				++now3;
			}
			if(x[pos]%4==0){
				++now2;
			}
			for(int _3=0;_3<=31;++_3){
				int k=log2(1e9/pow(3,_3));
				for(int _2=0;_2<=k;++_2){
					if(dp[pos][_2][_3]>=0x3f3f3f3f){
						continue;
					}
//					cout<<_2<<" "<<_3<<" "<<rate(_2,_3)<<" "<<dp[pos][_2][_3]+(y-p[pos])/rate(_2,_3)<<endl;
					ans=min(ans,min(dp[pos][_2][_3]+(y-p[pos])/rate(_2+now2,_3+now3)+t[pos],dp[pos][_2][_3]+(y-p[pos])/rate(_2,_3)));
				}
			}
			printf("%.6lf\n",ans);
			
//			cout<<endl<<endl;
		}
		
//		cout<<dp[2][0][0]<<" "<<dp[3][1][1]<<" "<<dp[4][2][1]<<" "<<dp[5][2][1]<<endl;
	}
} 
namespace Sub3{
	double dp[MAXN][40];
	inline int Log2(int x){
		if(x==1){
			return 0;
		}
		if(x==2){
			return 1;
		}
		return 2;
	}
	inline double rate(int _2){
		if(_2>=31){
			return 1e12;
		}
		return pow(2,_2);
	}
	inline void Main(){
		p[++n]=1e9;
		x[n]=1;
		int max2=0;
		for(int i=1;i<=n;++i){
			for(int j=max2+1;j<=39;++j){
				dp[i][j]=1e12;
			}
			for(int j=0;j<=max2;++j){
				dp[i][j]=dp[i-1][j]+1.0*(p[i]-p[i-1])/rate(j);
			}
			int now2=Log2(x[i-1]);
			for(int j=now2;j<=max2;++j){
				dp[i][j]=min(dp[i][j],dp[i-1][j-now2]+1.0*(p[i]-p[i-1])/rate(j)+t[i]);
			}
			max2+=now2;
		}
		while(q--){
			int y;
			scanf("%d",&y);
			int l=1,r=n,pos=1;
			while(l<=r){
				int mid=(l+r)>>1;
				if(p[mid]<=y){
					l=mid+1;
					pos=mid;
				}else{
					r=mid-1;
				}
			}
			double ans=1e12;
			int now2=Log2(x[pos]);
			for(int j=0;j<=39;++j){
				ans=min(ans,min(dp[pos][j]+1.0*(y-p[pos])/rate(j),dp[pos][j]+1.0*(y-p[pos])/rate(j+now2)+t[pos]));
			}
			printf("%.6lf\n",ans);
		}
	}
}
signed main(){
	scanf("%d %d",&n,&q);
	int maxx=0;
	bool F3=false;
	for(int i=1;i<=n;++i){
		scanf("%d %d %d",&p[i],&t[i],&x[i]);
		maxx|=1<<(x[i]-1);
		if(x[i]==3){
			F3=true;
		}
	}
	if(!F3){
		cout<<"there";
		Sub3::Main();
		return 0;
	}
	if(maxx==1){
		Sub1::Main();
		return 0;
	}
	if(n<=1000){
		Sub2::Main();
		return 0;
	}
	Sub0::Main();
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...