hdu-6850 Game(思维题)
#include <bits/stdc++.h>
using namespace std;
int _, n;
long long x[ 2002 ] , y[ 2002 ] ;
struct node {
int u, v;
long long w;
} line[ 4000006 ] ;
int vis[ 2003 ] [ 2003 ] ;
long long mp[ 2003 ] [ 2003 ] ;
long long cal ( int i, int j) {
return ( x[ i] - x[ j] ) * ( x[ i] - x[ j] ) + ( y[ i] - y[ j] ) * ( y[ i] - y[ j] ) ;
}
bool cmp ( node a, node b) {
return a. w > b. w;
}
void bfs ( int pos, long long len) {
for ( int i = 1 ; i <= n; i++ ) {
if ( i == pos) continue ;
int fi = min ( i, pos) ;
int se = max ( i, pos) ;
if ( len > mp[ fi] [ se] ) vis[ fi] [ se] = 2 ;
}
}
int main ( ) {
scanf ( "%d" , & _) ;
while ( _-- ) {
memset ( vis, 0 , sizeof ( vis) ) ;
scanf ( "%d" , & n) ;
for ( int i = 1 ; i <= n; i++ ) {
scanf ( "%lld %lld" , & x[ i] , & y[ i] ) ;
}
int cnt = 0 ;
for ( int i = 1 ; i <= n; i++ ) {
for ( int j = i+ 1 ; j <= n; j++ ) {
mp[ i] [ j] = cal ( i, j) ;
line[ ++ cnt] . u = i;
line[ cnt] . v = j;
line[ cnt] . w = mp[ i] [ j] ;
}
}
sort ( line+ 1 , line+ 1 + cnt, cmp) ;
for ( int i = 1 ; i <= cnt; i++ ) {
int u = line[ i] . u, v = line[ i] . v;
if ( vis[ u] [ v] ) continue ;
vis[ u] [ v] = 1 ;
bfs ( u, mp[ u] [ v] ) ;
bfs ( v, mp[ u] [ v] ) ;
}
bool ok = 0 ;
for ( int i = 2 ; i <= n; i++ ) {
if ( vis[ 1 ] [ i] == 1 ) {
ok = 1 ;
break ;
}
}
if ( ok) puts ( "YES" ) ;
else puts ( "NO" ) ;
}
}
hdu-6852 Increasing and Decreasing(构造题)
#include <bits/stdc++.h>
using namespace std;
int _, n;
long long a, b;
deque < int > q;
stack < int > sta;
int main ( ) {
scanf ( "%d" , & _) ;
while ( _-- ) {
scanf ( "%d %lld %lld" , & n, & a, & b) ;
if ( a+ b- 1 <= n && n <= a* b) puts ( "YES" ) ;
else { puts ( "NO" ) ; continue ; }
int sheng = 0 , pos = n;
bool ok = 0 ;
while ( pos > 0 ) {
sheng++ ;
for ( ; pos >= 1 ; pos-- ) {
sta. push ( pos) ;
if ( sta. size ( ) == b || sheng+ pos- 1 == a) break ;
} pos-- ;
if ( sheng+ pos == a) ok = 1 ;
while ( ! sta. empty ( ) ) {
int t = sta. top ( ) ; sta. pop ( ) ;
q. push_front ( t) ;
}
if ( ok) {
for ( ; pos >= 1 ; pos-- ) q. push_front ( pos) ;
}
}
for ( int i = 1 ; i <= n; i++ ) {
printf ( "%d%c" , q. front ( ) , i== n? '\n' : ' ' ) ;
q. pop_front ( ) ;
}
}
}
hdu-6853 Jogging
#include <bits/stdc++.h>
using namespace std;
int _;
long long x, y, fenzi, fenmu;
bool ok;
map < pair< long long , long long > , bool > vis;
long long gcd ( long long a, long long b) {
if ( b == 0 ) return a;
return gcd ( b, a% b) ;
}
int bfs ( long long x, long long y) {
queue < pair< long long , long long > > q;
q. push ( make_pair ( x, y) ) ;
vis[ make_pair ( x, y) ] = 1 ;
while ( ! q. empty ( ) ) {
pair < long long , long long > t = q. front ( ) ; q. pop ( ) ;
for ( long long i = - 1 ; i <= 1 ; i++ ) {
for ( long long j = - 1 ; j <= 1 ; j++ ) {
long long ti = t. first+ i, tj = t. second+ j;
if ( gcd ( ti, tj) > 1 ) {
if ( ti == tj) return 0 ;
else {
fenmu++ ;
if ( ! vis[ make_pair ( ti, tj) ] ) {
q. push ( make_pair ( ti, tj) ) ;
vis[ make_pair ( ti, tj) ] = 1 ;
}
}
}
}
}
}
return 1 ;
}
int main ( ) {
scanf ( "%d" , & _) ;
while ( _-- ) {
ok = 1 ;
vis. clear ( ) ;
fenzi = 0 , fenmu = 0 ;
scanf ( "%lld %lld" , & x, & y) ;
for ( long long i = - 1 ; i <= 1 ; i++ ) {
for ( long long j = - 1 ; j <= 1 ; j++ ) {
if ( gcd ( x+ i, y+ j) > 1 ) {
fenzi++ ;
}
}
}
ok = bfs ( x, y) ;
if ( ! ok) { puts ( "0/1" ) ; continue ; }
long long yue = gcd ( fenzi, fenmu) ;
printf ( "%lld/%lld\n" , fenzi/ yue, fenmu/ yue) ;
}
}