目录
寄语
学过泰戈编程几乎都知道我们是有分阶段的,包括给位快快编程的用户。因为在封面上,有推荐的广告。所以我们先把100的老代码拿出来(会超时,60分)。
100老代码
由于100时第6课只要求60分,所以作者就做了一个会超时的玩意。😓😓😓ㄟ( ▔, ▔ )ㄏ
#include<bits/stdc++.h>
using namespace std;
const int N= 200009;
int s,d,n,k,x[N];
int main(){
freopen("xjj.in","r",stdin);
freopen("xjj.out","w",stdout);
cin>>n>>k;
for(int i=0;i<n;i++){
cin>>x[i];
}
for(s=0;s<=n-k;s++){
d=x[s];
for(int i=0;i<k-1;i++){
if(d>x[s+i+1]) d=x[s+i+1];
}
cout<<d<<" ";
}
return 0;
}
好啦,下面我们有请光荣的103代码先生上场!
103新代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=200009;
ll n,k,L,a[N],b[N],bm[N];
ll rmq(ll l,ll r){
ll ans=a[l];
if(b[l]==b[r])
ans=*min_element(a+l,a+r+1);
else{
for(ll i=l;b[i]==b[l];i++)ans=min(ans,a[i]);
for(ll i=r;b[i]==b[r];i--)ans=min(ans,a[i]);
for(ll k=b[l]+1;k<=b[r]-1;k++)ans=min(ans,bm[k]);
}
return ans;
}
int main(){
freopen("xjj.in","r",stdin);
freopen("xjj.out","w",stdout);
cin>>n>>k;
for(ll i=1;i<=n;i++)cin>>a[i];
L=sqrt(n);
for(ll i=1;i<=n;i++)b[i]=(i-1)/L+1;
for(ll j=1;j<=b[n];j++){
ll r=j*L;
ll l=r-L+1;
bm[j]=*min_element(a+l,a+r+1);
}
for(ll i=k;i<=n;i++)
cout<<rmq(i-k+1,i)<<" ";
return 0;
}
这玩意比较简单,相对而言比较适合学的时间较长的人(3到4年左右)。