2410. Swapity Swap

题目描述了Farmer John的奶牛晨练方案,通过一系列位置的反转操作改变奶牛的顺序。给定奶牛数量N、反转操作对数M和重复次数K,求K次操作后的奶牛顺序。输入包括N, M, K以及M对反转区间,输出每个位置上的奶牛编号。" 113069531,10535817,Vue与ElementUI动态表单及子表单构建,"['前端开发', 'Vue框架', '表单组件', 'ElementUI']
摘要由CSDN通过智能技术生成

2410. Swapity Swap

题目描述
Farmer John 的 N 头奶牛(1≤N≤10^5)站成一排。对于每一个 1≤i≤N,从左往右数第 i 头奶牛的编号为 i。Farmer John 想到了一个新的奶牛晨练方案。他给奶牛们 M 对整数 (L1,R1)…(LM,RM),其中 1≤M≤100。他让她们重复以下包含 M 个步骤的过程 K(1≤K≤10^9)次:
对于从 1 到 M 的每一个步骤i:当前从左往右数在位置 Li…Ri 的奶牛序列反转她们的顺序。
当奶牛们重复这一过程 K 次后,请对每一个 1≤i≤N 输出从左往右数第 i 头奶牛的编号。

输入
输入的第一行包含 N, M 和 K。对于每一个 1≤i≤M,第 i+1 行包含 Li 和 Ri,均为范围在 1…N 内的整数,其中 Li<Ri。

输出
在第 i 行输出指令序列执行了 K 次后奶牛序列中从左往右数第 i 个元素的编号。

样例输入

7 2 2
2 5
3 7

样例输出

1
2
4
3
5
7
6

数据范围限制
测试点 1-2 满足 N=K=100。
测试点 3-5 满足 K≤10^3。
测试点 6-10 没有额外限制。

提示
初始时,奶牛们的顺序从左往右为 [1,2,3,4,5,6,7]。在这一过程的第一步过后,顺序变为 [1,5,4,3,2,6,7]。在这一过程的第二步过后,顺序变为 [1,5,7,6,2,3,4]。再重复这两个步骤各一次可以得到样例的输出。

方法一:
暴力,30%。

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);
using namespace std;
const int MAX=2147483647;
const int N=1e5+5;
int f[N],l[110],r[110],n,
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回溯是指在搜索过程中,如果当前的搜索方案不可行,就要回退到上一个状态,重新选择方案。在使用 `swap(x[i], x[j])` 进行全排列等搜索问题时,回溯就是将交换过的两个元素再交换一次,回到原来的状态。 以下是一个示例代码: ```cpp void backtrack(vector<int>& nums, int start, vector<vector<int>>& res) { if (start == nums.size()) { res.push_back(nums); return; } for (int i = start; i < nums.size(); i++) { swap(nums[start], nums[i]); backtrack(nums, start + 1, res); swap(nums[start], nums[i]); // 回溯 } } ``` 例如,对于输入 `[1, 2, 3]`,在交换了 1 和 2 后,进入下一层递归: ``` start=1: [1, 2, 3] start=2: [1, 2, 3] start=3: [1, 2, 3] // 到达最后一层,将当前排列加入结果 swap(2, 2) start=2: [1, 3, 2] start=3: [1, 3, 2] // 到达最后一层,将当前排列加入结果 swap(2, 2) swap(1, 1) start=1: [2, 1, 3] start=2: [2, 1, 3] start=3: [2, 1, 3] // 到达最后一层,将当前排列加入结果 swap(2, 2) start=2: [2, 3, 1] start=3: [2, 3, 1] // 到达最后一层,将当前排列加入结果 swap(2, 2) swap(1, 1) start=1: [3, 2, 1] start=2: [3, 2, 1] start=3: [3, 2, 1] // 到达最后一层,将当前排列加入结果 swap(2, 2) start=2: [3, 1, 2] start=3: [3, 1, 2] // 到达最后一层,将当前排列加入结果 swap(2, 2) swap(1, 1) ``` 可以看到,在交换了 1 和 2 后,需要再交换一次才能回到原来的状态。这就是回溯的过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值