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 ;
}