求调动态开点李超线段树 WA on #15
查看原帖
求调动态开点李超线段树 WA on #15
347664
菲斯斯夫斯基楼主2024/5/7 19:50

rt,谢谢。

#include<bits/stdc++.h>
#define int long long
#define fi first
#define se second
using namespace std;
const int N=1e5+10,M=1e9;
int n,rt,s,t,id,cnt,ans=2e18;
int dp[N];
pair<int,int>b[N];
struct tree
{
	int l,r,x;
}f[N<<5];
struct ccf
{
	int k,b;
}a[N<<1];
int num(int id,int x)
{
	return a[id].k*x+a[id].b;
}
int cmp(int x,int y)
{
	if(x>y)return 1;
	else if(x<y)return -1;
	else return 0;
}
void add(int &k,int l,int r,int id)
{
	if(!k)k=++cnt;
	int &now=f[k].x,mid=l+(r-l)/2,chk=cmp(num(now,mid),num(id,mid));
	if(chk==1)swap(id,now);
	int chkl=cmp(num(now,l),num(id,l)),chkr=cmp(num(now,r),num(id,r));
	if(chkl==1)add(f[k].l,l,mid,id);
	if(chkr==1)add(f[k].r,mid+1,r,id);
}
void change(int &k,int l,int r,int x,int y,int id)
{
	if(l>y||r<x)return ;
	if(!k)k=++cnt;
	if(x<=l&&r<=y)
	{
		add(k,l,r,id);
		return ;
	}
	int mid=l+(r-l)/2;
	change(f[k].l,l,mid,x,y,id);
	change(f[k].r,mid+1,r,x,y,id);
}
int ask(int k,int l,int r,int x)
{
	if(!k||l>x||r<x)return 1e18;
	if(l==r)return num(f[k].x,x);
	int mid=l+(r-l)/2;
	return min(num(f[k].x,x),min(ask(f[k].l,l,mid,x),ask(f[k].r,mid+1,r,x)));
}
bool cmpp(pair<int,int>a,pair<int,int>b)
{
	return a.fi>b.fi;
}
signed main()
{
	cin>>n>>s>>t;
	for(int i=1;i<=n;i++)
	{
		scanf("%lld%lld",&b[i].fi,&b[i].se);
		if(s==b[i].se)id=i;
	}
	swap(b[id],b[1]);
	sort(b+2,b+1+n,cmpp);
	a[0].b=1e18,a[1]={b[1].fi,-b[1].fi*b[1].se},a[2]={-b[1].fi,b[1].fi*b[1].se};
	change(rt,-M,M,b[1].se,M,1),change(rt,-M,M,-M,b[1].se,2);
	for(int i=2;i<=n;i++)
	{
		if(b[i].se>t)break;
		dp[i]=ask(rt,-M,M,b[i].se);
		a[i*2]={b[i].fi,dp[i]-b[i].fi*b[i].se},a[i*2+1]={-b[i].fi,dp[i]+b[i].fi*b[i].se};
		change(rt,-M,M,b[i].se,M,i*2),change(rt,-M,M,-M,b[i].se,i*2+1);
		ans=min(ans,dp[i]+b[i].fi*(t-b[i].se));
	}
	cout<<ans;
	return 0;
}
2024/5/7 19:50
加载中...