社区讨论

全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 条回复,欢迎继续交流。

正在加载回复...