求助卡常
查看原帖
求助卡常
35891
huangzirui楼主2022/1/17 11:44

和 std 的复杂度一样但是跑得很慢,不清楚原因。

随机的满数据本机约跑 3.6s /ll

https://codeforces.com/contest/1523/submission/143053079

#include<bits/stdc++.h>
using namespace std;
const int maxn=40010,maxN=15,maxk=31;
int i,j,k,h,n,m,a[maxn],dp[maxN][maxn][maxk],f[maxn][maxk][maxN],ans[maxk],tmp[maxk],tmpf[maxn][maxk][maxN];
int Log[maxn];
struct query{
    int L,R,k,to[maxk],ans;
}Q[maxn];
int find(int L,int R,int k){
    int len=R-L+1,L2=Log[len];
    return max(f[L][k][L2],f[R-(1<<L2)+1][k][L2]);
}
int main(){
    freopen("H.in","r",stdin);
    freopen("H.out","w",stdout);
    Log[0]=-1;for(i=1;i<maxn;i++)Log[i]=Log[i/2]+1;
    cin>>n>>m;
    for(i=1;i<=n;i++)scanf("%d",&a[i]);
    for(i=1;i<=n;i++)for(j=0;j<maxN;j++)for(k=0;k<maxk;k++)dp[j][i][k]=min(n,i+a[i]+k);
    for(i=1;i<=m;i++)scanf("%d%d%d",&Q[i].L,&Q[i].R,&Q[i].k),Q[i].to[0]=Q[i].L;
    for(j=0;j<maxN;j++){
        for(i=n;i>=1;i--){
            if(j){
                for(k=0;k<maxk;k++)
                    for(h=0;h+k<maxk;h++)
                        dp[j][i][k+h]=max(dp[j][i][k+h],find(i+1,dp[j-1][i][k],h));
                for(k=1;k<maxk;k++)
                    dp[j][i][k]=min(n,max(dp[j][i][k],dp[j][i][k-1]+1));
            }
        }
        for(i=n;i>=1;i--)
            for(k=0;k<maxk;k++){
                f[i][k][0]=dp[j][i][k];
                for(h=1;h<maxN && i+(1<<h-1)<=n;h++)f[i][k][h]=max(f[i][k][h-1],f[i+(1<<h-1)][k][h-1]);
            }
    }
	cerr << (1.0*clock()/CLOCKS_PER_SEC) << endl;
    for(j=maxN-1;j>=0;j--){
        for(i=n;i>=1;i--){
            for(k=0;k<maxk;k++)
                f[i][k][0]=dp[j][i][k];
            for(k=0;k<maxk;k++)
                for(h=1;h<maxN && i+(1<<h-1)<=n;h++)
                    f[i][k][h]=max(f[i][k][h-1],f[i+(1<<h-1)][k][h-1]);
        }
        for(i=1;i<=m;i++){
            memset(tmp,0,sizeof(tmp));
            for(k=0;k<=Q[i].k;k++)
                for(h=0;k+h<=Q[i].k;h++){
                    //if(j==0 && i==5)cerr<<"find "<<Q[i].L<<' '<<Q[i].to[k]<<' '<<h<<' '<<' '<<find(Q[i].L,Q[i].to[k],h)<<endl;
                    if(Q[i].to[k])tmp[k+h]=max(tmp[k+h],find(Q[i].L,Q[i].to[k],h));
                }
            bool b=true;
            for(k=0;k<=Q[i].k;k++)
                if(tmp[k]>=Q[i].R){b=false;break;}
            if(!b)continue;
            Q[i].ans+=(1<<j);
            for(k=0;k<=Q[i].k;k++)
                Q[i].to[k]=tmp[k];
        }
    }
    for(i=1;i<=m;i++)printf("%d\n",(Q[i].L==Q[i].R?0:Q[i].ans+1));
	cerr << (1.0*clock()/CLOCKS_PER_SEC) << endl;
}
/*
28 1
4 5 5 4 4 5 5 4 1 2 3 1 3 5 4 4 5 3 6 5 5 1 4 4 1 5 5 4
1 28 0
*/
2022/1/17 11:44
加载中...