快读
int read ( )
{
int num= 0 ; bool flag= 1 ;
char c= getchar ( ) ;
for ( ; c< '0' || c> '9' ; c= getchar ( ) )
if ( c== '-' ) flag= 0 ;
for ( ; c>= '0' && c<= '9' ; c= getchar ( ) )
num= ( num<< 1 ) + ( num<< 3 ) + c- '0' ;
return flag? num: - num;
}
二分
int erfen ( )
{
double mid, left= 0 , right= maxn;
while ( left+ 1 < right)
{
mid= ( left+ right) / 2 ;
if ( check ( mid) ) left= mid;
else right= mid;
}
if ( check ( mid) ) return left;
else return right;
}
堆
priority_queue< int > da
priority_queue< int , vector< int > , greater< int > > xiao
. push ( )
. pop ( )
. top ( )
. empty ( )
. size ( )
线式筛
int v[ maxn] ;
int prime[ maxn]
void getprimes ( int n)
{
int m= 0 ;
for ( int y= 2 ; y<= n; y++ )
{
if ( v[ y] == 0 )
{
v[ y] = y;
prime[ ++ m] = y;
}
for ( int i= 1 ; i<= m; i++ )
{
int x= prime[ i] ;
if ( x> v[ y] )
break ;
if ( x* y> n)
break ;
int z= x* y;
v[ z] = x;
}
}
}
gcd
long long gcd ( long long x, long long y) {
if ( x< y) swap ( x, y) ;
if ( y== 0 ) return x;
else return gcd ( y, x% y) ;
}
树状数组
int lowbit ( int x) {
return x& - x; }
void add ( int x, int y) {
while ( x< MAXN) c[ x] + = y, x+ = lowbit ( x) ; }
int work ( int x)
{
int sum= 0 ;
while ( x> 0 ) sum+ = c[ x] , x- = lowbit ( x) ;
return sum;
}
线段树
#define N 200005
#define LL long long
using namespace std;
int n, m, arr[ N] ;
struct Seg_Tree
{
LL sum[ N<< 2 ] , laz[ N<< 2 ] , tmax[ N<< 2 ] ;
const LL INF = 0x3f3f3f3f3f3f3f3f ;
inline void pushup ( int p)
{
sum[ p] = sum[ p<< 1 ] + sum[ p<< 1 | 1 ] ;
tmax[ p] = max ( tmax[ p<< 1 ] , tmax[ p<< 1 | 1 ] ) ;
}
inline void spread ( int p, int l, int r)
{
if ( ! laz[ p] ) return ;
int mid= ( l+ r) >> 1 ;
sum[ p<< 1 ] + = laz[ p] * ( mid- l+ 1 ) ;
sum[ p<< 1 | 1 ] + = laz[ p] * ( r- mid) ;
laz[ p<< 1 ] + = laz[ p] ;
laz[ p<< 1 | 1 ] + = laz[ p] ;
laz[ p] = 0 ;
}
void build ( int p, int l, int r)
{
if ( l== r) return ( void ) ( sum[ p] = tmax[ p] = arr[ l] ) ;
int mid= ( l+ r) >> 1 ;
build ( p<< 1 , l, mid) ;
build ( p<< 1 | 1 , mid+ 1 , r) ;
}
inline LL query_max ( int p, int l, int r, int L, int R)
{
if ( L<= l&& r<= R) return tmax[ p] ;
spread ( p, l, r) ;
int mid= ( l+ r) >> 1 ;
LL res= - INF;
if ( L>= mid) res= query_max ( p<< 1 , l, mid, L, R) ;
if ( R< mid) res= max ( res, query_max ( p<< 1 | 1 , mid+ 1 , r, L, R) ) ;
return res;
}
inline LL query_sum ( int p, int l, int r, int L, int R)
{
if ( L<= l&& r<= R) return sum[ p] ;
spread ( p, l, r) ;
int mid= ( l+ r) >> 1 ;
LL res= 0 ;
if ( L>= mid) res+ = query_sum ( p<< 1 , l, mid, L, R) ;
if ( R< mid) res+ = query_sum ( p<< 1 | 1 , mid+ 1 , r, L, R) ;
return res;
}
inline void add ( int p, int l, int r, int L, int R, LL k)
{
if ( L<= l&& r<= R) return ( void ) ( sum[ p] + = k* ( r- l+ 1 ) , laz[ p] + = k) ;
spread ( p, l, r) ;
int mid= ( l+ r) >> 1 ;
if ( L>= mid) add ( p<< 1 , l, mid, L, R, k) ;
if ( R< mid) add ( p<< 1 | 1 , mid+ 1 , r, L, R, k) ;
pushup ( p) ;
}
} tr;
神奇六函数
int add ( int a, int b, int p= mod) {
return a+ b>= p? a+ b- p: a+ b; }
int sub ( int a, int b, int p= mod) {
return a- b< 0 ? a- b+ p: a- b; }
int mul ( int a, int b, int p= mod) {
return ( LL) a* b% p; }
void sadd ( int & a, int b, int p= mod) {
a= add ( a, b, p) ; }
void ssub ( int & a, int b, int p= mod) {
a= sub ( a, b, p) ; }
void smul ( int & a, int b, int p= mod) {
a= mul ( a, b, p) ; }