求条
查看原帖
求条
333855
int233楼主2024/7/14 11:08

RT,wa 5分

AC at:#6

#include<iostream>
using namespace std;
typedef long long ll;
typedef long double de;
ll n,r,L,R,MID,f[300005];
de m,t[300005],cc[300005],s[300005],ss[300005],k[300005],b[300005];
struct node{
	ll id;
}c[300005];
void push(ll x){
	c[++r].id=x;	
}
void pop(){
	r--;
}
ll size(){
	return r;
}
ll empty(){
	return (!r);
}
pair<de,ll> inters(ll x,ll y){
	if(k[c[x].id]==k[c[y].id]){
		return {0,0};
	}
	return {(b[c[x].id]-b[c[y].id])/(k[c[y].id]-k[c[x].id]),1}; 
}
ll top(){
	return r;
}
int main(){
	cin>>n>>m;
	for(ll i=1;i<=n;i++){
		cin>>t[i]>>cc[i];
		s[i]=s[i-1]+cc[i];
		ss[i]=ss[i-1]+t[i];
	}
	for(ll i=1;i<=n;i++){
		L=1,R=r-1;
		while(L<R){
			MID=(L+R+1)>>1;
			if(inters(MID,MID+1).first<=ss[i]){
				L=MID;
			}
			else{
				R=MID-1;
			}
		}
		f[i]=(ll)m*(ll)s[n]+(ll)ss[i]*(ll)s[n];
	//	cout<<i<<" "<<f[i]<<" "<<L<<" "<<r<<endl;
		if((!(L<r&&inters(L,L+1).first<=ss[i]))&&r>=1){
		//	cout<<i<<" "<<f[i]<<" "<<L<<" BLOCKING "<<r<<endl;
			f[i]=min(f[i],(ll)k[c[r].id]*(ll)ss[i]+(ll)b[c[r].id]+(ll)m*(ll)s[n]+(ll)ss[i]*(ll)s[n]);
		}
		else if(L<r&&inters(L,L+1).first<=ss[i]){
	//		cout<<i<<" "<<f[i]<<" "<<L<<" BLOCKed "<<r<<" "<<c[L+1].id<<endl;
			f[i]=min(f[i],(ll)k[c[L+1].id]*(ll)ss[i]+(ll)b[c[L+1].id]+(ll)m*(ll)s[n]+(ll)ss[i]*(ll)s[n]);
			f[i]=min(f[i],(ll)k[c[L].id]*(ll)ss[i]+(ll)b[c[L].id]+(ll)m*(ll)s[n]+(ll)ss[i]*(ll)s[n]);
		}
	//	cout<<i<<" "<<f[i]<<" "<<L<<" "<<r<<endl;
		k[i]=-s[i];
		b[i]=-m*s[i]+(de)f[i]-ss[i]*s[n]+ss[i]*s[i];
	//	cout<<"y="<<k[i]<<"x+"<<b[i]<<endl;
		c[300002].id=i;
		while(size()>=2){
			ll cur=top();
			pop();
			ll cur2=top();
			if(((inters(cur,cur2).second&&inters(cur,300002ll).second)&&(inters(cur,cur2)<inters(cur,300002ll)))||((!inters(cur,cur2).second)||(!inters(cur,300002ll).second))){
				push(c[cur].id);
				break;
			}
		}
		push(i);
	}
	cout<<(ll)f[n];
	return 0;
} 
2024/7/14 11:08
加载中...