位运算 :
求n的第k位数字: n >> k & 1
返回n的最后一位1:lowbit(n) = n & -n
双指针算法
for ( int i = 0 , j = 0 ; i < n; i ++ )
{
while ( j < i && check ( i, j) ) j ++ ;
}
常见问题分类:
( 1 ) 对于一个序列,用两个指针维护一段区间
( 2 ) 对于两个序列,维护某种次序,比如归并排序中合并两个有序序列的操作
#include <iostream>
#include <string.h>
using namespace std;
int main ( )
{
char str[ 1000 ] ;
gets ( str) ;
int n= strlen ( str) ;
for ( int i= 0 ; i< n; i++ )
{
int j= i;
while ( j< n&& str[ j] != ' ' ) j++ ;
for ( int k= i; k< j; k++ ) cout << str[ k] ;
cout << endl;
i= j;
}
return 0 ;
}
离散化
vector< int > alls;
sort ( alls. begin ( ) , alls. end ( ) ) ;
alls. erase ( unique ( alls. begin ( ) , alls. end ( ) ) , alls. end ( ) ) ;
int find ( int x)
{
int l = 0 , r = alls. size ( ) - 1 ;
while ( l < r)
{
int mid = l + r >> 1 ;
if ( alls[ mid] >= x) r = mid;
else l = mid + 1 ;
}
return r + 1 ;
}
区间合并
void merge ( vector< PII> & segs)
{
vector< PII> res;
sort ( segs. begin ( ) , segs. end ( ) ) ;
int st = - 2e9 , ed = - 2e9 ;
for ( auto seg : segs)
if ( ed < seg. first)
{
if ( st != - 2e9 ) res. push_back ( { st, ed} ) ;
st = seg. first, ed = seg. second;
}
else ed = max ( ed, seg. second) ;
if ( st != - 2e9 ) res. push_back ( { st, ed} ) ;
segs = res;
}