社区讨论
全RE求调!玄关!
P5785[SDOI2012] 任务安排参与者 3已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mdf9isam
- 此快照首次捕获于
- 2025/07/23 09:06 8 个月前
- 此快照最后确认于
- 2025/11/04 03:54 4 个月前
CPP
#include<bits/stdc++.h>
#define ll long long
#define ss size()
using namespace std;
int n,s;
ll t[5005],f[5005],dp[5005],j,X,Y;
struct node{
ll k,b,i;
};/*
double cross(node x,node y){
return (x.b-y.b)*1.0/(x.k==y.k?1e-9:x.k-y.k);
}*/
deque<node>q;
int get(int &i,int k){
if(q.size()==1)return q[0].i;
int l=0,r=q.ss-1,mid,ans=0;
node x,y;
while(l<=r){
mid=((l+r)>>1);
x=q[mid];
y=q[mid+1];
if((x.b-y.b)>=k*(x.k==y.k?1e-9:x.k-y.k)){
r=mid-1;
ans=mid;
}
else l=mid+1;
}
return ans;
}
int main(){
cin>>n>>s;
for(int i=1;i<=n;i++){
cin>>t[i]>>f[i];
t[i]+=t[i-1];
f[i]+=f[i-1];
}
memset(dp,0x3f,sizeof dp);
dp[0]=0;
node tt,x,y;
for(int i=1;i<=n;i++){
j=i-1;
X=f[j];
Y=dp[j]-s*f[j];
tt=(node){X,Y,j};
x=q[q.ss-1];
y=q[q.ss-2];
while(q.size()>=2 && (tt.b-x.b)*(x.k==y.k?1e-9:x.k-y.k)<=(x.b-y.b)*(tt.k==x.k?1e-9:tt.k-x.k))q.pop_back();
q.push_back(tt);
j=get(i,s+t[i]);
dp[i]=dp[j]+s*(f[n]-f[j])+t[i]*(f[i]-f[j]);
}
cout<<dp[n];
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...