【蓝桥杯集训·每日一题2025】 AcWing 5590. 沿栅栏散步 python

AcWing 5590. 沿栅栏散步

Week 4
3月11日

题目描述

农夫约翰有 N N N 头奶牛,每头奶牛都喜欢日常沿着包围牧场的栅栏散步。

栅栏由 P P P 根柱子组成( P P P 为偶数),每根柱子的位置是农夫约翰农场地图上的一个不同的二维坐标点 ( x , y ) (x,y) (x,y)。

每根柱子通过垂直或水平线段的栅栏连接到两根相邻的柱子,因此整个栅栏可以被视为各边平行于 x x x 轴或 y y y 轴的一个多边形(最后一根柱子连回第一根柱子,确保围栏形成一个包围牧场的闭环)。

栅栏多边形是「规则的」,体现在栅栏段仅可能在其端点处重合,每根柱子恰好属于两个栅栏段,同时每两个在端点处相交的栅栏段都是垂直的。

每头奶牛的日常散步都有一个偏好的起始和结束位置,均为沿栅栏的某个点(可能在柱子处,也可能不在)。

每头奶牛日常散步时沿着栅栏行走,从起始位置开始,到结束位置结束。

由于栅栏形成闭环,奶牛有两条路线可以选择。

由于奶牛是一种有点懒的生物,每头奶牛都会选择距离较短的方向沿栅栏行走(如果并列,奶牛可以选择任一方向)。

输入格式

输入的第一行包含 N N N 和 P P P。

以下 P P P 行的每一行包含两个整数,以顺时针或逆时针顺序表示栅栏柱子的位置。

以下 N N N 行的每一行包含四个整数 x 1 , y 1 , x 2 , y 2 x_1, y_1, x_2, y_2 x1,y1,x2,y2,表示一头奶牛的起始位置 ( x 1 , y 1 ) (x_1,y_1) (x1,y1) 和结束位置 ( x 2 , y 2 ) (x_2,y_2) (x2,y2)

输出格式

输出 N N N 个整数,为每头奶牛行走的距离。

数据范围

1 ≤ N ≤ 1 0 5 1 \le N \le 10^5 1≤N≤105,
4 ≤ P ≤ 2 × 1 0 5 4 \le P \le 2 \times 10^5 4≤P≤2×105,
0 ≤ x , y ≤ 1000 0 \le x,y \le 1000 0≤x,y≤1000

输入样例:
复制代码
5 4
0 0
2 0
2 2
0 2
0 0 0 2
0 2 1 0
2 1 0 2
1 0 1 2
1 2 1 0
输出样例:
复制代码
2
3
3
4
4
样例解释

第一头奶牛可以直接从 ( 0 , 0 ) (0,0) (0,0) 走到 ( 0 , 2 ) (0,2) (0,2)。

第二头奶牛可以从 ( 0 , 2 ) (0,2) (0,2) 走到 ( 0 , 0 ) (0,0) (0,0),然后走到 ( 1 , 0 ) (1,0) (1,0)。

第四头奶牛有两条长度相等的可能路线: ( 1 , 0 ) → ( 0 , 0 ) → ( 0 , 2 ) → ( 1 , 2 ) (1,0)→(0,0)→(0,2)→(1,2) (1,0)→(0,0)→(0,2)→(1,2) 和 ( 1 , 0 ) → ( 2 , 0 ) → ( 2 , 2 ) → ( 1 , 2 ) (1,0)→(2,0)→(2,2)→(1,2) (1,0)→(2,0)→(2,2)→(1,2)。


AC_code

python 复制代码
n,p=map(int,input().split())  
q = []  
for _ in range(p):  
    x, y = map(int, input().split())  
    q.append((x, y))  
  
s = [[0] * 1010 for _ in range(1010)]  
sum = 0  
x, y = q[-1]  # 令最后一个柱子的坐标为起点  
  
for i in range(p):  
    tx, ty = q[i] # 终点  
    vx = 1 if tx > x else (-1 if tx < x else 0)  
    vy = 1 if ty > y else (-1 if ty < y else 0)  
  
    while x != tx or y != ty:  
        x += vx  
        y += vy  
        sum += 1  
        s[x][y] = sum  
  
for _ in range(n):  
    x1, y1, x2, y2 = map(int, input().split())  
    dis = s[x2][y2] - s[x1][y1]  
    if dis < 0:  
        dis += sum  
    print(min(dis, sum - dis))

END
如果有更多问题或需要进一步的帮助,可以在评论区留言讨论哦!
如果喜欢的话,请给博主点个关注 谢谢

相关推荐
白日做梦Q几秒前
Anchor-free检测器全解析:CenterNet vs FCOS
python·深度学习·神经网络·目标检测·机器学习
吃杠碰小鸡几秒前
高中数学-数列-导数证明
前端·数学·算法
故事不长丨1 分钟前
C#线程同步:lock、Monitor、Mutex原理+用法+实战全解析
开发语言·算法·c#
long3162 分钟前
Aho-Corasick 模式搜索算法
java·数据结构·spring boot·后端·算法·排序算法
近津薪荼2 分钟前
dfs专题4——二叉树的深搜(验证二叉搜索树)
c++·学习·算法·深度优先
熊文豪11 分钟前
探索CANN ops-nn:高性能哈希算子技术解读
算法·哈希算法·cann
喵手15 分钟前
Python爬虫实战:公共自行车站点智能采集系统 - 从零构建生产级爬虫的完整实战(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集公共自行车站点·公共自行车站点智能采集系统·采集公共自行车站点导出csv
喵手22 分钟前
Python爬虫实战:地图 POI + 行政区反查实战 - 商圈热力数据准备完整方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·地区poi·行政区反查·商圈热力数据采集
熊猫_豆豆28 分钟前
YOLOP车道检测
人工智能·python·算法
nimadan1229 分钟前
**热门短剧小说扫榜工具2025推荐,精准捕捉爆款趋势与流量
人工智能·python