刚刚基础赛T3求调
  • 板块学术版
  • 楼主OIer_Tan
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/9/7 18:03
  • 上次更新2024/9/7 20:59:05
查看原帖
刚刚基础赛T3求调
700210
OIer_Tan楼主2024/9/7 18:03

RT,样例已过但全RE。

#include <bits/stdc++.h>

#ifndef CRT
#define endl '\n'
#endif

using namespace std ;

typedef long long ll ;
typedef unsigned long long ull ;
typedef long double ld ;

const ll N = 1e5 + 5 ;

ll n , m , x [N] , t [N] , placex [N] ;

map <pair <ll,ll>,ll> before_place ;

ll now [N] ;

pair <ll,ll> a [N] ;

int main ()
{
	ios::sync_with_stdio ( 0 ) ;
	cin.tie ( 0 ) ;
	cout.tie ( 0 ) ;
	cin >> n >> m ;
	for ( ll i = 1 ; i <= n ; i ++ )
	{
		cin >> x [i] >> t [i] ;
		a [i] = make_pair ( t [i] , x [i] ) ;
		before_place [make_pair ( t [i] , x [i] )] = i ;
	}
	sort ( a + 1 , a + 1 + n ) ;
	for ( ll i = 1 ; i <= n ; i ++ )
	{
		placex [x [i]] = i ;
		now [before_place [a [i]]] = i ;
//		cout << a [i].first << " " << a [i].second << endl ;
	}
	map <ll,set <ll>> maxr ;
	ll maxspeed = 0 ;
	for ( ll i = 2 ; i <= n ; i ++ )
	{
		if ( llabs ( a [i].second - a [i - 1].second ) / ( a [i].first - a [i - 1].first ) > maxspeed )
		{
			maxspeed = llabs ( a [i].second - a [i - 1].second ) / ( a [i].first - a [i - 1].first ) ;
			maxr [maxspeed].insert ( i ) ;
		}
		else if ( llabs ( a [i].second - a [i - 1].second ) / ( a [i].first - a [i - 1].first ) == maxspeed )
		{
			maxr [maxspeed].insert ( i ) ;
		}
		else
		{
			maxr [llabs ( a [i].second - a [i - 1].second ) / ( a [i].first - a [i - 1].first )].insert ( i ) ;
		}
	}
	while ( m -- )
	{
		ll u , v ;
		cin >> u >> v ;
//		cout << u <<" " << v << endl ;
		auto tmp = maxr.rbegin () ;
		ll beforemax = tmp -> first ;
		pair <ll,ll> ask = make_pair ( v , 0ll ) ;
		ll l = 1 , r = n ;
		while ( l < r )
		{
			ll mid = l + r >> 1 ;
			if ( a [mid] < ask )
			{
				l = mid + 1;
			}
			else
			{
				r = mid - 1 ;
			}
		}
		ll place = l ;
		u = now [u] ;
		if ( tmp -> second.find ( u ) != tmp -> second.end () || tmp -> second.find ( u + 1 ) != tmp -> second.end () )
		{
			if ( tmp -> second.size () == 1 )
			{
				auto tmp2 = next ( tmp ) ;
				if ( tmp2 -> second.find ( place ) != tmp2 -> second.end () || tmp2 -> second.find ( place + 1) != tmp2 -> second.end () )
				{
					if ( tmp2 -> second.size () == 1 )
					{
						beforemax = next ( tmp2 ) -> first ;
					}
					else
					{
						beforemax = tmp2 -> first ;
					}
				}
				else
				{
					beforemax = tmp2 -> first ;
				}
			}
		}
//		u = now [u] ;
		ll pre = place , nxt = place + 1 ;
		if ( a [pre].second == a [u].second && place != 1 )
		{
			pre -- ;
		}
		if ( a [nxt].second == a [u].second && place != n )
		{
			nxt ++ ;
		}
		ll ans1 = llabs ( a [u].second - a [pre].second ) / ( v - a [pre].first ) ;
		ll ans2 = llabs ( a [nxt].second - a [u].second ) / ( a [nxt].first - v ) ;
//		cout << a [u].second << " " << v << endl ;
		ll tmpans ;
		if ( place == 1 )
		{
			tmpans = ans2 ;
		}
		else if ( place == n )
		{
			tmpans = ans1 ;
		}
		else
		{
			tmpans = max ( ans1 , ans2 ) ;
		}
//		cout << beforemax << " " << place << " " << ans1 << " " << ans2 << " " << pre << " " << nxt << endl ;
		ll ans = max ( beforemax , tmpans ) ;
		cout << ans << endl ;
	}
	return 0 ;
}
2024/9/7 18:03
加载中...