指標之間
0.5s 256M小 A 正在整理一排箱子。評分程式會選出這排箱子中的兩個位置,並把這兩個位置的指標傳給你。請計算這兩個位置中間,嚴格夾著多少個箱子。
你需要實作以下函式:
int count_between(int *a, int *b);
- 正式評分程式會準備一個
int陣列,然後呼叫count_between(&arr[p - 1], &arr[q - 1]);。 - 指標
a與b都會指向同一個陣列中的有效元素,不會是空指標。 - 回傳值是兩個指標所指位置之間的元素數量,不包含兩個端點本身。
- 如果兩個指標指向同一個元素,或指向相鄰的兩個元素,答案都是
0。 - 指標的先後順序不固定;不管
a在b左邊或右邊,都要回傳非負答案。 - 請不要自行處理輸入輸出。
輸入格式
範例評分程式採用以下格式輸入:
T
n_1 p_1 q_1
n_2 p_2 q_2
\vdots
n_T p_T q_T
其中 \(T\) 代表評分程式會呼叫 count_between 的次數。每次呼叫時,評分程式會建立長度為 \(n_i\) 的陣列,並把第 \(p_i\) 個與第 \(q_i\) 個元素的指標傳給你的函式。這裡的位置以 \(1\) 開始編號。
請注意,正式評分時不會要求你自行讀取輸入;它會直接呼叫你實作的函式。
限制
- \(1 \le T \le 50\)
- \(1 \le n_i \le 100000\)
- \(1 \le p_i, q_i \le n_i\)
- 每次呼叫時,兩個指標都不是空指標,且都指向同一個陣列中的元素
輸出格式
範例評分程式在每次呼叫 count_between 後,會輸出函式回傳的答案。
請注意,正式評分時不會要求你自行輸出任何內容。
範例輸入 1
3
5 2 5
5 1 2
7 4 4
範例輸出 1
2
0
0
範例解釋 1
第一筆資料中,兩個指標分別指向第 \(2\) 個與第 \(5\) 個元素,中間有第 \(3\)、第 \(4\) 個元素,所以答案是 2。
範例輸入 2
4
10 9 2
6 1 6
100 50 51
100 1 100
範例輸出 2
6
4
0
98
本機測試模板
如果你想先在自己的電腦上測試,只要把你實作的 count_between 函式貼到下面程式碼中的註解位置,就可以直接編譯執行:
#include <iostream>
#include <vector>
using namespace std;
// 把你實作的 count_between 貼在這裡。
// int count_between(int *a, int *b) {
// }
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin >> T;
while (T--) {
int n, p, q;
cin >> n >> p >> q;
vector<int> arr(n);
cout << count_between(&arr[p - 1], &arr[q - 1]) << '\n';
}
}
題目來源
本題改編自 NTUCPC OJ Problem 628。