C.硬币游戏—博弈论
# include <iostream>
# include <cstring>
# include <algorithm>
using namespace std;
# define int long long
const int N = 100010 , mod = 10000007 ;
void solve ( )
{
int n; cin>> n;
if ( n% 6 ) cout<< "Alice" << '\n' ;
else cout<< "Bob" << '\n' ;
}
signed main ( )
{
int T; cin>> T;
while ( T-- ) solve ( ) ;
}
D.矩阵—公式推导+前缀和
# include <iostream>
# include <cstring>
# include <algorithm>
using namespace std;
# define int long long
const int N = 2010 , mod = 10000007 ;
int a[ N] [ N] , b[ N] [ N] ;
int s[ N] [ N] ;
signed main ( )
{
int n, m; cin>> n>> m;
for ( int i= 1 ; i<= n; i++ )
for ( int j= 1 ; j<= n; j++ )
cin>> a[ i] [ j] ;
for ( int i= 1 ; i<= n; i++ )
for ( int j= 1 ; j<= n; j++ )
cin>> b[ i] [ j] ;
for ( int i= 1 ; i<= n; i++ )
for ( int j= 1 ; j<= n; j++ )
a[ i] [ j] += a[ i- 1 ] [ j] , b[ i] [ j] += b[ i] [ j- 1 ] ;
while ( m-- )
{
int x1, y1, x2, y2;
cin>> x1>> y1>> x2>> y2;
if ( x1> x2) swap ( x1, x2) ;
if ( y1> y2) swap ( y1, y2) ;
int res= 0 ;
for ( int i= 1 ; i<= n; i++ )
res+= ( a[ x2] [ i] - a[ x1- 1 ] [ i] ) * ( b[ i] [ y2] - b[ i] [ y1- 1 ] ) ;
cout<< res<< '\n' ;
}
}
E.可达点—强连通缩点
# include <iostream>
# include <cstring>
# include <algorithm>
using namespace std;
const int N = 10010 , M= 50010 ;
int h[ N] , e[ M] , ne[ M] , idx= 0 ;
int scc_cnt= 0 , top= 0 , timestamps= 0 ;
int stk[ N] , dfn[ N] , low[ N] , dout[ N] ;
bool in_stk[ N] ;
int id[ N] , nums_size[ N] ;
int n, m;
void add ( int a, int b)
{
e[ idx] = b, ne[ idx] = h[ a] , h[ a] = idx++ ;
}
void tarjan ( int u)
{
dfn[ u] = low[ u] = ++ timestamps;
stk[ ++ top] = u;
in_stk[ u] = true ;
for ( int i= h[ u] ; i!= - 1 ; i= ne[ i] )
{
int j= e[ i] ;
if ( ! dfn[ j] )
{
tarjan ( j) ;
low[ u] = min ( low[ u] , low[ j] ) ;
}
else if ( in_stk[ j] )
{
low[ u] = min ( low[ u] , dfn[ j] ) ;
}
}
if ( dfn[ u] == low[ u] )
{
++ scc_cnt;
int y;
do {
y= stk[ top-- ] ;
in_stk[ y] = false ;
id[ y] = scc_cnt;
nums_size[ scc_cnt] ++ ;
} while ( y!= u) ;
}
}
int main ( )
{
cin>> n>> m;
memset ( h, - 1 , sizeof h) ;
while ( m -- ) {
int a, b;
cin>> a>> b;
add ( a, b) ;
}
for ( int i= 1 ; i<= n; i++ )
{
if ( ! dfn[ i] ) tarjan ( i) ;
}
for ( int i= 1 ; i<= n; i++ )
{
for ( int j= h[ i] ; j!= - 1 ; j= ne[ j] )
{
int k= e[ j] ;
int a= id[ i] , b= id[ k] ;
if ( a!= b)
{
dout[ a] ++ ;
}
}
}
int zeros= 0 , res= 0 ;
for ( int i= 1 ; i<= scc_cnt; i++ )
{
if ( ! dout[ i] )
{
zeros++ ;
res+= nums_size[ i] ;
if ( zeros> 1 )
{
res= 0 ;
break ;
}
}
}
cout<< res<< endl;
}