E. Two Platforms

#include <set>
#include <map>
#include <queue>
#include <deque>
#include <stack>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>

#define FAST ios::sync_with_stdio(false)
#define LL long long
#pragma GCC optimize(2)

using namespace std;

vector<int> cor;
const int N = 2e5 + 10;
const int INF = 0x3f3f3f3f;
int t;

int main(void)
{
	FAST;
	cin >> t;
	
	while(t --){
		
		cor.clear();
		
		int cnt,len;
		cin >> cnt >> len;
		
		for(int i = 0;i < cnt;i ++){
			int x;
			cin >> x;
			
			cor.push_back(x);
		}
		
		for(int i = 0;i < cnt;i ++){ // 能否接受到雨滴与雨滴的y坐标没有关系 
			int y;
			cin >> y;
		}
		
		sort(cor.begin(),cor.end());
		
		// 坐标的读取
		
		int can[N] = {0};
		
		// 为计算第一个板子的放置位置做准备 
		for(int i = 0 ; i < cnt ; i ++){
			auto it = upper_bound(cor.begin(),cor.end(),cor[i] + len) - cor.begin();
			can[i] = it - i; // 放入以这个水滴作为起点可以接到雨滴的最大值 
		}
		
		int back_max[N] = {0};
		
		// 为计算第二个板子的放置位置做准备
		// 计算从后往前每个 [i,n - 1] 的区间内放置板子可以接受到雨滴的最大值 
		for(int i = cnt - 1 ; i >= 0 ; i --){
			back_max[i] = max(back_max[i + 1],can[i]);
		}
		
		int ans = -INF;
		
		// 枚举每一个雨滴作为起点所能接受到雨滴的最大的数目 同时加上这个这个雨滴的板子之后到最后一个雨滴的区间内再放入一个板子所能接受到雨滴的最大值 
		for(int i = 0 ; i < cnt ; i ++){
			ans = max(ans,can[i] + back_max[can[i] + i]); // can[i] = it - i it为板子之后的第一个雨滴的下标 
		}
		
		cout << ans << endl;
	}
	
	return 0;
}

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页