Problem 1002 为什么我会MLE?

yylidiw | 2016-10-29 21:54:18Author
我B题是这样写的,求大神告诉我为什么会MLE? #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<cmath> #include<vector> #include<queue> #include<map> #define rep(i,j,k) for(register int i = j; i <= k; i++) #define dow(i,j,k) for(register int i = j; i >= k; i--) #define ll long long using namespace std; inline int read() { register int s = 0, t = 1;char c = getchar(); while( c > '9' || c < '0' ) { if( c == '-' ) t = -1; c = getchar(); } while( c >= '0' && c <= '9' ) s = s * 10 + c - 48, c = getchar(); return s * t; } const int maxn = 1e6+5; int X, k, t, f[maxn], minl[maxn<<2] = {0}; inline void Min(int &x,int t) { if( x > t ) x = t; } int ql, qr, d; #define lc k<<1 #define rc k<<1|1 inline int query(int l,int r,int k) { if( ql <= l && r <= qr ) return minl[k]; int mid = (l + r) >> 1; if( qr <= mid ) return query(l,mid,lc); else if( ql > mid ) return query(mid+1,r,rc); else return min(query(l,mid,lc),query(mid+1,r,rc)); } inline void update(int l,int r,int k) { if( l == ql && r == ql ) { minl[k] = d; return; } int mid = (l + r) >> 1; if( ql <= mid ) update(l,mid,lc); else update(mid+1,r,rc); minl[k] = min(minl[lc],minl[rc]); } int main() { int T = read(); while( T-- ) { X = read(), k = read(), t = read(), f[1] = 0; rep(i,2,X) { ql = max(1,i-t), qr = i - 1, f[i] = query(1,X,1) + 1; // cout<<"W "<<ql<<" "<<qr<<" "<<f[i]<<endl; if( k != 1 ) { int y = i, now = 0; while( y % k == 0 ) { // cout<<"IN "<<endl; y /= k, now++; // cout<<y<<" "<<f[y]<<" "<<f[y]+now<<endl; Min(f[i],f[y] + now); } } // cout<<"E "<<i<<" "<<f[i]<<endl; ql = qr = i, d = f[i], update(1,X,1); } printf("%d\n", f[X]); } return 0; }
yylidiw | 2016-10-29 21:58:18# 1
其实我是TLE
为什么BC这边给我MLE,hdu给我TLE。其实吧!虽然都是错,但因为我今晚有两道题都MLE,所以很伤心。