What exactly am I doing wrong?

Правка en1, от comingsoon.cpp, 2025-02-11 21:55:11

What exactly am I not getting right? I've been trying to solve this problem for so long now and so far, a correct solution still eludes me despite all my best debugging efforts. Someone please help me identify the flaw in this logic.

#include <iostream>
#include <vector>
#define nl '\n'
#define ll long long
using namespace std;
ll bin(ll l , ll r , ll t){
	while(l <= r){
		ll mid = l + (r - l) / 2;
		if(mid == t){
			return mid + 1;
		}
		if(mid < t){
			l = mid + 1;
		}else{
			r = mid - 1;
		}
	}
	return 0;
}
static void paveway(){
	ll n , m; cin >> n >> m; vector<ll> a(n); vector<ll> b(m); vector<ll> c(n);
	for(ll i = 0; i < n; i++) {cin >> a[i];}
	for(ll i = 0; i < m; i++){cin >> b[i];} sort(b.begin(),b.end());
	a[0] = min(a[0] , b[0] - a[0]);
	a[n-1] = max(a[n-1] , b[m-1] - a[n-1]);
	for(ll i = 1; i < n - 1; i++){
		if(a[i] > a[i-1]){
			ll l = a[i-1] + a[i] , r = 2 * a[i] , res = 0;
			for(ll j = 0; j < m; j++){
				res = bin(l , r , b[j]);
				if(res){
					a[i] = b[j] - a[i];
					break;
				}
			}
		}
		if(a[i] < a[i-1]){
			ll l = a[i-1] + a[i] , r = max(a[i+1]+a[i], l) , res = 0;
			for(ll j = 0; j < m; j++){
				res = bin(l , r , b[j]);
				if(res){
					a[i] = b[j] - a[i];
					break;
				}
			}
			if(!res) break;
		}
	}
	for(ll i = 1; i < n; i++){
		if(a[i] < a[i-1]){
			cout << "NO" << nl;
			return;
		}
	}
	cout << "YES" << nl;
} 
int main(){ 
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	//ll t = 1;
	ll t; cin >> t;
	for(;t--;)
	paveway();
return 0;
}

История

 
 
 
 
Правки
 
 
  Rev. Язык Кто Когда Δ Комментарий
en1 Английский comingsoon.cpp 2025-02-11 21:55:11 1661 Initial revision (published)