[USACO08MAR]Land Acquisition

博客围绕土地购买问题展开,先对土地按长和宽排序,用栈筛选出对答案有影响的土地,发现剩余土地按宽度降序,分组应取连续段。最后采用斜率优化动态规划求解,还通过乘法解决精度问题,并给出代码思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

每块土地的长和宽分别用数组ll和数组h表示。
每次买一组土地,需要的花费是 最大的长××最大的宽,所以如果存在土地iij,满足l[j]l[i]l[j]≥l[i]h[j]h[i]h[j]≥h[i],土地ii就不会对答案产生影响。
因此,我们先将土地按长度从小到大排序,若长度相同按宽度从小到大排序。然后维护一个栈,将排序后的土地按次序加入,每次处理一块土地时先把当前栈中宽小于等于当前土地的土地删除。最后栈中留下的就是会对答案产生影响的土地。
我们可以发现,剩下的土地是按宽度降序排列的,那么给土地分组时一定是取连续的一段。因为这组土地的花费为第一块土地的宽度×最后一块土地的长度,如果从中间分出一段来,会保留原来的花费并产生新的花费。
之后就是斜率优化dpdp了,根据直线的交点的横坐标大小来判断优劣,我用了乘法来解决精度问题。
代码:

#include<bits/stdc++.h>
#define il inline
#define ll long long
#define rt return
#define N 1000005
using namespace std;
#define getchar()(p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[1<<21],*p1=buf,*p2=buf;
il int read(){
    int x=0,f=1;
    char c=getchar();
    for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
    for(;isdigit(c);c=getchar()) x=(x+(x<<2)<<1)+c-48;
    return x*f;
}
struct A{
    ll w,l;
}a[N];
ll f[N],k[N],b[N],q[N];
int n,cnt,h=1,t=1;
il bool cmp(A x,A y){
    rt (x.l==y.l)?x.w<y.w:x.l<y.l;
}
il double calc(int i,int j){rt f[j]+a[j+1].w*a[i].l;}
il bool slope(int x,int y,int z){rt (b[z]-b[x])*(k[y]-k[x])-(b[y]-b[x])*(k[z]-k[x])>=0;}
int main(){
    n=read();
    for(int i=1;i<=n;++i) a[i].w=read(),a[i].l=read();
    sort(a+1,a+n+1,cmp);
    for(int i=1;i<=n;++i){
        while(cnt&&a[i].w>=a[cnt].w) --cnt;
        a[++cnt].w=a[i].w,a[cnt].l=a[i].l;
    }
    k[0]=a[1].w;
    for(int i=1;i<=cnt;++i){
        while(h<t&&calc(i,q[h])>=calc(i,q[h+1])) ++h;
        f[i]=calc(i,q[h]),k[i]=a[i+1].w,b[i]=f[i];
        while(h<t&&slope(q[t-1],q[t],i)) --t;
        q[++t]=i;
    }
    return !printf("%lld",f[cnt]);;
}
目前尚未有 USACO Silver 2025 March 的具体题目和官方题解发布,因为该时间点可能超出了当前已有的竞赛记录范围。然而,可以基于以往的 USACO Silver 级别的题目特点以及常见的算法知识点来推测潜在的内容。 USACO Silver 级别通常涉及的数据结构和算法包括但不限于:前缀和、滑动窗口、二分查找、贪心策略、并查集、BFS/DFS 和简单动态规划等[^3]。以下是关于如何准备类似级别比赛的一些建议: ### 常见问题类型分析 #### 数据处理与模拟 一些题目会测试选手对于复杂输入的理解能力以及基本逻辑实现的能力。例如,在某些场景下需要解析多组数据或者按照特定顺序执行操作。这类问题往往不需要复杂的理论基础,但要求程序具有良好的鲁棒性和效率。 #### 贪婪算法应用 当面对资源分配类的问题时,贪婪方法通常是首选解决方案之一。通过局部最优选择逐步构建全局最佳方案是一种常见思路。比如安排奶牛吃谷物的例子就体现了这一原则[^1]。 #### 图论基础知识 图遍历技术如广度优先搜索(BFS) 或者深度优先搜索(DFS),还有最短路径计算等问题也是Silver阶段的重要组成部分。拖拉机那道题就是一个很好的例子展示了如何利用双端队列优化传统BFS过程从而提高性能表现[^2]。 ```python from collections import deque def bfs_with_deque(start_node, adjacency_list): queue = deque([start_node]) visited = set() while queue: current = queue.popleft() if current not in visited: visited.add(current) for neighbor in adjacency_list[current]: if neighbor not in visited: queue.append(neighbor) return visited ``` ### 准备建议 为了更好地应对未来的USACO赛事,推荐定期练习过往真题,并深入理解每种核心概念背后的工作机制及其适用场合。同时也要注意培养代码调试技巧,这对于快速定位错误至关重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值