社区讨论
爆了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 条回复,欢迎继续交流。
正在加载回复...