85pts求助
查看原帖
85pts求助
344405
曹操废了楼主2022/4/3 08:57

RTRT,人麻了

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<map>
#include<queue>
#include<stack>
#define INF 0x3f3f3f3f
#define int long long
#define MAXN 300001
using namespace std;
int n,s,f[MAXN],sumc[MAXN],sumt[MAXN],q[MAXN],l,r;
int check(int g,int h,int i){
	int y=r;
	while(g<h){
		int mid=(g+h)/2;
		if((f[q[mid+1]]-f[q[mid]])<=(s+sumt[i])*(sumc[q[mid+1]]-sumc[q[mid]])) {
			g=mid+1;
		}
		else h=mid;
		//if(i==5&&mid==2) cout<<g<<" "<<h<<"\n";
	}
	//if(f[g]-f[g-1]<=(s+sumt[i])*(sumc[g]-sumc[g-1])&&f[g+1]-f[g]>=(s+sumt[i])*(sumc[g+1]-sumc[g])) y=g;
	return q[g];
}
signed main(){
	ios::sync_with_stdio(false);
	cin>>n>>s;
	for(int i=1,c,t;i<=n;i++) {
		cin>>t>>c;
		sumc[i]=sumc[i-1]+c;
		sumt[i]=sumt[i-1]+t;
	}
	f[0]=0;
	l=r=0;
	q[r++]=0;
	for(int i=1;i<=n;i++){
		int p=check(l,r,i);
		//cout<<p<<"\n";
		f[i]=f[p]+sumt[i]*(sumc[i]-sumc[p])+s*(sumc[n]-sumc[p]);
		while(r-l>=2&&(f[i]-f[q[r-1]])*(sumc[q[r-1]]-sumc[q[r-2]])<=(f[q[r-1]]-f[q[r-2]])*(sumc[i]-sumc[q[r-1]])) r--;
		q[r++]=i;
	}
	cout<<f[n];
	return 0;
}
2022/4/3 08:57
加载中...