萌新刚学斜率优化1e18S求助
查看原帖
萌新刚学斜率优化1e18S求助
965755
u______n楼主2023/12/21 11:49
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1000015;
struct node
{
	int x;
	int y;
	int a;
}z[N];
bool cmp(node z1,node z2)
{
	return z1.y>z2.y;
}
int X;
struct poi
{
	int k;
	int y;
	int sum()const
	{
		return -k*X+y;
	}
	bool operator<(const poi &p1)const
	{
		return sum()<=p1.sum();
	}
};
deque<poi> q;
signed main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	scanf("%lld%lld%lld",&z[i].x,&z[i].y,&z[i].a);
//	cin>>z[i].x>>z[i].y>>z[i].a;
	sort(z+1,z+n+1,cmp);
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		X=z[i].y;
		while(q.size()>1)
		{
			poi p1=q.back();
			q.pop_back();
			poi p2=q.back();
			q.pop_back();
			if(p2<p1)
			{
				q.push_back(p1);	
			}
			else
			{
				q.push_back(p2);
				q.push_back(p1);
				break;
			}
			
		}
		poi p3;
		p3.k=z[i].x;
		if(q.size())
		p3.y=q.front().sum()+z[i].x*z[i].y-z[i].a;
		else
		p3.y=z[i].x*z[i].y-z[i].a;
		ans=max(ans,p3.y);
	//	cout<<"*"<<i<<" "<<p3.k<<" "<<p3.y<<" "<<endl;
		q.push_back(p3);
		while(q.size()>1)
		{
			poi p1=q.back();
			q.pop_back();
			poi p2=q.back();
			q.pop_back();
			if(p2<p1)
			{
				q.push_back(p1);	
			}
			else
			{
				q.push_back(p2);
				q.push_back(p1);
				break;
			}
		}
	/*	for(int i=0;i<q.size();i++)
		{
			cout<<"deque: "<<X<<" "<<i<<" "<<q[i].k<<" "<<q[i].y<<" "<<q[i].sum()<<endl;
		}*/
	}
	cout<<ans;
	return 0;
}

为什么WAon5,是我对算法理解的有问题吗?

2023/12/21 11:49
加载中...