# 常用算法模板

#include <cstdio>
#include <algorithm>
#include <iostream>

using namespace std ;
typedef long long ll ;
const int maxN = 100010 ;

int a[ maxN ] ;

inline ll INPUT ( ) {
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(x=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
}

void quick_sort ( const int l , const int r ) {
if ( l > r ) {
return ; ;
}
int i = l , j = r ;
while ( i < j ) {
while ( a[ j ] >= a[ l ] && j > i ) {
--j ;
}
while ( a[ i ] <= a[ l ] && j > i ) {
++i ;
}
if ( j > i )
swap ( a[ i ] , a[ j ] ) ;
}
swap ( a[ l ] , a[ i ] ) ;
quick_sort ( l , i - 1 ) ;
quick_sort ( i + 1 , r ) ;
}

int main ( ) {
int N = INPUT( ) ;
for ( int i=1 ; i<=N ; ++i ) {
a[ i ] = INPUT( ) ;
}
quick_sort ( 1 , N ) ;
for ( int i=1 ; i<=N ; ++i ) {
cout << a[ i ] << endl ;
}
return 0 ;
}
View Code

#include <cstdio>
#include <algorithm>
#include <iostream>

using namespace std ;
typedef long long ll ;
const int maxN = 100010 ;

int a[ maxN ] ;

inline ll INPUT ( ) {
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(x=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
}

int quick_select ( const int l , const int r , const int K ) {
int i = l , j = r ;
while ( i < j ) {
while ( a[ j ] >= a[ l ] && j > i ) {
--j ;
}
while ( a[ i ] <= a[ l ] && j > i ) {
++i ;
}
if ( j > i )
swap ( a[ i ] , a[ j ] ) ;
}
swap ( a[ l ] , a[ i ] ) ;

if ( i - l == K - 1 )
return a[ i ] ;

else if ( i - l >= K )
return quick_select ( l , i - 1 , K ) ;

else
return quick_select( i + 1 , r , K - ( i - l + 1 ) ) ;
}

int main ( ) {
int N = INPUT ( ) ;
int K = INPUT ( ) ;
for ( int i=1 ; i<=N ; ++i ) {
a[ i ] = INPUT( ) ;
}
cout << quick_select ( 1 , N , K ) << endl ;
return 0 ;
}
View Code

//#include <bits/stdc++.h>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std ;
const int maxN = 20010 ;
const int inf = 2147483647 ;

struct Edge {
int to , next ;
}e[ maxN << 1 ] ;

int head[ maxN ] , size[ maxN ] , hv[ maxN ] ;
int _cnt ;

int INPUT ( ) {
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch<='9'&&ch>='0'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
}

void addEdge ( int x , int y ) {
e[ ++_cnt ].to = y ;
e[ _cnt ].next = head[ x ] ;
head[ x ] = _cnt ;
}

void Dfs ( const int x , int fa ) {
size[ x ] = 1 ;
for ( int i=head[ x ] ; i ; i=e[ i ].next ) {
if ( e[ i ].to != fa ) {
Dfs ( e[ i ].to , x ) ;
size[ x ] += size[ e[ i ].to ] ;
}
}
for ( int i=head[ x ] ; i ; i=e[ i ].next ) {
if ( e[ i ].to != fa && size[ e[ i ].to ] > size[ hv[ x ] ] ) {
hv[ x ] = e[ i ].to ;
}
}
}
void init ( ){
_cnt = 0 ;
memset ( size , 0 , sizeof ( size ) ) ;
memset ( hv , 0 , sizeof ( hv ) ) ;
memset ( head , 0 , sizeof ( head ) ) ;
}

int main ( ) {
for ( int T = INPUT ( ) ; T ; --T ) {
init ( ) ;
int N = INPUT ( ) ;
for ( int i=1 ; i<N ; ++i ) {
int x = INPUT ( ) , y = INPUT ( );
addEdge ( x , y ) ;
addEdge ( y , x ) ;
}
Dfs ( 1 , 1 ) ;
int tmp , minNode = 0 , minval = inf ;
for ( int i=1 ; i<=N ; ++i ) {
int tmp = max ( size[ hv[ i ] ] , N - size[ i ] ) ;
if ( tmp < minval ) {
minval = tmp ;
minNode = i ;
}
}
printf ( "%d %d\n" , minNode , minval ) ;
}
return 0 ;
}
poj1655

Tire树

#include <bits/stdc++.h>

using namespace std ;
const int maxN = 5010 ;
typedef long long LL ;

struct tireNode {
int cnt ;
bool last ;
struct tireNode *next[ 26 ] ;
tireNode ( ) {//构造方法初始化
cnt = 0 ;
last = false ;
memset ( next , 0 , sizeof ( next ) ) ;
}
};

char str_[ maxN ] ;

void insert ( tireNode *root , char str[ ] ) {
int len = strlen ( str + 1 ) ;
tireNode *cur = root ;

for ( int i=1 ; i<=len ; ++i ) {
char ch = str[ i ] - 'a' ;
if ( cur -> next[ ch ] == NULL ) {
tireNode* newNode = new tireNode ;
cur -> next[ ch ] = newNode ;
}
cur = cur -> next[ ch ] ;
cur->cnt++ ;
}
cur -> last = true ;
}

bool find ( tireNode *root , char str[ ] ) {
int len = strlen ( str + 1 ) ;
tireNode *cur = root ;
for ( int i=1 ; i<=len ; ++i ) {
char ch = str[ i ] - 'a' ;
if ( cur -> next[ ch ] == NULL ) return false ;
cur = cur -> next[ ch ] ;
}
if ( cur -> last == true ) return true ;
return false ;
}

int main ( ) {
int N , M ;
tireNode* root = new tireNode ;
scanf ( "%d" , &N ) ;
for ( int i=1 ; i<=N ; ++i ) {
scanf ( "%s" , str_ + 1 ) ;
insert ( root , str_ ) ;
}
scanf ( "%d" , &M ) ;
for ( int i=1 ; i<=M ; ++i ) {
scanf ( "%s" , str_ + 1 ) ;
if ( find ( root , str_ ) ) printf ( "Yes\n" ) ;
else printf ( "No\n" ) ;
}
return 0 ;
}

#include <bits/stdc++.h>

using namespace std ;
const int maxNode = 10010 ;
typedef long long LL ;

struct tireTree {
static const int maxLen = 26 ;
int tr[ maxNode ][ maxLen ] ;
bool end[ maxNode ] ;
int count[ maxNode ] ;
int _cnt ;
tireTree ( ) {
_cnt = 1 ;
memset ( tr , 0 , sizeof ( tr ) ) ;
memset ( end , false , sizeof ( end ) ) ;
}
public :
void insert ( char str[ ] ) {
int cur = 1 , len = strlen ( str + 1 ) ;
for ( int i=1 ; i<=len ; ++i ) {
int idx = str[ i ] - 'a' ;
if ( !tr[ cur ][ idx ] ) {
tr[ cur ][ idx ] = ++_cnt ;
}
cur = tr[ cur ][ idx ] ;
}
end[ cur ] = true ;
}

public :
bool exist ( char str[ ] ) {
int cur = 1 , len = strlen ( str + 1 ) ;
for ( int i=1 ; i<=len ; ++i ) {
int idx = str[ i ] - 'a' ;
if ( !tr[ cur ][ idx ] ) {
return false ;
}
cur = tr[ cur ][ idx ] ;
}
return end[ cur ] ;
}
};
tireTree tree ;
char str[ 2000 ] ;
int main ( ) {
int N , M ;
scanf ( "%d" , &N ) ;
for ( int i=1 ; i<=N ; ++i ) {
scanf ( "%s" , str + 1 ) ;
tree.insert ( str ) ;
}
scanf ( "%d" , &M ) ;
for ( int i=1 ; i<=M ; ++i ) {
scanf ( "%s" , str + 1 ) ;
if ( tree.exist ( str ) )
printf ( "YES\n" ) ;
else
printf ( "NO\n" ) ;
}
return 0 ;
}

#include <iostream>
#include <stack>
#include <cstdio>

using namespace std ;
const int INF = 2147483647 ;

class Element {
private :
int Val , Index ;
public :
Element ( ) {
Val = 0 ;
Index = -1 ;
}
Element ( const int __x , const int __y ) {
Val = __x ;
Index = __y ;
}
int getVal ( ) {
return Val ;
}
int getIndex ( ) {
return Index ;
}
void print ( ) {
if ( Index == -1 ) cout << "Do not exist!!" << endl ;
else cout << Index << " " << Val << endl ;
}
};

stack <Element> stk ;
int arr[ 100 ] ;
Element Ans[ 100 ] ;

int In ( ) {
int x = 0 , f = 1 ; char ch = getchar ( ) ;
while ( ch < '0' || ch > '9' ) { if ( ch == '-')f = -1 ; ch = getchar ( ) ;}
while ( ch >= '0' && ch <= '9' ) { x = ( x << 1 ) + ( x << 3 ) + ch - '0' ; ch = getchar ( ) ;}
return x * f ;
}

int main ( ) {
int N = In ( ) ;

for ( int i=1 ; i<=N ; ++i ) arr[ i ] = In ( ) ;

for ( int i=1 ; i<=N+1 ; ++i ) {
Element ele ;
if ( i != N+1 ) ele = Element ( arr[i] , i ) ;
else ele = Element ( INF , -1 ) ;
while ( !stk.empty ( ) && stk.top().getVal( ) < ele.getVal() ) {
Ans[ stk.top().getIndex() ] = ele ;
stk.pop ( ) ;
}
stk.push(ele) ;
}
for ( int i=1 ; i<=N ; ++i ) Ans[ i ].print ( ) ;
return 0 ;
} 
View Code

posted @ 2018-10-26 22:32  SHHHS  阅读(509)  评论(0编辑  收藏