yylidiw | 2016-10-29 21:54:18
Author
我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;
}