社区讨论
论如何让帖子标题更吸引人
P11290【MX-S6-T2】「KDOI-11」飞船参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mhizmmot
- 此快照首次捕获于
- 2025/11/03 18:19 4 个月前
- 此快照最后确认于
- 2025/11/03 18:19 4 个月前
这一道题目的 Subtask 是不是没有给全呀?
就是这一份代码放上去, 和 的点还是 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 条回复,欢迎继续交流。
正在加载回复...