社区讨论

爆了80分求救

P2900[USACO08MAR] Land Acquisition G参与者 3已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@mi6x0b9b
此快照首次捕获于
2025/11/20 12:12
4 个月前
此快照最后确认于
2025/11/20 12:12
4 个月前
查看原帖
RT
CPP
//By AcerMo
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define lli long long int
using namespace std;
const int M=50050;
struct sqr
{
	lli x,y;
	sqr(){x=0;y=0;}
	bool friend operator < (sqr a,sqr b)
	{
		if (a.x==b.x) return a.y<b.y;
		return a.x<b.x;
	}
}e[M];
struct sta{int l,r,id;}s[M];
int n,m;
lli f[M];
int top=1,now=1,c[M];
int vis[M],nxt[M];
inline int read()
{
	int x=0;char ch=getchar();
	while (ch>'9'||ch<'0') ch=getchar();
	while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return x;
}
inline sta add(int a,int b,int c)
{
	sta ad;ad.id=a;ad.l=b;ad.r=c;
	return ad;
}
inline lli calc(int a,int b)
{
	lli ans=e[b].x*e[nxt[a]].y+f[a];
	return ans;
}
inline int tmid(int x)
{
	int l=s[top].l,r=s[top].r,ol=s[top].id;
	while (l<=r)
	{
		int mid=(l+r)>>1;
		if (calc(x,mid)>calc(ol,mid)) l=mid+1;
		else r=mid-1;
	}
	return l;
}
inline bool che(int x,int y)
{
	lli ans=calc(s[x].id,s[x].l);
	lli que=calc(y,s[x].l);
	return ans>=que;
}
signed main()
{
	n=read();
	for (int i=1;i<=n;i++) 
	e[i].x=read(),e[i].y=read();
	sort(e+1,e+n+1);
	for (int i=1;i<=n;i++)
	{
		while (m&&e[i].y>=e[c[m]].y) vis[c[m--]]=1;
		c[++m]=i; 
	}
	int last=0;
	for (int i=1;i<=n;i++) 
	if (!vis[i]) nxt[last]=i,last=i;
	s[top]=add(0,1,n);
	for (int i=1;i<=n;i++)
	{
		if (vis[i]) continue;
		f[i]=calc(s[now].id,i);
		while (top&&che(top,i)) top--;
		int u=tmid(i);s[top].r=u-1;
		if (u<=n) s[++top]=add(i,u,n);
		if (i==s[now].r) now++;
	}
	cout<<f[n];
	return 0;
}

回复

5 条回复,欢迎继续交流。

正在加载回复...