思路
通过对样例的模拟,发现答案为相邻两个蓝色石子中间最多的红色石子的数量。
双指针做法:
const int N=1e5+10;
int a[N],b[N];
int n,m;
int main()
{
int T;
cin>>T;
while(T--)
{
cin>>n>>m;
for(int i=0;i<n;i++) cin>>a[i];
sort(a,a+n);
for(int i=0;i<m;i++) cin>>b[i];
b[m++]=0,b[m++]=INF;
sort(b,b+m);
int idx=0;
int res=0;
for(int i=0;i<m-1;i++)
{
int cnt=0;
int l=b[i],r=b[i+1];
while(idx < n && a[idx] <= l) idx++;
while(idx < n && a[idx] > l && a[idx] < r)
{
idx++;
cnt++;
}
res=max(res,cnt);
}
if(res == 0) puts("Impossible");
else cout << res << endl;
}
//system("pause");
return 0;
}
注意特判第一个蓝色石子前连续的红色石子数量,以及最后一个蓝色石子后连续的红色石子数量。
map做法:
const int N=1e5+10;
int a[N],b[N];
int n,m;
int main()
{
int T;
cin>>T;
while(T--)
{
cin>>n>>m;
map<int,char> pos;
map<int,int> cnt;
for (int i = 0; i < n; i++)
{
int x;
cin >> x;
pos[x] = ‘r‘;
cnt[x]++;
}
for (int i = 0; i < m; i++)
{
int x;
cin >> x;
pos[x] = ‘b‘;
cnt[x] = 0;
}
int res = 0;
int sum = 0;
for (auto &t : pos)
{
if(t.se == ‘r‘) sum += cnt[t.fi];
else sum=0;
res = max(res, sum);
}
if(res == 0) puts("Impossible");
else cout << res << endl;
}
//system("pause");
return 0;
}