voidsol(){ int n, x, y; cin >> n >> x >> y; vector<int> p(n + 1); for (int i = 1; i <= n; i++) cin >> p[i]; vector<int> a, k, b; //用b数组存构造最小的B for (int i = x + 1; i <= y; i++) k.push_back(p[i]); int t = 0, len = k.size(); for (int i = 1; i < len; i++) if (k[i] < k[t]) t = i; b.resize(len); for (int i = 0; i < len; i++) b[(i - t + len) % len] = k[i]; //a数组存AC两部分 for (int i = 1; i <= x; i++) a.push_back(p[i]); for (int i = y + 1; i <= n; i++) a.push_back(p[i]); //找到插入点,将b插入到a中合并输出 int r = b[0]; int i = 0; for (;i < (int)a.size(); i++){ if (a[i] >= r) break; cout << a[i] << ' '; } for (auto g : b) cout << g << ' '; for (; i < (int)a.size(); i++) cout << a[i] << ' '; cout << endl; }
intmain(){ IO int t; cin >> t; while (t--) sol(); }
Alice 和 Bob 正在玩一个数组 a 上的游戏,初始时 a 包含 n 个正整数,Alice 先手。
每次轮到某个玩家时,如果 a 是非递减的 ∗,游戏立即结束。否则,该玩家可以从数组中选择一个元素 x,以及正整数 y,z,满足 1<y,z<x 且 x=yz,然后将数组中的 x 替换为 y 和 z(在 x 的原位置,顺序任意)。如果没有这样的操作可执行,游戏结束。
一旦游戏结束,如果 a 是非递减的,则 Bob 获胜;否则 Alice 获胜。请判断如果双方都采用最优策略,谁将获胜。
∗ 若对于所有 1≤i≤m−1 都有 ai≤ai+1,其中 m 为 a 的长度,则称 a 是非递减的。
输入格式
第一行包含一个整数 t(1≤t≤104),表示测试用例组数。
每组数据的第一行包含一个整数 n(1≤n≤105)。
每组数据的第二行包含 n 个整数 a1,a2,…,an(1≤ai≤106)。
所有测试用例中 n 之和不超过 105。
输出格式
对于每个测试用例,输出一行。如果 Alice 获胜,输出 “Alice”;如果 Bob 获胜,输出 “Bob”。判题系统区分大小写。
题意解读
Alice 和 Bob 正在玩一个数组 a 上的游戏,Bob想要序列非递减,Alice不想要。每次轮到某个玩家时,如果 a 是非递减的 ∗,游戏立即结束。否则,该玩家可以从数组中选择一个元素 x,以及正整数 y,z,满足 1<y,z<x 且 x=yz,然后将数组中的 x 替换为 y 和 z(在 x 的原位置,顺序任意)。如果没有这样的操作可执行,游戏结束。两人都进行最优操作。判断谁最终可以获胜。
boolcmp(int a, int b){ return a > b; } //判断是否是质数 boolisp(int x){ if (x < 2) returnfalse; if (x == 2) returntrue;//注意顺序问题 if (x % 2 == 0) returnfalse; for (int i = 3; i * i <= x; i += 2) if (x % i == 0) returnfalse; returntrue; } //判断是否满足质数的幂次方,记录分解出来质因子的哈希表,方便后续找底数 map<int, int> check(int x){ map<int, int> mp; for (int i = 2; i * i <= x; i++) if (x % i == 0) while (x % i== 0){ mp[i]++; x /= i; } if (x > 1) mp[x]++; return mp; }
voidsol(){ int n; cin >> n; vector<int> a(n); for (int i = 0; i < n; i++) cin >> a[i]; auto b = a; sort(b.begin(), b.end()); //情况1 if (a == b){ cout << "Bob" << endl; return; } //情况2 else{ for (int i = 0; i < n; i++){ if (!isp(a[i]) && a[i] != 1){ auto t = check(a[i]); if (t.size() == 1) a[i] = t.begin() -> first; else{ cout << "Alice" << endl; return; } } } vector<int> d = a; sort(d.begin(), d.end()); //情况3 if (a == d){ cout << "Bob" << endl; return; } else{ cout << "Alice" << endl; return; } } }
intmain(){ IO int t; cin >> t; while (t--) sol(); }