单调栈+两个特殊情况骗分
#include<cstdio>
using namespace std;
typedef long long ll;
const ll N=1e7+10;
ll n,xn,k,ti,tmp,x[N],s[N],feb[N],top;
ll k2(ll x){
for(ll i=1;i<=100;++i){
if(feb[i]==x)return x;
if(feb[i]>x)return k2(x-feb[i-1]);
}
}
int main(){
scanf("%lld%lld",&n,&k);
feb[1]=feb[2]=1;
for(ll i=3;i<=110;++i)feb[i]=(feb[i-1]+feb[i-2]);
if(k==1){
printf("%lld\n",(n&(-n)));
return 0;
}
if(k==2){
printf("%lld\n",k2(n));
return 0;
}
x[1]=1;
s[++top]=1;
for(ll i=2;i<=n;++i){
tmp=0;
for(;top&&((s[top]+(x[s[top]]-1)/k)<i);--top);
if(top)tmp=s[top];
x[i]=i-tmp;
s[++top]=i;
}
printf("%lld\n",x[n]);
return 0;
}
但是数组初始时改为 x[N]={ 0 , 1 }后就CE了
本地编译也慢了很多
#include<cstdio>
using namespace std;
typedef long long ll;
const ll N=1e7+10;
ll n,xn,k,ti,tmp,x[N]={0,1},s[N],feb[N],top;
ll k2(ll x){
for(ll i=1;i<=100;++i){
if(feb[i]==x)return x;
if(feb[i]>x)return k2(x-feb[i-1]);
}
}
int main(){
scanf("%lld%lld",&n,&k);
feb[1]=feb[2]=1;
for(ll i=3;i<=110;++i)feb[i]=(feb[i-1]+feb[i-2]);
if(k==1){
printf("%lld\n",(n&(-n)));
return 0;
}
if(k==2){
printf("%lld\n",k2(n));
return 0;
}
s[++top]=1;
for(ll i=2;i<=n;++i){
tmp=0;
for(;top&&((s[top]+(x[s[top]]-1)/k)<i);--top);
if(top)tmp=s[top];
x[i]=i-tmp;
s[++top]=i;
}
printf("%lld\n",x[n]);
return 0;
}
有大佬知道这是为什么吗,第一次遇到
问一下各位OIer有同样情况吗?