对于给定的字符串,算出字符串中 0 的个数、1 的个数,记 d 为 min{0的个数,1的个数,k}。在恰好 k 次操作中,只需要做 d 次有效交换:将从前往后数 d 个 1 与从后往前数 d 个 0 交换(代码中通过将前 d 个 1 变为 0、后 d 个 0 变为 1 实现)。剩余的 k−d 次对调可以通过交换两个数字相同的位置来消耗,不会改变最终序列。注意当 n=2 时,因为要恰好交换 k 次,所以当 k 为奇数时,01 这种字符串得交换一次成 10。
c++
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10;
实验室有一排共 $n$ 个指示灯,每个灯当前显示数字 0 或 1。管理员可以执行一次对调操作:选择两个不同的位置 $i$ 和 $j$($1 \le i < j \le n$),交换这两个位置上的数字。允许交换两个数字相同的位置。
现在必须恰好执行 $k$ 次对调操作。在所有可能的操作结果中,管理员希望最终从左到右拼成的数字序列字典序最小。对于两个长度均为 $n$ 的序列,若它们从左到右第一个不同的位置上,前者为 0 而后者为 1,则称前者字典序更小。
请你求出这个字典序最小的最终序列。
约束:测试数据组数 $T$ 不超过 10^4;每组序列长度 $n$ 满足 $2 \le n \le 2 \times 10^5$;操作次数 $k$ 满足 $1 \le k \le 10^9$;所有组的 $n$ 之和不超过 2 \times 10^5。
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.