题目
给你两个长度为K的板子,有N个往下掉的点,问最多能装多少个点。
题解思路
处理放左右两个部分的最大值再求和。
和那道蓄意轰拳有点像。
参考链接
AC代码
#include <bits/stdc++.h>
//#include <unordered_map>
//priority_queue
#define PII pair<int,int>
#define ll long long
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 500100;
int a[N] ;
int l[N] ;
int r[N] ;
void solve()
{
int n , k ;
cin >> n >> k ;
for (int i = 1 ; i <= n ; i++ )
cin >> a[i] ;
for (int i = 1 ; i <= 2*n ; i++ )
l[i] = 0 , r[i] = 0 ;
for (int i = 1 ; i <= n ; i++ )
{
int t1 ;
cin >> t1 ;
}
if ( n == 1 )
{
cout << "1\n" ;
return ;
}
sort(a+1,a+1+n) ;
for (int i = 1 , j = 1 ; i <= n ; i++ )
{
while ( j <= i && a[i] - a[j] > k )
{
j++;
}
l[i] = i - j + 1 ;
l[i] = max(l[i],l[i-1]) ;
}
for (int i = n , j = n ; i >= 1 ; i-- )
{
while ( j >= i && a[j] - a[i] > k )
j-- ;
r[i] = j - i + 1 ;
r[i] = max(r[i],r[i+1]) ;
}
int ans = 1 ;
for (int i = 1 ; i < n ; i++ )
ans = max(ans,r[i+1]+l[i]) ;
cout << ans << "\n" ;
}
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int T ;
cin >> T ;
while (T--)
solve() ;
return 0 ;
}