F.A.Q
Hand In Hand
Online Acmers
Problem Archive
Realtime Judge Status
Authors Ranklist
 
     C/C++/Java Exams     
ACM Steps
Go to Job
Contest LiveCast
ICPC@China
Best Coder beta
VIP | STD Contests
    DIY | Web-DIY beta
Author ID 
Password 
 Register new ID

cats 的二分答案

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)
Total Submission(s): 640    Accepted Submission(s): 297


Problem Description
cats 刚刚开始学习二分答案,写出了下面这段代码(以下给出伪代码,在题目的末尾会提供 C/C++,Python,Java 语言的具体代码)



给出的数组 $a$ 下标范围为 $[1,n]$,且
$$
a_i=
\begin{cases}
1 & (i\in[1,n))\\
2 & (i=n)
\end{cases}
$$
cats 知道 $n\in[l,r]$,他希望通过以上这段代码找出 $n$ 的值。可以发现这段代码有访问越界下标的可能,访问越界下标 $i>n$ 时,会得到 $a_i=0$。但是在一次程序运行过程中,如果访问越界下标超过 $k$ 次,程序就会崩溃。现在你需要求出有多少不同的 $n$($n\in[l,r]$)可以让程序在不崩溃的情况下得到正确结果。
 

Input
第一行一个整数 $T$($1\leq T\leq 10^3$),表示测试数据的组数。

接下来 $T$ 行,每行三个整数 $l,r,k$($1\leq l\leq r\leq 10^{18},0\leq k\leq 10^{18}$),表示 $n$ 的范围和程序在不崩溃的情况下访问越界下标次数的上限。
 

Output
对于每组测试数据,输出一个整数,表示满足条件的不同的 $n$ 的个数。
 

Sample Input
3 1 100 0 1 100 1 1 100 2
 

Sample Output
7 28 61
 

Hint

C/C++:
```cpp
long long BinarySearch(long long l,long long r,int *a)
{
  while(l<=r)
  {
    long long mid=(l+r)/2;
    int val=a[mid];
    if(val==2)
    {
      return mid;
    }
    if(val==1)
    {
      l=mid+1;
    }
    else
    {
      r=mid-1;
    }
  }
  return -1;
}
```
Python:
```python
def BinarySearch(l, r, a):
while l <= r:
mid = (l + r) // 2
val = a[mid]
if val == 2:
return mid
elif val == 1:
l = mid + 1
else:
r = mid - 1
return -1
```
Java:
```java
public class BinarySearch
{
public static long binarySearch(long l, long r, int[] a)
{
while(l<=r)
{
long mid=(l+r)/2;
int val=a[mid];
if(val==2)
{
return mid;
}
if(val==1)
{
l=mid+1;
}
else
{
r=mid-1;
}
}
return -1;
}
}
```
 

Source
 

Statistic | Submit | Discuss | Note
Hangzhou Dianzi University Online Judge 3.0
Copyright © 2005-2024 HDU ACM Team. All Rights Reserved.
Designer & Developer : Wang Rongtao LinLe GaoJie GanLu
Total 0.000000(s) query 1, Server time : 2024-09-20 06:01:45, Gzip enabled