loj#P3586. 「eJOI2021」二分查找
「eJOI2021」二分查找
题目描述
本题译自 eJOI2021 Problem D. Binsearch
bool binary_search(int n, int p[], int target){
int left = 1, right = n;
while(left < right){
int mid = (left + right) / 2;
if(p[mid] == target)
return true;
else if(p[mid] < target)
left = mid + 1;
else
right = mid - 1;
}
if(p[left] == target) return true;
else return false;
}
众所周知,如果 恰好是排好序的,这段代码将返回 ,当且仅当 在 中出现。换句话说,如果 不是排好序的,那么可能就不是这样了。
给一个正整数 和一个序列 $b_1,\ldots ,b_n\in \{\texttt{true},\texttt{false}\}$。保证存在一个正整数 满足 。你必须生成一个 的排列 满足一些条件。令 为对于 ,调用 \texttt{binary_search(n, p, i)} 时不返回 的 的个数。你必须找到一个 使得 尽可能小(详见「数据范围与提示」中的说明)。
注意,一个 的排列是指一个 个整数组成的数列,满足从 到 的整数在数列中恰好出现一次。
输入格式
输入包含多组数据。第一行包含一个整数 ,表示测试数据组数。接下来有 组数据。
对于每组数据,第一行一个整数 ,第二行一个长度为 且只包含 的字符串。这些字符不用空格隔开。如果第 个字符为 ,则 ,如果是 ,则 。
输出格式
输出包含对于这 组数据的答案。每行一个排列 ,表示对该组测试数据的答案。
4
3
111
7
1111111
3
000
7
000000000
1 2 3
1 2 3 4 5 6 7
3 2 1
7 6 5 4 3 2 1
2
3
010
7
0010110
3 2 1
7 3 1 5 2 4 6
数据范围与提示
- 令 表示在输入中所有 的和
- 存在 ,满足
- 如果对于子任务的所有测试点,都有 ,那么你会得到该子任务的全部分数。
- 否则,如果对于子任务的所有测试点,都有 (即 ),那么你会得到该子任务 的分数。
# | 分值 | 限制 |
---|---|---|
,并且 在 中均匀随机生成 | ||
无附加限制 |