1. 题目解析与解题思路
坐标变换问题是算法竞赛中的经典题型,这道题目要求我们对多个坐标点进行相同的位移操作。题目给出了n个位移操作(dx, dy)和m个初始坐标点(x, y),要求输出每个初始点经过所有位移操作后的最终坐标。
1.1 题目核心理解
这道题的核心在于理解位移操作的叠加性。每个位移操作(dx, dy)表示将坐标点沿x轴移动dx单位,沿y轴移动dy单位。当有多个位移操作时,最终效果等于各个位移向量的和。
举个例子:
- 如果有两个位移操作(1,2)和(3,4)
- 那么最终效果等同于一个位移操作(1+3, 2+4) = (4,6)
1.2 解题思路对比
题目给出了两种解法,我们来分析它们的优劣:
方法一:直接叠加法
- 对每个坐标点,依次应用所有位移操作
- 时间复杂度:O(m×n)
- 空间复杂度:O(n+m)
- 优点:直观易懂
- 缺点:当n和m较大时效率较低
方法二:预计算法
- 先计算所有位移操作的总和(total_dx, total_dy)
- 然后对每个坐标点只需应用一次总位移
- 时间复杂度:O(n+m)
- 空间复杂度:O(1)
- 优点:效率高,特别适合大规模数据
- 缺点:需要先理解位移的可叠加性
提示:在算法竞赛中,方法二的优化思路非常重要。很多看似需要嵌套循环的问题,都可以通过数学分析找到更高效的解法。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 代码实现详解
2.1 方法一实现解析
cpp复制#include <iostream>
#include <vector>
using namespace std;
struct Option{
int dx;
int dy;
};
struct Start{
int x;
int y;
};
int main(){
int n,m;
cin>>n>>m;
//输入操作数
vector<Option> op(n);
for(int i=0;i<n;i++){
cin>>op[i].dx>>op[i].dy;
}
//输入原始坐标
vector<Start> st(m);
for(int i=0;i<m;i++){
