弄了一天的二分模板 orz
// 查找第一个相等的元素
int find(int n, int key,int *a)
{
int l=0,r=n-1;
while(l<=r)
{
int mid=(l+r)/2;
if(a[mid]>=key) r=mid-1;
else if(a[mid]<key) l=mid+1;
}
if(l<n&&a[l]==key)return l;
return -1;
}
// 查找最后一个相等的元素
int find(int n, int key,int *a)
{
int l=0,r=n-1;
while(l<=r)
{
int mid=(l+r)/2;
if(a[mid]<=key) l=mid+1;
else if(a[mid]>key) r=mid-1;
}
if(r>=0&&a[r]==key)return r;
return -1;
}
// 查找最后一个等于或者小于key的元素
int find(int n, int key,int *a)
{
int l=0,r=n-1;
while(l<=r)
{
int mid=(l+r)/2;
if(a[mid]<=key) l=mid+1;
else if(a[mid]>key) r=mid-1;
}
return r;
}
// 查找最后一个小于key的元素
int find(int n, int key,int *a)
{
int l=0,r=n-1;
while(l<=r)
{
int mid=(l+r)/2;
if(a[mid]>=key) r=mid-1;
else
if(a[mid]<key) l=mid+1;
}
return r;
}
// 查找第一个等于或者大于key的元素
int find(int n, int key,int *a)
{
int l=0,r=n-1;
while(l<=r)
{
int mid=(l+r)/2;
if(a[mid]>=key) r=mid-1;
else
if(a[mid]<key) l=mid+1;
}
return l;
}
// 查找第一个大于key的元素
int find(int n, int key,int *a)
{
int l=0,r=n-1;
while(l<=r)
{
int mid=(l+r)/2;
if(a[mid]<=key) l=mid+1;
else if(a[mid]>key) r=mid-1;
}
return l;
}