Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
为什么要deque?我直接que,好心人可以站内信rt 而且手写队列和map和读入居然很慢……300+ms 向来手写读入是相当快的啊…… #include<iostream> #include<cstdio> #include<cstdlib> #include<string> #include<cstring> #include<cmath> #include<ctype.h> #include<algorithm> #include<queue> #include<vector> #include<bitset> using namespace std; FILE *fin=freopen( "3320.in" , "r" , stdin ); FILE *fout=freopen( "3320.out" , "w" , stdout ); int N,a[ 1010000 ]; int g[ 1000003 ],dat[ 1010000 ],next[ 1010000 ],size; int cnt[ 1000003 ]; struct queue{ int head,tail; int a[ 1010000 ]; int size(){ return head-tail; } void push( int m ){ a[ ++head ]=m; } int front() { return a[ tail+1 ]; } void pop() { tail++; } }Q; int getint() { int ret=0; char tmp; while( !isdigit( tmp=getc( fin ) ) ); do{ ret=( ret<<3 )+( ret<<1 )+tmp-'0'; }while( isdigit( tmp=getc( fin ) ) ); return ret; } int find( int m ) { int h=m%1000003; int p=g[ h ]; while( p ){ if( dat[ p ]==m ) return p; p=next[ p ]; } next[ ++size ]=g[ h ]; g[ h ]=size; dat[ size ]=m; return size; } int main() { N=getint(); for( int i=1 ; i<= N ; i++) a[ i ]=find( getint() ); int j=1,tot=0,ans; while( tot<size ){ if( cnt[ a[ j ] ]==0 ) tot++; cnt[ a[ j ] ]++; Q.push( a[ j++ ] ); while( cnt[ Q.front() ]>1 ) --cnt[ Q.front() ],Q.pop(); } ans=Q.size(); while( j<=N ){ cnt[ a[ j ] ]++; Q.push( a[ j ] ); while( cnt[ Q.front() ]>1 ) --cnt[ Q.front() ],Q.pop(); ans=min( ans , Q.size() ); j++; } cout << ans << endl; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator