求助李超线段树95pts
查看原帖
求助李超线段树95pts
226113
火羽白日生楼主2021/9/20 21:31

rt

expected:544327979208 found:504604156303\text{expected}: -544327979208\ \text{found}: -504604156303

#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define uint unsigned int
#define rint register int
using namespace std;
namespace IO{
	#define File(x,y) freopen(#x,"r",stdin),freopen(#y,"w",stdout)
	#define FileClose() fclose(stdin),fclose(stdout)
	inline int read(){
		int w=0,f=1; char ch=getchar();
		while(ch<'0'||ch>'9'){if(ch=='-') f=-1; ch=getchar();}
		while(ch>='0'&&ch<='9'){w=(w<<3)+(w<<1)+(ch^48); ch=getchar();}
		return w*f;
	}
	inline void write(int x,char ch='\n'){
  		static int sta[35]; int top=0;
  		if(x<0) putchar('-'),x=-x;
  		do{sta[++top]=x%10,x/=10;}while(x);
  		while(top) putchar(sta[top--]+48); putchar(ch);
	}
}
using namespace IO;
namespace CL{
	#define fill(x,y) memset(x,y,sizeof(x))
	#define copy(x,y) memcpy(x,y,sizeof(y))
	
	const int maxn=3e5+5; const ll inf=0x7ffffffffffffff;
	
	int n,s,tot;
	ll T[maxn],C[maxn],x[maxn],lsh[maxn],f[maxn];
	namespace SegmentTree{
		#define lson p<<1
		#define rson p<<1|1
		struct node{
			ll k,b;
			node(){} node(ll x,ll y){k=x,b=y;}
			inline ll calc(ll x){return k*lsh[x]+b;}
		}t[maxn<<2];
		inline bool cover(node org,node now,ll x){
			return now.calc(x)<=org.calc(x);
		}
		void build(int p,int l,int r){
			t[p].k=0,t[p].b=inf;
			if(l==r) return;
			int mid=(l+r)>>1;
			build(lson,l,mid),build(rson,mid+1,r);
		}
		void insert(int p,int l,int r,node k){
			if(cover(t[p],k,l) && cover(t[p],k,r)) return t[p]=k,void();
			if(l==r) return;
			int mid=(l+r)>>1;
			if(cover(t[p],k,mid)) swap(t[p],k);
			if(cover(t[p],k,l)) insert(lson,l,mid,k);
			if(cover(t[p],k,r)) insert(rson,mid+1,r,k);
		}
		ll query(int p,int l,int r,ll x){
			if(l==r) return t[p].calc(x);
			int mid=(l+r)>>1; ll res;
			if(x<=mid) res=query(lson,l,mid,x);
			else res=query(rson,mid+1,r,x);
			return min(res,t[p].calc(x));
		}
	}using namespace SegmentTree;

	inline int main(){
		n=read(); s=read();
		for(int i=1;i<=n;i++) T[i]=read()+T[i-1],C[i]=read()+C[i-1],lsh[i]=x[i]=T[i];
		sort(lsh+1,lsh+1+n);
		tot=unique(lsh+1,lsh+1+n)-lsh-1;
		build(1,1,n);
		for(int i=1;i<=n;i++){
			x[i]=lower_bound(lsh+1,lsh+1+tot,x[i])-lsh;
			f[i]=min(query(1,1,n,x[i])+T[i]*C[i]+s*C[n],T[i]*C[i]+s*C[n]);
			insert(1,1,n,node(-C[i],f[i]-s*C[i]));
		}
		printf("%lld\n",f[n]);
		return 0;
	}
}
signed main(){return CL::main();}
2021/9/20 21:31
加载中...