C题
题意:
给一串1~n的数字,有k次操作,第i次操作满足下面两个条件:
当i为奇数时:交换下标为 2*i-1 和 2*i 的数;
当i为偶数时:交换下标为 2*i 和 2*i+1 的数。
k次操作全部完成之后,问数字q在第几位。
题解:
列出任意一种交换的情况可以发现,该操作2*n次操作为一个循环。
并且每个数字下标的变换满足特定的规律,按照该规律写出代码即可AC(注意边界值)。
题意:
给一串1~n的数字,有k次操作,第i次操作满足下面两个条件:
当i为奇数时:交换下标为 2*i-1 和 2*i 的数;
当i为偶数时:交换下标为 2*i 和 2*i+1 的数。
k次操作全部完成之后,问数字q在第几位。
题解:
列出任意一种交换的情况可以发现,该操作2*n次操作为一个循环。
并且每个数字下标的变换满足特定的规律,按照该规律写出代码即可AC(注意边界值)。
#include <bits/stdc++.h> #define hh '\n' #define Cap_suleDebug(x) #x #define debug(x) cout << Cap_suleDebug(x) << " = " << x << hh #define I scanf #define O printf typedef long long ll; typedef unsigned long long ull; #define int ll using namespace std; // inline ll ri(){ll s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9')s=s*10+ch-'0',ch=getchar();return s*w;} const int mod = 1e9 + 7; const int INF = 0x3f3f3f3f; // 1061109567 const int MAXINT = 0x7FFFFFFF; // 2147483647 typedef pair<int, int> PII; const int N = 1e6 + 10; int a[N]; void solve() { int n, k, q; cin >> n >> k >> q; k %= 2 * n; int ans; if (k == 0) { cout << q << hh; } else if (k == n) { cout << n - q + 1 << hh; } else if (k < n) { if (q & 1) { if (k >= n - q + 1) { k -= n - q + 1; ans = n - k; } else { ans = q + k; } } else { if (k >= q) { k -= q; ans = k + 1; } else { ans = q - k; } } cout << ans << hh; } else if (k > n) { k -= n; if (q & 1) { if (k > n - q) { k -= n - q; ans = k; } else { ans = (n - q) - k + 1; } } else { if (k > n - (n - q + 1)) { k -= n - (n - q + 1); ans = n - k + 1; } else { ans = (n - q + 1) + k; } } cout << ans << hh; } return; } //#define test signed main() { #ifdef test freopen("in.in", "r", stdin); freopen("out.out", "w", stdout); #endif // ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); int Orz = 1; cin >> Orz; while (Orz--) { solve(); } return 0; }