问题
-
这个题真的太坑了
-
首先没看出来二分,也不会模板,就自己写自己的
-
然后出现了运行正确但是提交超时错误,改了好多遍没改好
-
边界边界边界边界!! !
二分代码
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int a[N];
int n, m;
int main()
{
cin >> n >> m;
for (int i = 0; i < n; i++) scanf("%d", &a[i]);
while (m--)
{
int x;
cin >> x;
int l = 0, r = n - 1;
while (l < r)
{
int mid = l + r >> 1;
if (a[mid] >= x) r = mid;
else l = mid +1;
}
if (a[l] != x)
{
cout << "-1 " << "-1" << endl;
continue;
}
cout << l << " ";
l = 0, r = n - 1;
while (l < r)
{
int mid = l + r + 1 >> 1;
if (a[mid] <= x) l = mid;
else r = mid - 1;
}
cout << l << endl;
}
return 0;
}
之前写的代码(测试通过了但是提交就是超时,边界)
#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int a[N];
void findindex(int a[], int n, int k)
{
int i = 0;
int j; int m;
for(j = 0; j < n; j ++)
{
if(a[j] == k) break;
}
if(j >= n)
{
cout << "-1" << " " << "-1";
}
else
{
while(a[i] != k) i ++;
cout << i <<" ";
if(i == n-1) cout << i << endl;
else
{
for(m = i; m < n; m ++)
{
if(a[m] != a[i]) break;
}
cout << m-1 << endl;
}
}
}
int main()
{
int n, q; int cnt = 0;
cin >> n >> q;
for(int i = 0; i < n; i ++) cin >> a[i];
int k;
while(cnt < q)
{
cin >> k;
findindex(a, n, k);
cnt ++;
}
return 0;
}