RT
我们机房大佬在车上的时候就说这题是三分+模拟,于是身为蒟蒻的我马上就回来学了三分,写出来后被WA成了65,求助
#include <bits/stdc++.h>
#define For( i , j , k ) for( ll i = ( j ) ; i <= ( k ) ; ++ i )
#define For__( i , j , k ) for( ll i = ( j ) ; i >= ( k ) ; -- i )
#define Fore( i , j , k ) for( ll i = j ; i ; i = k )
using namespace std;
#define ll long long
#define lf double
#define llf long double
template < typename T >
inline void read( T &num ){
num = 0 ; T f = 1 ; char c = ' ';
while( c < '0' || c > '9' ) if( ( c = getchar() ) == '-' ) f = -1;
while( c >= '0' && c <= '9' ) num = ( num << 1 ) + ( num << 3 ) + ( c ^ 48 ) , c = getchar();
num *= f;
return ;
}
char write_use_string[ 1035 ] , write_use_cnt;
template < typename T >
inline void write_no_string( T num ){
do{
write_use_string[ ++ write_use_cnt ] = num % 10 + '0';
num /= 10;
}while( num );
For__( i , write_use_cnt , 1 )
putchar( write_use_string[ i ] );
return ;
}
template < typename T >
inline void write( T num , string printf_str ){
if( num < 0 ) putchar( '-' ) , num = -num;
write_use_cnt = 0;
write_no_string( num );
printf( "%s" , printf_str.c_str() );
return ;
}
const ll maxn = 2e5 + 5;
ll n , m1 , m2;
struct Node{
ll times , id;
bool val;
Node( ll times_ = 0 , bool val_ = false , ll id_ = 0 ){
times = times_;
val = val_;
id = id_;
}
bool operator < ( const Node &x ) const{
return times < x.times;
}
}a[ maxn << 1 ] , b[ maxn << 1 ];
bool visit[ maxn ];
inline ll check( ll x ){//判断
ll xa = x , xb = n - x;
ll ans = 0;
For( i , 1 , m1 )
visit[ i ] = false;
For( i , 1 , m1 << 1 ){
if( !a[ i ].val && xa ){
-- xa;
++ ans;
visit[ a[ i ].id ] = true;
}
else if( a[ i ].val && visit[ a[ i ].id ] )
++ xa;
}
For( i , 1 , m2 )
visit[ i ] = false;
For( i , 1 , m2 << 1 ){
if( !b[ i ].val && xb ){
-- xb;
++ ans;
visit[ b[ i ].id ] = true;
}
else if( b[ i ].val && visit[ b[ i ].id ] )
++ xb;
}
return ans;
}
int main(){
ll x;
read( n ) , read( m1 ) , read( m2 );
For( i , 1 , m1 ){
read( x );
a[ ( i << 1 ) - 1 ] = Node( x , false , i );
read( x );
a[ i << 1 ] = Node( x , true , i );
}
For( i , 1 , m2 ){
read( x );
b[ ( i << 1 ) - 1 ] = Node( x , false , i );
read( x );
b[ i << 1 ] = Node( x , true , i );
}//读入
sort( a + 1 , a + ( m1 << 1 ) + 1 );
sort( b + 1 , b + ( m2 << 1 ) + 1 );//排序
ll l = 0 , r = n;
while( r - l >= 3 ){//三分
ll lmid = l + ( r - l ) / 3 , rmid = r - ( r - l ) / 3;
if( check( lmid ) < check( rmid ) )
l = lmid;
else
r = rmid;
}
write( max( check( l + r >> 1 ) , max( check( l ) , check( r ) ) ) , "\n" );
return 0;
}
评测记录: