BZOJ2726任务安排 CDQ分治维护凸包

好像不是很难,就是普通的CDQ分治,每次统计左边对右边的贡献

/*
@Date    : 2019-08-15 20:38:48
@Author  : Adscn (adscn@qq.com)
@Link    : https://www.cnblogs.com/LLCSBlog
*/
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define IL inline
#define RG register
#define gi getint()
#define gc getchar()
#define File(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout)
IL int getint()
{
	RG int xi=0;
	RG char ch=gc;
	bool f=0;
	while(ch<'0'||ch>'9')ch=='-'?f=1:f,ch=gc;
	while(ch>='0'&&ch<='9')xi=(xi<<1)+(xi<<3)+ch-48,ch=gc;
	return f?-xi:xi;
}
template<typename T>
IL void pi(T k,char ch=0)
{
	if(k<0)k=-k,putchar('-');
	if(k>=10)pi(k/10,0);
	putchar(k%10+'0');
	if(ch)putchar(ch);
}
const int N=5e5+7;
int n,S;
int c[N],t[N];
typedef long long ll;
ll f[N];
struct oper
{
	ll x,y,k;
	int id;
	bool operator <(const oper & b)const{
		return k<b.k;
	}
}qry[N],tmp[N];
inline ll Y(int j,int k){return qry[k].y-qry[j].y;}
inline ll X(int j,int k){return qry[k].x-qry[j].x;}
inline bool cmp(const oper &a,const oper &b){
	return a.x==b.x?a.y<b.y:a.x<b.x;
}
inline void cdq(int L,int R)
{
	if(L==R){
		qry[L].x=c[L];
		qry[L].y=f[L]-c[n]*t[L]+c[L]*t[L]-S*c[L];
		return;
	}
	int mid=(L+R)>>1;
	int l=L,r=mid+1;
	for(int i=L;i<=R;++i)
		if(qry[i].id>mid)tmp[r++]=qry[i];
		else tmp[l++]=qry[i];
	memcpy(qry+L,tmp+L,sizeof(oper)*(R-L+1));
	cdq(L,mid);
	static int stk[N];
	int top=0;
	for(int i=L;i<=mid;++i)
	{
		while(top>1&&(ll)Y(stk[top-1],stk[top])*X(stk[top-1],i)>(ll)Y(stk[top-1],i)*X(stk[top-1],stk[top]))--top;
		stk[++top]=i;
	}
	int h=1;
	for(int i=mid+1;i<=R;++i)
	{
		while(h<top&&(ll)Y(stk[h],stk[h+1])<(ll)qry[i].k*X(stk[h],stk[h+1]))++h;
		int I=qry[i].id,j=stk[h];
		f[I]=min(f[I],-qry[i].k*qry[j].x+qry[j].y+c[n]*(t[I]+S));
	}
	cdq(mid+1,R);
	l=L,r=mid+1;
	for(int i=L;i<=R;++i)
		if((r>R||cmp(qry[l],qry[r]))&&l<=mid)tmp[i]=qry[l++];
		else tmp[i]=qry[r++];
	memcpy(qry+L,tmp+L,sizeof(oper)*(R-L+1));
}
signed main(void)
{
	n=gi,S=gi;
	for(int i=1;i<=n;++i)t[i]=gi+t[i-1],c[i]=gi+c[i-1];
	for(int i=1;i<=n;++i)qry[i].id=i,qry[i].k=t[i],f[i]=1e18;
	sort(qry+1,qry+n+1);
	cdq(0,n);
	return pi(f[n]),0;
}
posted @ 2019-08-16 07:46  Adscn  阅读(203)  评论(0编辑  收藏  举报