#include<iostream>
using namespace std;
int T,n,m,x;
int a[1100],b[1100];
int find1(int x,int s,int t)
{
int mid;
while(s<t)
{
mid=(s+t)>>1;
if(a[mid]>x)
t=mid;
else
s=mid+1;
}
return s;
}
int find2(int x,int s,int t)
{
int mid;
while(s<t)
{
mid=(s+t)>>1;
if(a[mid]>=x)
t=mid;
else
s=mid+1;
}
return s;
}
int find3(int x,int s,int t)
{
int mid;
while(s<t)
{
mid=(s+t)>>1;
if(b[mid]<x)
t=mid;
else
s=mid+1;
}
return s;
}
int find4(int x,int s,int t)
{
int mid;
while(s<t)
{
mid=(s+t)>>1;
if(b[mid]<=x)
t=mid;
else
s=mid+1;
}
return s;
}
int main()
{
cin>>T;
while(T--)
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
b[n-i+1]=a[i];
}
cin>>m;
for(int i=1;i<=m;i++)
{
cin>>x;
//最长不下降序列。
//find1的结果是序列中第一个比x大的值的位置。
//若序列中的值都小于或等于x,则返回序列最后一个位置。
cout<<find1(x,1,n)<<endl;
//最长不下降序列。
//find2的结果是序列中第一个大于或等于x的值的位置。
//若序列中的值都小于,则返回序列最后一个位置。
cout<<find2(x,1,n)<<endl;
//最长不上升序列。
//find3的结果是序列中第一个比x小的值的位置。
//若序列中的值都大于或等于x,则返回序列最后一个位置。
cout<<find3(x,1,n)<<endl;
//最长不上升序列。
//find4的结果是序列中第一个小于或等于x的值的位置。
//若序列中的值都大于x,则返回序列最后一个位置。
cout<<find4(x,1,n)<<endl;
}
}
return 0;
}
二分查找单调队列
最新推荐文章于 2024-06-09 17:05:53 发布