社区讨论

左闭右闭二分,为什么这个补丁会造成#6TLE

P2249【深基13.例1】查找参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mhj30c8y
此快照首次捕获于
2025/11/03 19:53
4 个月前
此快照最后确认于
2025/11/03 19:53
4 个月前
查看原帖
如题,
CPP
#include <bits/stdc++.h>
using namespace std;
int n,m;
int arr[1000010];
int q;
int hfind(int num)
{
    int l = 1;  int r = n;
    while(l <= r)
    {
        int md = (l + r)/2;
        if(arr[md] < num)  l = md + 1;
        else if(arr[md] > num)  r = md - 1;
        else if(arr[md] ==num)  return md;//正规解法是不return,然后把==这个情况放到>的情况里了
    }
    if(arr[l] == num)   return l;//正解有这一行,tle没有
    else    return -1;
}
int main()
{
    memset(arr,-1,sizeof(arr));
    cin >> n >> m;
    for(int i = 1; i <= n; i++)  cin >> arr[i];
    for(int i = 0; i < m; i++)
    {
        cin >> q;
        int rt = hfind(q);
        while(rt != -1 && arr[rt-1] == q)   rt--;补丁就是这一行,检测如果与前一个相同则rt左移
        cout << rt << ' ';
    }
}

回复

1 条回复,欢迎继续交流。

正在加载回复...